連結串列 進棧出棧遍歷清空
阿新 • • 發佈:2019-01-22
#include <stdio.h> #include <stdlib.h> #include <malloc.h> // 定義一個節點的結構 typedef struct node { int member; //資料域 struct node * pNext;//指標域 }Node,*pNode; // 定義一個棧結構 typedef struct stack { pNode Top; //棧頂 pNode Bottom; //棧底 }Stack,* pStack; void InitStack(pStack ); // 初始化棧的函式 bool Push(pStack ,int); // 進行壓棧操作的函式 void TraverseStack(pStack ); // 遍歷棧函式 bool Empty(pStack ); // 判斷棧是否為空的函式 int Pop(pStack ); // 進行出棧操作的函式 void Clear(pStack ); // 清空棧的函式 int main(void) { Stack s; // 定義一個棧 int i; int num; int data; // 臨時儲存使用者輸入的資料 int re_num; // 儲存Pop函式的返回值 InitStack(&s); printf("你想輸入幾個資料啊:"); scanf("%d",&num); for (i = 0;i < num;i++) { printf("第 %d 個數:",i+1); scanf("%d",&data); if (Push(&s,data)) // 呼叫Push函式 { continue; } else { printf("進行進棧操作失敗!\n"); exit(-1); } } TraverseStack(&s); // 呼叫遍歷函式 printf("你想去掉幾個數啊: "); scanf("%d",&data); printf("你去掉的數字是:"); for (i = 0; i < data;i++) { re_num = Pop(&s); // 呼叫Pop函式,並把返回值賦給re_num; printf("%d ",re_num); } printf("看看刪除後還有啥:"); TraverseStack(&s); printf("\n"); Clear(&s); // 呼叫清空棧函式 printf("遍歷下看看棧清空沒····\n"); TraverseStack(&s); printf("\n"); return 0; } // 進行棧的初始化的函式 void InitStack(pStack ps) { ps->Top = (pNode)malloc(sizeof(Node)); // 分配記憶體空間給棧頂 if (NULL == ps->Top) { printf("動態分配記憶體失敗\n"); exit(-1); } else { ps->Bottom = ps->Top; // 使棧底也指向棧頂空間 ps->Top->pNext = NULL; // 棧頂指標置為NULL; } return ; } // 進行進棧操作的函式 bool Push(pStack ps,int data) { pNode pNew = (pNode)malloc(sizeof(Node)); // 定義一個新節點,並分配記憶體空間 if (NULL == pNew) { return false; } pNew->member = data; // 把要進棧的資料賦給新節點的member成員 pNew->pNext = ps->Top; // 使新節點的指標指向棧頂 ps->Top = pNew; // 把新節點作為新棧頂 return true; } // 遍歷棧的函式 void TraverseStack(pStack ps) { pNode pNew = ps->Top; while(pNew!= ps->Bottom) // 只要棧頂不等於棧底,迴圈 { printf("%d ",pNew->member); // 列印棧頂的成員member pNew = pNew->pNext; // 棧頂指標向下移動一次 } return ; } // 判斷棧是否為空 bool Empty(pStack ps) { if(ps->Top == ps->Bottom) // 棧頂等於棧底,不就是棧中沒資料麼 { return true; } else { return false; } } // 進行出棧操作函式 int Pop(pStack ps) { pNode pSwap = NULL; int return_val; if (Empty(ps)) //判斷棧是否為空,為空就不能進行出棧操作 { exit(-1); } else { return_val = ps->Top->member; // 把棧頂的成員member的值賦給return_val做為函式返回值 pSwap = ps->Top; // 使pSwap指向棧頂 ps->Top = ps->Top->pNext; // 使棧頂指向棧頂下一個節點 free(pSwap); // 釋放以前的棧頂空間 return return_val; } } // 清空棧的函式 void Clear(pStack ps) { pNode pNew = NULL; while (ps->Top != ps->Bottom) // 棧頂和棧底不等,迴圈 { pNew = ps->Top; // 使一個新節點和棧頂指向同一空間 ps->Top = ps->Top->pNext; // 使棧頂指向棧頂的下一個節點 free(pNew); // 釋放掉以前的棧頂空間 } return ; }