資料結構代碼及解析-----棧

來源:互聯網
上載者:User

標籤:

  1 #include <stdio.h>  2 #include <stdlib.h>  3 #include <malloc.h>  4   5 typedef struct Node//定義結點  6 {  7     int data;  8     struct Node *pNext;  9 }NODE, *PNODE; 10  11 typedef struct Stack//定義棧,棧相當於一個箱子;共有2個結點,一個表示箱頂一個表示箱底 12 { 13     PNODE pTop;//箱頂 14     PNODE pBottom;//箱底 15 }STACK, *PSTACK; 16  17 void init(PSTACK pS) 18 { 19     pS->pTop = (PNODE)malloc(sizeof(NODE));//先造出一個空棧 20     if (NULL == pS->pTop) 21     { 22         printf("動態記憶體分配失敗!\n"); 23         exit(-1); 24     } 25     else 26     { 27         pS->pBottom = pS->pTop; 28         pS->pBottom->pNext = NULL;//或使用pS->pTop->pNext = NULL 29         //因為他們剛開始指向同一個地方---箱底,只要箱底的指標域為空白就行了 30     } 31 } 32  33 void push(PSTACK pS, int val) 34 { 35     PNODE pNew = (PNODE)malloc(sizeof(NODE));//建立一個新的結點放到棧裡 36     if (NULL == pNew) 37     { 38         printf("動態記憶體分配失敗!\n"); 39         exit(-1); 40     } 41  42     pNew->data = val; 43     pNew->pNext = pS->pTop; 44     pS->pTop = pNew; 45  46     return; 47 } 48  49 void traverse(PSTACK pS)//遍曆輸出 50 { 51     PNODE p = pS->pTop;//注意一定要用p臨時存放箱頂的結點指標,不然結束後箱頂的結點指標就變了---會影響其他的函數執行 52      53     while (p != pS->pBottom)//當p == pS->pBottom時結束, 此時p已經變成了pS->pBottom箱底 54     { 55         printf("%d  ", p->data); 56         p = p->pNext; 57     } 58     putchar(10); 59  60     return; 61 } 62  63 bool empty(PSTACK pS) 64 { 65     if (pS->pTop == pS->pBottom) 66     { 67         return true; 68     } 69     else 70         return false; 71 } 72 //把pS所指向的棧出棧一次,並把出棧的元素存入pVal所指向的變數 73 bool pop(PSTACK pS, int *pVal) 74 { 75     if (empty(pS)) 76     { 77         return false; 78     } 79     else 80     { 81         PNODE r = pS->pTop; 82         *pVal = r->data; 83         pS->pTop = r->pNext; 84          85         free(r); 86         r = NULL; 87     } 88  89     return true; 90 } 91  92  93 void clear(PSTACK pS)//清空--釋放記憶體 94 { 95     if (empty(pS)) 96         return; 97     else 98     { 99         PNODE p = pS->pTop;100         PNODE q = NULL;101 102         while (p != pS->pBottom)103         {104             q = p->pNext;105             free(p);106             p = q;//結束時p(pS->pTop)已經指向了pS->pBottom箱底,但pS->pTop的內容並不是空結點的107         }108 109         pS->pTop = pS->pBottom;//所以在清空的時候, 要將pS->pTop的資料域也為空白110     }111 }112 113 int main(void)114 {115     int val;116     STACK S;117     init(&S);118     119     push(&S, 1);120     push(&S, 2);121     push(&S, 3);122     push(&S, 4);123     push(&S, 5);124     traverse(&S);125 126     pop(&S, &val);//只出棧一次127     printf("你出棧的結點的資料域儲存的數是:%d\n", val);128     traverse(&S);129 130     clear(&S);131     traverse(&S);//沒有的話會空一行132 133     return 0;134 }

 

資料結構代碼及解析-----棧

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.