热门标签 | 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*******/

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


推荐阅读
  • 探讨如何在C++中,当子类实例存储在父类类型的向量中时,正确访问子类特有的成员变量或方法。 ... [详细]
  • 本文探讨了如何利用伸展树(Splay Tree)来高效地处理区间操作,包括区间修改、查询和删除等。通过引入size域,伸展树能够灵活应对序列结构的变化。 ... [详细]
  • Qt应用开发:创建基本窗口
    本文介绍如何使用Qt框架创建基础窗口的两种方法。第一种方法直接在main函数中创建并显示窗口;第二种方法通过定义一个继承自QWidget的类来实现更复杂的功能。 ... [详细]
  • 本文介绍了一种算法,用于在一个给定的二叉树中找到一个节点,该节点的子树包含最大数量的值小于该节点的节点。如果存在多个符合条件的节点,可以选择任意一个。 ... [详细]
  • C基本语法C程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互。现在让我们简要地看一下什么是类、对象,方法、即时变量。对象-对象具有状态和行为 ... [详细]
  • 题目描述:给定 n 把雨伞和 m 个人,t 分钟后开始下雨。求在每个人只能使用一把雨伞的情况下,最多有多少人可以拿到雨伞。 ... [详细]
  • 本文探讨了BZOJ4029 [HEOI2015] 定价问题,通过使用贪心算法解决该问题。文章提供了详细的题目解析和代码实现,重点在于如何通过计算十进制下的最低有效位(lowbit)来简化问题。 ... [详细]
  • PyQt5多线程UI更新示例及解析
    本文通过具体的代码示例,详细介绍了如何在PyQt5中利用多线程技术更新用户界面,避免因长时间操作导致的界面卡顿问题。该示例不仅有助于理解多线程机制,还为实际项目中的界面流畅性提供了有效解决方案。 ... [详细]
  • 题目大意:给你一棵树,根节点为1有2种操作,第一种是给u节点所在的子树的所有节点的权值x第二种是询问,假设v是子树u中的节点 ... [详细]
  • 本文介绍如何使用Java实现AC自动机(Aho-Corasick算法),以实现高效的多模式字符串匹配。文章涵盖了Trie树和KMP算法的基础知识,并提供了一个详细的代码示例,包括构建Trie树、设置失败指针以及执行搜索的过程。 ... [详细]
  • 【Java数据结构和算法】008栈
    目录0、警醒自己一、栈的应用场景和介绍1、栈的应用场景一个实际的场景:我的思考:2、栈的介绍入栈演示图:出栈演示图 ... [详细]
  • 3144:[Hnoi2013]切糕TimeLimit:10SecMemoryLimit:128MBSubmit:1261Solved:700[Submit][St ... [详细]
  • 本文探讨了Codeforces 580C题目——Kefa与公园的问题,深入分析了如何在给定条件下帮助Kefa找到合适的餐厅。 ... [详细]
  • HDU1085 捕获本·拉登!
    问题描述众所周知,本·拉登是一位臭名昭著的恐怖分子,他已失踪多年。但最近有报道称,他藏匿在中国杭州!虽然他躲在杭州的一个洞穴中不敢外出,但近年来他因无聊而沉迷于数学问题,并声称如果有人能解出他的题目,他就自首。 ... [详细]
  • 本题主要涉及输入数据的有效性验证,通过使用 C 语言中的 sscanf 和 sprintf 函数来实现数据的解析和格式化。 ... [详细]
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社区 版权所有