數據結構----棧的鏈式存儲結構源碼

數據結構----棧的鏈式存儲結構源碼

在這裏插入圖片描述

//  棧是僅限定在表尾進行插入和刪除的操作的表;下面以棧的鏈式儲存結構爲例。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct StackNode{
    int data;
    struct stacknode *next;
}stacknode,*linkstackptr;

typedef struct LinkStack{
    linkstackptr top;
    int cnt;
}linkstack;

int Initstack(linkstack *s)
{
    s->top=(linkstackptr)malloc(sizeof(stacknode));
    if(!(s->top))
    return -1;
    s->top=NULL;
    s->cnt=0;
    return 1;
}

int push(linkstack *s,int val)
{
    linkstackptr p=(linkstackptr)malloc(sizeof(stacknode));
    if(!p)
    return -1;
    p->data=val;
    p->next=s->top;
    s->top=p;
    s->cnt++;
    return 1;
}

int length(linkstack *s)
{
    if(s->cnt==0)
    return 0;
    else
    return s->cnt;
}
int pop(linkstack *s)
{
    linkstackptr p;
    if(length(s)==0)
    return -1;
    p=s->top;
    s->top=s->top->next;
    free(p);
    s->cnt--;
    return 1;
}

int get(linkstack *s)
{
    if(length(s)==0)
    return -1;
    return s->top->data;
}

int clear(linkstack *s)
{
    linkstackptr q,p=s->top;
    while(p)
    {
        q=p;
        p=p->next;
        free(q);
    }
    s->cnt=0;
    return 1;
}

int show(linkstack *s)
{
    if(s->cnt==0)
    return -1;
    linkstackptr p=s->top;
    while(p)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}

int main()
{
	int k;
    linkstack L;
    k=Initstack(&L);
    if(k==-1)
    {
        printf("內存分配失敗,棧的鏈式儲存初始化失敗\n");
        return 0;
    }
    else
    {
        printf("恭喜你!內存分配成功,棧的鏈式儲存初始化成功!棧中元素爲零!\n");
    }
    printf("請輸入一些元素,用以入棧!以輸入-1代表結束:\n");
    int n;
    while(~scanf("%d",&n))
    {
        if(n==-1)
        break;
        push(&L,n);
    }
    printf("壓棧成功!棧頂到棧底元素爲:\n");
    show(&L);
    char s[50];
    printf("輸入你想要進行的操作(輸入end代表結束):push,length,pop,get,clear,show\n");
    memset(s,'\0',sizeof(s));
    while(~scanf("%s",s))
    {
        if(!strcmp(s,"end"))
        break;
        if(!strcmp(s,"push"))
        {
            int flag,tmp;
            printf("請輸入你要壓入棧頂的元素:");
            scanf("%d",&flag);
            tmp=push(&L,flag);
            if(flag==-1)
            printf("動態內存分配失敗!壓棧失敗!\n");
            else
            {
                printf("動態內存分配成功!壓棧成功!\n棧頂到棧底元素爲:");
                show(&L);
            }
        }
        if(!strcmp(s,"length"))
        {
            int tmp;
            tmp=length(&L);
            printf("棧中元素個數爲:%d\n",tmp);
        }
        if(!strcmp(s,"pop"))
        {
            int flag;
            flag=pop(&L);
            if(flag==-1)
            printf("棧中元素個數爲零,出棧失敗!\n");
            else
            {
                printf("恭喜你!出棧成功!\n棧頂到棧底的元素爲:");
                show(&L);
            }
        }
        if(!strcmp(s,"get"))
        {
            int flag;
            flag=get(&L);
            if(flag==-1)
            printf("棧中元素個數爲零,獲取棧頂元素失敗!\n");
            else
            {
                printf("恭喜你!獲取成功,棧頂元素爲:%d\n",flag);
            }
        }
        if(!strcmp(s,"clear"))
        {
            int flag,tmp;
            flag=clear(&L);
            if(flag==1)
            {
                tmp=length(&L);
                printf("恭喜你!清理成功,棧中元素爲:%d\n",tmp);
                printf("程序結束!\n");
                break;
            }
        }
        if(!strcmp(s,"show"))
        {
            int flag,tmp;
            flag=length(&L);
            if(flag==0)
            printf("棧中元素個數爲零!展示失敗!\n");
            else
            {
                printf("恭喜你!展示成功,棧頂到棧底元素爲:\n");
                tmp=show(&L);
            }
        }
        memset(s,'\0',sizeof(s));
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章