#include<stdio.h> #include<malloc.h> #include<windows.h> #include<stdbool.h> #define SIZE 5 //定義默認陣列長度 #define len sizeof(struct stacknode) //結構體stacknode的長度,即要申請空間的長度 int sourceData[SIZE] = { 11,22,33,44,55 }; //內部資料陣列,節省每次建立時輸入時間 enum returninfo { success, fail, underflow, range_error }; //定義回傳資訊清單 int stackLength; //鏈堆疊中資料個數 bool flag = false; typedef struct stacknode { //用結構體定義鏈表的節點 int data; struct stacknode* next; }NODE,*PNODE; typedef struct pointer { struct stacknode* linkStackTop; struct stacknode* newnodep; struct satcknode* usedNodep; }; struct pointer* sp; //函式宣告 bool isempty(); //判斷堆疊是否為空 enum returninfo display(); //顯示堆疊中所有元素 int getLength(); //獲取堆疊的長度 void processmenu(); //判斷選擇 enum returninfo pop(int* item); //出堆疊,把資料回傳 void showmenu(); //顯示選單 enum returninfo initStack(); //初始化鏈堆疊 enum returninfo create(); //根據內部默認陣列創建一個堆疊 enum returninfo destroy(); //銷毀一個堆疊 enum returninfo push(int item); //將資料進堆疊 enum returninfo poponly(); //出堆疊,不回傳數值,并且釋放房前元素的空間 enum returninfo gettop(int* item); //得到堆疊頂元素 void clearscreen(); //清屏 /*------------------------------------ 函式名:clearscreen() 描 述:清屏 入口引數:無 出口引數:無 --------------------------------------*/ void clearscreen() { system("cls"); } /*------------------------------------ 函式名:showmenu() 描 述:顯示選單 入口引數:無 出口引數:無 --------------------------------------*/ void showmenu() { puts("============================================= "); puts("堆疊的簡單操作 "); puts("============================================= "); puts(" ★功能選單★ "); puts("============================================= "); puts("1.初始化一個堆疊 "); puts("2.按照內部陣列創建默認鏈堆疊 "); puts("3.銷毀一個堆疊 "); puts("4.出堆疊并且回傳原堆疊頂的值 "); puts("5.取出當前堆疊頂元素 "); puts("6.遍歷堆疊中所有資料 "); puts("7.資料進堆疊 "); puts("8.獲取堆疊的長度 "); puts("0.結束程式 "); puts("============================================= "); printf("請輸入您的選擇:"); } /*------------------------------------ 函式名:initStack() 描 述:初始化一個堆疊 入口引數:無 出口引數:enum returninfo型別判斷是否成功 --------------------------------------*/ enum returninfo initStack() { sp = (struct pointer*)malloc(sizeof(struct pointer)); sp->linkStackTop = (PNODE)malloc(len); if (sp->linkStackTop == NULL) { return fail; } sp->linkStackTop->next = NULL; stackLength = 0; return success; } /*------------------------------------ 函式名:create() 描 述:創建一個鏈堆疊 入口引數:無 出口引數:enum returninfo型別判斷是否成功 --------------------------------------*/ enum returninfo create() { int i; for (i = 0; i < SIZE; i++) { sp->newnodep = (PNODE)malloc(len); if (sp->newnodep == NULL) { return fail; } sp->newnodep->data =https://www.cnblogs.com/WineinSeptember/p/ sourceData[i]; sp->newnodep->next = sp->linkStackTop->next; sp->linkStackTop->next = sp->newnodep; stackLength++; } return success; } /*------------------------------------ 函式名:destroy() 描 述:銷毀一個鏈堆疊 入口引數:無 出口引數:enum returninfo型別判斷是否成功 --------------------------------------*/ enum returninfo destroy() { if (poponly() == underflow) { return underflow; } while (poponly() == success); return success; } /*------------------------------------ 函式名:poponly() 描 述:出堆疊但不回傳資料 入口引數:無 出口引數:enum returninfo型別判斷是否成功 --------------------------------------*/ enum returninfo poponly(){ if (isempty() == false) { sp->usedNodep = sp->linkStackTop->next; sp->linkStackTop->next = sp->linkStackTop->next->next; free(sp->usedNodep); stackLength--; return success; } return underflow; } /*------------------------------------ 函式名:isempty() 描 述:判斷堆疊是否為空 入口引數:無 出口引數:回傳堆疊是否為空的資訊 --------------------------------------*/ bool isempty() { if (stackLength == 0) { return true; } else { return false; } } /*------------------------------------ 函式名:pop() 描 述:出堆疊回傳資料 入口引數:通過參考的到堆疊頂的值 出口引數:enum returninfo型別判斷是否成功 --------------------------------------*/ enum returninfo pop(int* item) { if (isempty()) { return underflow; } *item = sp->linkStackTop->next->data; sp->usedNodep = sp->linkStackTop->next; sp->linkStackTop->next = sp->linkStackTop->next->next; free(sp->usedNodep); stackLength--; return success; } /*------------------------------------ 函式名:gettop() 描 述:回傳資料 入口引數:通過參考的到堆疊頂的值 出口引數:enum returninfo型別判斷是否成功 --------------------------------------*/ enum returninfo gettop(int* item) { if (isempty()) { return underflow; } *item = sp->linkStackTop->next->data; return success; } /*------------------------------------ 函式名:getdisplay() 描 述:遍歷堆疊中元素 入口引數:通過參考的到堆疊的所有資料 出口引數:enum returninfo型別判斷是否成功 --------------------------------------*/ enum returninfo display() { PNODE searchp = sp->linkStackTop->next; if (isempty()) { return underflow; } printf("目前堆疊中的內容是:堆疊頂-->"); while (searchp) { printf("%d ",searchp->data); searchp = searchp->next; } printf("堆疊底\n"); return success; } /*------------------------------------ 函式名:push() 描 述:資料進堆疊 入口引數:要進堆疊的元素數值 出口引數:enum returninfo型別判斷是否成功 --------------------------------------*/ enum returninfo push(int item) { sp->newnodep = (PNODE)malloc(len); if (sp->newnodep == NULL) { return fail; } sp->newnodep->data =https://www.cnblogs.com/WineinSeptember/p/ item; sp->newnodep->next = sp->linkStackTop->next; sp->linkStackTop->next = sp->newnodep; stackLength++; return success; } /*------------------------------------ 函式名:getLength() 描 述:得到堆疊的長度 入口引數:無 出口引數:int型表示堆疊的長度 --------------------------------------*/ int getLength() { return stackLength; } /*------------------------------------ 函式名:processmenu() 描 述:判斷選擇,完成功能 入口引數:struct pointer* 型別 出口引數:無 --------------------------------------*/ void processmenu() { int menuchoice; int num1; int returnvalue; scanf("%d", &menuchoice); switch (menuchoice) { case 1: returnvalue = initStack(); if (returnvalue =https://www.cnblogs.com/WineinSeptember/p/= fail) { printf("鏈堆疊初始化失敗!\n"); } else { printf("鏈堆疊初始化成功!\n"); } break; case 2: returnvalue = create(); if (returnvalue =https://www.cnblogs.com/WineinSeptember/p/= fail) { printf("記憶體分配失敗,創建失敗!\n"); } else { printf("鏈堆疊創建成功!\n"); } break; case 3: returnvalue = destroy(); if (returnvalue =https://www.cnblogs.com/WineinSeptember/p/= underflow) { printf("堆疊為空!\n"); } else { printf("堆疊銷毀成功!\n"); } break; case 4: returnvalue = pop(&num1); if (returnvalue =https://www.cnblogs.com/WineinSeptember/p/= underflow) { printf("鏈堆疊為空!\n"); } else { printf("出堆疊成功,堆疊頂值為%d\n",num1); } break; case 5: returnvalue = gettop(&num1); if (returnvalue =https://www.cnblogs.com/WineinSeptember/p/= underflow) { printf("堆疊鏈為空!\n"); } else { printf("取出堆疊頂元素為%d\n",num1); } break; case 6: returnvalue = display(); if (returnvalue =https://www.cnblogs.com/WineinSeptember/p/= underflow) { printf("鏈表為空!\n"); } break; case 7: printf("請輸入您要入堆疊的元素值: "); scanf("%d",&num1); returnvalue = push(num1); if (returnvalue =https://www.cnblogs.com/WineinSeptember/p/= fail) { printf("分配記憶體失敗!\n"); } else { printf("資料入堆疊成功!"); } break; case 8: num1 = getLength(); printf("堆疊的長度為%d\n",num1); break; case 0: exit(0); default : puts("對不起,您輸入的功能編號有錯!請重新輸入!!!"); break; } } //主函式 int main() { SetConsoleTitle("堆疊元素的簡單操作"); system("color f0"); //設定背景為白色,字體為黑色 clearscreen(); while (true) { showmenu(); //顯示選單 processmenu(); //處理選單視窗,出口就在其中 system("pause"); //暫停一下,等用戶給一個回車 clearscreen(); } return 0; }
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/55362.html
標籤:其他
上一篇:資料結構(C語言版)---串
