1. 程式人生 > >連結串列 進棧出棧遍歷清空

連結串列 進棧出棧遍歷清空

#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 ;
}