热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

栈(stack)--c实现(使用双链表)

是不是直接贴代码不太好,我竟然不知道说什么。写这个考虑的问题,或者是纠结的问题是这个头指针怎么处理,也就是栈的顶部,最后采用的是初始化第一个栈空间浪费掉,栈顶是有元素的。好像应该去学习下画图,没图不

是不是直接贴代码不太好,我竟然不知道说什么。

写这个考虑的问题,或者是纠结的问题是这个头指针怎么处理,也就是栈的顶部,最后采用的是初始化第一个栈空间浪费掉,栈顶是有元素的。好像应该去学习下画图,没图不太好说。

写数据结构栈的时候发现自己的2个地方需要进一步补习,用的时候心中没谱---指针和内存分配,看来我还是太水,代码里有3个warning没改出来。

  1 #include 
2
3
4 typedef struct node
5 {
6 int data;
7 struct node* next;
8 struct node* pre;
9 }Node;
10
11 //Stack 一直指向栈顶
12 typedef Node* Stack;
13
14 void InitStack(Stack* stack);
15 void DeleteStack(Stack* stack);
16 int TopStack(Stack*);
17 void PushStack(Stack* stack, int elem);
18 int PopStack(Stack *stack);
19 int IsNull(Stack*);
20 void PrintStack(Stack *);
21
22 void PrintStack(Stack *stack)
23 {
24 Node* preNode = *stack;
25 while((preNode->pre != NULL)
26 &&preNode)
27 {
28 printf("%d", preNode->data);
29 preNode = preNode->pre;
30 if(preNode->pre != NULL){
31 printf("<==");
32 }
33 }
34 printf("\n");
35
36 }
37 //1 means NULL
38 //stack-->node-->datamem
39 //这个地方第一次写传的是Stack stack,为什么报错?因为穿的是值,就是一个copy,pre不能确定一定是NULL
40 int IsNull(Stack *stack)
41 {
42 return ((*stack)->pre == NULL);
43 }
44
45 int PopStack(Stack *stack)
46 {
47 if(IsNull(stack))
48 {
49 printf("empty stack.\n");
50 return -1;
51 }
52 int popData = -1;
53 popData = (*stack)->data;
54 Node* popNode = NULL ;
55 popNode = *stack;
56 *stack = (*stack)->pre;
57 (*stack)->pre = popNode->pre->pre;
58 (*stack)->next = NULL;
59
60 popNode->pre->pre->next = (*stack);
61
62 free(popNode);//warning
63
64 return popData;
65 }
66 void InitStack(Stack* stack)
67 {
68 (*stack)->next = NULL;
69 (*stack)->pre = NULL;
70 (*stack)->data = -1;
71 return ;
72 }
73
74 int TopStack(Stack *stack)
75 {
76 return (*stack)->data;
77 }
78
79 void PushStack(Stack *stack, int elem)
80 {
81 //Node *pushNode = (Node*)malloc(sizeof(Node));
82 Node *pushNode = (Node*) malloc(sizeof(Node));//warning
83 if(pushNode == NULL)
84 {
85 printf("malloc error at line %d.", __LINE__);
86 return;
87 }
88
89 pushNode->data = elem;
90 pushNode->next = NULL;
91 pushNode->pre = *stack;
92 (*stack)->next = pushNode;
93 *stack = (*stack)->next;
94
95 }
96
97 void DeleteStack(Stack* stack)
98 {
99
100 Node* preNode = stack;
101 while((*stack)->pre != NULL)
102 {
103 PopStack(stack);
104
105 }
106 free(*stack);
107
108 return ;
109 }
110
111
112 int main(void)
113 {
114 printf("Hello World!\n");
115 Stack *stack =NULL;
116 stack = (Stack*)malloc(sizeof(stack));//warning
117 *stack = (Node*)malloc(sizeof(Node));
118 InitStack(stack);
119 IsNull(stack);
120 printf("isNull=[%d]\n", IsNull(stack));
121 printf("the top ele is [%d]\n", (*stack)->data);
122 printf("push elem 1, 2, 3, 4, 3\n");
123 PushStack(stack, 1);
124 PrintStack(stack);
125 PushStack(stack, 2);
126 PushStack(stack, 3);
127 PushStack(stack, 4);
128 PushStack(stack, 3);
129 printf("print the curr stack.\n");
130 PrintStack(stack);
131 printf("Pop the stack and print the curr stack.\n");
132 PopStack(stack);
133 PrintStack(stack);
134
135 printf("the top elem is %d\n", TopStack(stack));
136
137
138 return 0;
139 }

是不是也把运行结果贴上去??

QT运行的,懒得去开虚拟机在linux跑,太费事,还要改MAKEFILE.

运行结果:/*******************begin

Hello World!
isNull=[1]
the top ele is [-1]
push elem  1, 2, 3, 4, 3
1
print the curr stack.
3<==4<==3<==2<==1
Pop the stack and print the curr stack.
4<==3<==2<==1
the top elem is 4

 

 

************end*******/

下一篇写队列吧,想了下定义头尾指针好像会好用点。


推荐阅读
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 如何在跨函数中使用内存?
    本文介绍了在跨函数中使用内存的方法,包括使用指针变量、动态分配内存和静态分配内存的区别。通过示例代码说明了如何正确地在不同函数中使用内存,并提醒程序员在使用动态分配内存时要手动释放内存,以防止内存泄漏。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • 本文为Codeforces 1294A题目的解析,主要讨论了Collecting Coins整除+不整除问题。文章详细介绍了题目的背景和要求,并给出了解题思路和代码实现。同时提供了在线测评地址和相关参考链接。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
author-avatar
annieduoduo
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有