链栈的基本操作-完整代码和拆开分析

 1 #include <stdio.h>     //增+删+取栈顶+初始化+判空+输出+销毁
 2 #include <stdlib.h>
 3 #include <malloc.h> 
 4 typedef int DataType;
 5 typedef struct Node {
 6     DataType  data;
 7     struct Node *next;
 8 }Node;
 9 
10 Node * InitStack(Node*top);
11 Node * Push(Node * top,DataType x);
12 Node * GetTop(Node*top,DataType *ptr);
13 Node * Pop(Node * top,DataType * ptr);
14 void DestoryStack(Node * top);
15 int Empty(Node * top);
16 
17 int main(){
18     DataType x;
19     Node * top = InitStack(top);
20     printf("对15和10执行入栈操作:
");
21     top = Push(top,15);
22     top = Push(top,10);
23     top = GetTop(top,&x); 
24     printf("当前栈顶元素为:%d
",x);
25     top = Pop(top,&x);
26     printf("执行一次出栈操作,删除元素:%d
",x);
27     top =GetTop(top,&x);
28     printf("当前栈顶元素为:%d
",x);
29     printf("请输入待入栈元素:");
30     scanf("%d",&x);
31     Push(top,x);
32     if(Empty(top)==1)
33         printf("栈为空
");
34     else
35         printf("栈非空
");
36     DestoryStack(top);
37     return 0;
38 }
39 //初始化 
40 Node * InitStack(Node*top){
41     top=NULL;      //栈顶置为空 
42     printf("初始化成功!
"); 
43     return top; 
44 }
45 //入栈 
46 Node * Push(Node * top,DataType x){
47     Node * s = (Node *)malloc(sizeof(Node));  //malloc申请第一个结点,赋给指向该结点的栈顶指针------- * s 
48     s -> data = x;  //为节点的data属性赋值 
49     s -> next = top;  //为节点的next指向前一个节点 
50     top = s; //栈顶指针指向新节点 
51     printf("%d入栈成功!
",x);
52     return top;
53 }
54 Node * GetTop(Node*top,DataType *ptr){
55     if(top==NULL){            //判断是否是空栈-----栈顶是否为空 
56         printf("下溢错误,取栈顶失败
");
57         return 0;
58     }
59     *ptr = top->data;       //将栈顶Top的data域赋值给*ptr(指针参数*ptr的值会传回主函数)
60     return top;
61 }
62 //销毁 
63 void DestoryStack(Node * top){
64     Node * p = top; //声明一个指向待删除节点的指针 ------ * p (防止丢失,后面要手动释放) 
65     while(top!=NULL){  //只要栈顶不为null就循环 
66         top = top -> next; //循环下移栈顶Top 
67         free(p); //释放p 
68         p = top;  //重复使用指针 * p 进行下一轮循环删除,直至栈顶Top为空 
69     }
70 }
71 //弹栈 
72 Node * Pop(Node * top,DataType * ptr){
73     Node * p = top ;  //声明一个指向待删除节点的指针 ------ * p (防止丢失,后面要手动释放) 
74     if(top==NULL){    //判断是否为空栈 
75         printf("下溢错误,删除失败
");
76         return 0;
77     }
78     * ptr = top->data;  //将待删除节点的data值赋给 * ptr 供给主函数 
79     top = top->next;  //栈顶Top向栈底移动一位 
80     free(p);            //手动释放待删除节点 
81     return top;
82 }
83 //判空 
84 int Empty(Node * top){
85     if(top==NULL)  //栈顶Top是否为null 
86         return 1;
87     else
88         return 0;
89 }

分析都在注释里啦~就不分块说啦~反而觉得注释还可以更好的对应代码,比之前得笔记好一些呢

原文地址:https://www.cnblogs.com/wy0526/p/11798018.html