鏈棧的基本操作-完整代碼和拆開分析


 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執行入棧操作:\n");
21     top = Push(top,15);
22     top = Push(top,10);
23     top = GetTop(top,&x); 
24     printf("當前棧頂元素為:%d\n",x);
25     top = Pop(top,&x);
26     printf("執行一次出棧操作,刪除元素:%d\n",x);
27     top =GetTop(top,&x);
28     printf("當前棧頂元素為:%d\n",x);
29     printf("請輸入待入棧元素:");
30     scanf("%d",&x);
31     Push(top,x);
32     if(Empty(top)==1)
33         printf("棧為空\n");
34     else
35         printf("棧非空\n");
36     DestoryStack(top);
37     return 0;
38 }
39 //初始化 
40 Node * InitStack(Node*top){
41     top=NULL;      //棧頂置為空 
42     printf("初始化成功!\n"); 
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入棧成功!\n",x);
52     return top;
53 }
54 Node * GetTop(Node*top,DataType *ptr){
55     if(top==NULL){            //判斷是否是空棧-----棧頂是否為空 
56         printf("下溢錯誤,取棧頂失敗\n");
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("下溢錯誤,刪除失敗\n");
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 }

分析都在注釋里啦~就不分塊說啦~反而覺得注釋還可以更好的對應代碼,比之前得筆記好一些呢


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM