数据结构栈的链式存储(c语言描述)

  今天刚一共写了栈的顺序存储,接下来我把栈的链式存储也发一下吧

1.定义结构体

stackNode结构体储存着链表中结点的信息

stackPointer结构体储存着指向链表尾部(即栈顶)的指针和链表的长度

typedef struct stackNode
{
    ElemType data; //储存数据
    struct  stackNode *next ;// 指向下一个结点 
}stackNode,*stackNodePtr;

typedef struct stackPointer
{
    stackNodePtr top; //top指针 ,指向栈顶 
    int count;//储存栈元素的数量 
}stackPointer;

2.初始化声明:链表为空,所以指向链表的指针为null,

void initStack(stackPointer *s)
{
    s->top=NULL; 
    s->count=0;//初始化栈的空间为0 
}

3.入栈操作

首先为入栈的数据申请一个结点,

当链表为空时,指向链表的指针指向这个结点,这的结点指针域为空,链表数量增加

当链表不为空时,这个结点的指针指向当前链表的表尾,自己成为这个链表的表尾,然后指向链表尾部的指针指向这个结点,链表数量增加

void push(stackPointer *s,int e)
{
    stackNodePtr currentNode=(stackNodePtr)malloc(sizeof(stackNode)); //为要申请的结点申请空间
    currentNode->data=e;
    if(!currentNode)
    {
        printf("动态申请空间失败");    
    }
    if(s->count==0)//如果栈的空间原本为空
    {
        s->top=currentNode;
        currentNode->next=NULL;
        s->count++;
    }
    else //栈的空间不为空 
    {
        currentNode->next=s->top;
        s->top=currentNode;
        s->count++;
    }
}

4.出栈操作

ElemType pop(stackPointer *s,int *e)
{
    if(s->count==0)//栈为空时 
    {
        printf("栈为空,无法出栈\n");
        return -1;
    }
    else
    {
        *e=s->top->data;//赋值
        s->top=s->top->next;//向下传递 
        s->count--;
        return *e;
    }
}

5.清空栈的操作

void clearStack(stackPointer *s)
{
    s->count=0;
    s->top=NULL;
}

6.销毁栈的操作

void destroyStack(stackPointer *s)
{
    int i;
    stackNodePtr temp;  //这里不准用 stackPointer *temp ,因为我们要的只是指向下一个结构体的指针,而不是一个结构体里面存在指向下一个结构体的指针
    for(i=0;i<s->count;i++)
    {
        temp=s->top->next;
        free(s->top);
        s->top=temp;
    }
    s->top=NULL; //一开始指向结构体的指针为空 
    s->count=0;  //栈的长度为0 
}

所有的代码如下:

#include<stdio.h>
#include<stdlib.h>

typedef int ElemType;
typedef struct stackNode
{
    ElemType data; //储存数据
    struct  stackNode *next ;// 指向下一个结点 
}stackNode,*stackNodePtr;

typedef struct stackPointer
{
    stackNodePtr top; //top指针 ,指向栈顶 
    int count;//储存栈元素的数量 
}stackPointer;

//初始化栈的链式存储 
void initStack(stackPointer *s)
{
    s->top=NULL; 
    s->count=0;//初始化栈的空间为0 
}

//入栈
void push(stackPointer *s,int e)
{
    stackNodePtr currentNode=(stackNodePtr)malloc(sizeof(stackNode)); //为要申请的结点申请空间
    currentNode->data=e;
    if(!currentNode)
    {
        printf("动态申请空间失败");    
    }
    if(s->count==0)//如果栈的空间原本为空
    {
        s->top=currentNode;
        currentNode->next=NULL;
        s->count++;
    }
    else //栈的空间不为空 
    {
        currentNode->next=s->top;
        s->top=currentNode;
        s->count++;
    }
}

//出栈操作
ElemType pop(stackPointer *s,int *e)
{
    if(s->count==0)//栈为空时 
    {
        printf("栈为空,无法出栈\n");
        return -1;
    }
    else
    {
        *e=s->top->data;//赋值
        s->top=s->top->next;//向下传递 
        s->count--;
        return *e;
    }
}

//清空栈的操作
void clearStack(stackPointer *s)
{
    s->count=0;
    s->top=NULL;
}

//销毁栈
void destroyStack(stackPointer *s)
{
    int i;
    stackNodePtr temp;  //这里不准用 stackPointer *temp ,因为我们要的只是指向下一个结构体的指针,而不是一个结构体里面存在指向下一个结构体的指针
    for(i=0;i<s->count;i++)
    {
        temp=s->top->next;
        free(s->top);
        s->top=temp;
    }
    s->top=NULL; //一开始指向结构体的指针为空 
    s->count=0;  //栈的长度为0 
}

int main()
{
    stackPointer s;
    initStack(&s);//栈的初始化
    
    printf("结束操作-------0\n");
    printf("入栈操作-------1\n");
    printf("出栈操作-------2\n");
    printf("清空栈的操作-------3\n");
    printf("销毁栈的操作-------4\n");
     
    int number,e; //指令 ,数据 
    printf("请输入指令");
    scanf("%d",&number);
    
    while(number!=0)
    {
        switch(number)
        {
            case 1:         //入栈操作    
                printf("入栈的数值为:");
                scanf("%d",&e);
                push(&s,e);
                break;
            
            case 2:         //出栈操作 
                e=pop(&s,&e);
                printf("出栈的元素值为:%d\n",e);
                break;
            
            case 3:       //清空栈的操作
                clearStack(&s);
                printf("栈已清空\n");
                break;
            
            case 4:        //销毁栈的操作
                destroyStack(&s);
                printf("栈已销毁\n");
                break;
                
            default:
                printf("你输入的指令不正确\n");   
        }
        printf("你的下一步指令为:");
        scanf("%d",&number);
    }
    return 0;
}

  这样就结束了,欢迎大家指出我的不足。

猜你喜欢

转载自www.cnblogs.com/qian-yi/p/12721946.html