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

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


推荐阅读
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本题涉及一棵由N个节点组成的树(共有N-1条边),初始时所有节点均为白色。题目要求处理两种操作:一是改变某个节点的颜色(从白变黑或从黑变白);二是查询从根节点到指定节点路径上的第一个黑色节点,若无则输出-1。 ... [详细]
  • Linux设备驱动程序:异步时间操作与调度机制
    本文介绍了Linux内核中的几种异步延迟操作方法,包括内核定时器、tasklet机制和工作队列。这些机制允许在未来的某个时间点执行任务,而无需阻塞当前线程,从而提高系统的响应性和效率。 ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 火星商店问题:线段树分治与持久化Trie树的应用
    本题涉及编号为1至n的火星商店,每个商店有一个永久商品价值v。操作包括每天在指定商店增加一个新商品,以及查询某段时间内某些商店中所有商品(含永久商品)与给定密码值的最大异或结果。通过线段树分治和持久化Trie树来高效解决此问题。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本实验主要探讨了二叉排序树(BST)的基本操作,包括创建、查找和删除节点。通过具体实例和代码实现,详细介绍了如何使用递归和非递归方法进行关键字查找,并展示了删除特定节点后的树结构变化。 ... [详细]
  • 本文详细介绍了C语言中链表的两种动态创建方法——头插法和尾插法,包括具体的实现代码和运行示例。通过这些内容,读者可以更好地理解和掌握链表的基本操作。 ... [详细]
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
  • ImmutableX Poised to Pioneer Web3 Gaming Revolution
    ImmutableX is set to spearhead the evolution of Web3 gaming, with its innovative technologies and strategic partnerships driving significant advancements in the industry. ... [详细]
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社区 版权所有