【420】链表实现Quack
quack.h
// quack.h: an interface definition for a queue/stack
#include <stdio.h>
#include <stdlib.h> typedef struct node *Quack; Quack createQuack(void); // create and return Quack
void push(int, Quack); // put the given integer onto the top of the quack
void qush(int, Quack); // put the given integer onto the bottom of the quack
int pop(Quack); // pop and return the top element on the quack
int isEmptyQuack(Quack); // return 1 is Quack is empty, else 0
void makeEmptyQuack(Quack);// remove all the elements on Quack
void showQuack(Quack); // print the contents of Quack, from the top down
quackLL.c
// quackLL.c: a linked-list-based implementation of a quack
#include "quack.h"
#include <limits.h> // INT_MAX means largest int
// if using this value, you need to include <limits.h>
#define HEAD_DATA INT_MAX // dummy data struct node {
int data;
struct node *next;
}; // create a null head
Quack createQuack(void) {
// Actually this head is NULL, it doesn't store
// meaningful data, only store the address.
Quack head;
head = malloc(sizeof(struct node));
if (head == NULL) {
fprintf(stderr, "Out of memory\n");
exit(1);
} head->data = HEAD_DATA;
head->next = NULL; // return the address of head
return head;
} // push a new node between head and 1st node
void push(int data, Quack qs) {
Quack newnode; // determine whether this quack is NULL or not
if (qs == NULL) {
fprintf(stderr, "push: quack not initialised\n");
}
else {
newnode = malloc(sizeof(struct node));
if (newnode == NULL) {
fprintf(stderr, "push: no memory, aborting\n");
exit(1);
} newnode->data = data;
newnode->next = qs->next;
qs->next = newnode;
}
return;
} // pop the 1st node
int pop(Quack qs) {
// store data in variable retval
int retval = 0; if (qs == NULL) {
fprintf(stderr, "pop: quack not initialised\n");
}
else {
// if qs is empty, you can't pop any nodes
if (isEmptyQuack(qs)) {
fprintf(stderr, "pop: quack underflow\n");
}
else {
Quack pop_node = qs->next;
retval = pop_node->data; // link head with 2nd node
qs->next = qs->next->next;
free(pop_node);
pop_node = NULL;
}
}
return retval;
} // pop all nodes in qs
void makeEmptyQuack(Quack qs) {
if (qs == NULL) {
fprintf(stderr, "makeEmptyQuack: quack not initialised\n");
}
else {
while (!isEmptyQuack) {
pop(qs);
}
}
return;
} // only head, head link to NULL
int isEmptyQuack(Quack qs) {
if (qs == NULL) {
fprintf(stderr, "makeEmptyQuack: quack not initialised\n");
}
else {
if (qs->next == NULL) {
return 1;
}
}
return 0;
} // print all nodes
void showQuack(Quack qs) {
if (qs == NULL) {
fprintf(stderr, "makeEmptyQuack: quack not initialised\n");
}
else {
// ??? maybe head is corrupted by opertions
if (qs->data != HEAD_DATA) {
fprintf(stderr, "showQuack: linked list head corrupted\n");
}
else {
printf("Quack: ");
if (qs->next == NULL) {
printf("<< >>\n");
}
else {
printf("<<");
Quack node = qs->next;
while (node->next != NULL) {
printf("%d ", node->data);
node = node->next;
}
printf("%d ", node->data);
printf(">>\n");
}
}
}
return;
}
clientQuack.c
#include "quack.h"
int main() {
	Quack qs = createQuack();
	push(1, qs);
	showQuack(qs);
	push(2, qs);
	showQuack(qs);
	push(3, qs);
	showQuack(qs);
	push(4, qs);
	showQuack(qs);
	pop(qs);
	showQuack(qs);
	pop(qs);
	showQuack(qs);
	pop(qs);
	showQuack(qs);
	pop(qs);
	showQuack(qs);
}
运行下面命令实现编译
alex@ubuntu:Day01$ gcc quackLL.c clientQuack.c && ./a.out
Quack: <<1 >>
Quack: <<2 1 >>
Quack: <<3 2 1 >>
Quack: <<4 3 2 1 >>
Quack: <<3 2 1 >>
Quack: <<2 1 >>
Quack: <<1 >>
Quack: << >>
【420】链表实现Quack的更多相关文章
- linux内核链表的实现
		.\linux-2.6.22.6_vscode\include\linux\list.h #ifndef _LINUX_LIST_H#define _LINUX_LIST_H #ifdef __KER ... 
- c语言实现链表增、删、改、查及文件读写  && 链表实现程序
		一.链表实现增删改查 1.链表定义 1 #include<stdio.h> 2 #include<string.h> 3 #include<windows.h> 4 ... 
- 皓远的第二次博客作业(最新pta集,链表练习及期中考试总结)
		前言: 知识点运用:正则表达式,有关图形设计计算的表达式和算法,链表的相关知识,Java类的基础运用,继承.容器与多态. 题量:相较于上次作业,这几周在java方面的练习花了更多的精力和时间,所要完成 ... 
- Redis链表实现
		链表在 Redis 中的应用非常广泛, 比如列表键的底层实现之一就是链表: 当一个列表键包含了数量比较多的元素, 又或者列表中包含的元素都是比较长的字符串时, Redis 就会使用链表作为列表键的底层 ... 
- [数据结构]——链表(list)、队列(queue)和栈(stack)
		在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ... 
- 排序算法----基数排序(RadixSort(L))单链表智能版本
		转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ... 
- 防御性编程习惯:求出链表中倒数第 m 个结点的值及其思想的总结
		防御性编程习惯 程序员在编写代码的时候,预料有可能出现问题的地方或者点,然后为这些隐患提前制定预防方案或者措施,比如数据库发生异常之后的回滚,打开某些资源之前,判断图片是否存在,网络断开之后的重连次数 ... 
- 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法
		有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ... 
- C语言之链表list
		#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h& ... 
随机推荐
- k8s的高可用
			一.高可用原理 配置一台新的master节点,然后在每台node节点上安装nginx,nginx通过内部的负载均衡将node节点上需要通过访问master,kube-apiserver组件的请求, ... 
- PHP启动php-fpm成功,但php-cgi进程查找不到 502 getaway
			一般情况大家刚把lnmp环境安装好之后,把nginx中 fastcgi_pass unix:/tmp/php-cgi.sock项修改成 fastcgi_pass 127.0.0.1:9000之后,网页 ... 
- Java位运算总结:位运算用途广泛
			前天几天研究了下JDK的Collection接口,本来准备接着研究Map接口,可是一查看HashMap类源码傻眼咯,到处是位运算实现,所以我觉得还是有必要先补补位运算知识,不然代码看起来有点费力.今天 ... 
- 使用jQuery快速高效制作网页交互特效----jQuery中的事件与动画
			jQuery中的事件 和WinForm一样,在网页中的交互也是需要事件来实现的,例如tab切换效果,可以通过鼠标单击事件来实现. 事件在元素对象与功能代码中起着重要的桥梁作用. 在JQuery中,事件 ... 
- 什么是webpack模块化构建工具
			百度百科模块化:是指解决一个复杂问题时自顶向下逐层把系统划分成若干模块的过程,有多种属性,分别反映其内部特性. 计算机模块化:一般指的是可以被抽象封装的最小/最优代码集合,模块化解决的是功能耦合问题. ... 
- 几个牛X的js开发技巧
			1. 确保数组值 使用 grid ,需要重新创建原始数据,并且每行的列长度可能不匹配, 为了确保不匹配行之间的长度相等,可以使用Array.fill方法. let array = Array(5).f ... 
- sql server 游标的基本用法
			DECLARE @Id NVARCHAR(MAX) DECLARE @UserName NVARCHAR(MAX) DECLARE @Password NVARCHAR(MAX) DECLARE @N ... 
- 1820:【00NOIP提高组】进制转换
			#include<bits/stdc++.h>//十分简单(滑稽)的一道模拟题 using namespace std; ]={'A','B','C','D','E','F','G','H ... 
- webpack-merge
			配置分离 随着我们业务逻辑的增多,图片.字体.css.ES6以及CSS预处理器和后处理器逐渐的加入到我们的项目中来,进而导致配置文件的增多,使得配置文件书写起来比较繁琐,更严重者(书写特定文件的位置会 ... 
- WPF_AutoCompleteBox智能提示_Xml读写
			效果图 1.需要引用的DLL 2. Window.xaml <Window x:Class="自己的命名空间" xmlns="http://schemas.micr ... 
