c语言链栈常规插入删除函数

#include 
#include 
typedef int DataType;
struct Node
{
     
    DataType data;
    struct Node*next;
};
typedef struct Node*PNode;//节点类型
typedef struct Node*top,*LinkStack;//栈顶和链栈类型
LinkStack SetNullStack_Link()//创建空链栈
{
     
    LinkStack top=(LinkStack)malloc(sizeof(struct Node));
    if(top!=NULL)
    {
     
        top->next=NULL;
    }
    else
    {
     
        printf("alloc failure");
    }
    return top;
}
void Push_Link(LinkStack top,DataType x)//进栈,不需要判断链栈是否会溢出
{
     
    PNode p=(PNode)malloc(sizeof(struct Node));//申请节点空间
    if(p==NULL)
    {
     
        printf("alloc failure");
    }
    else//相当于链表头插法
    {
     
        p->data=x;//数据域赋值
        p->next=top->next;//指针域赋值
        top->next=p;//修改栈顶
    }
}
int IsNullStack_Link(LinkStack top)//判断栈是否为空
{
     
    if(top->next==NULL)
        return 1;
    else
        return 0;
}
void Pop_Link(LinkStack top)//删除栈顶元素,需要判空
{
     
    PNode p;
    if(top->next==NULL)//判断栈是否为空
        printf("it is empty stack!");
    else
    {
     
        p=top->next;//p指向待删除的节点
        top->next=p->next;//修改栈顶指针
        free(p);//删除释放节点的空间
    }
}
DataType Pop_Link_Return(LinkStack top)//取栈顶元素
{
     
    if(IsNullStack_Link(top)==1)//判断栈是否为空
        printf("it is empty stack!");
    else
    {
     
        return top->next->data;
    }
}
int main()
{
     
    LinkStack p=SetNullStack_Link();//创建一个空栈
    int data;
    printf("请输入进栈的元素,以0结束:");
    scanf("%d",&data);
    while(data!=0)
    {
     
        Push_Link(p,data);//进栈
        scanf("%d",&data);
    }
    printf("出栈元素的顺序是:");
    while(!IsNullStack_Link(p))//是否空栈
    {
     
        printf("%d ",Pop_Link_Return(p));//取出栈顶元素
        Pop_Link(p);//出栈

    }
}

输入输出样例如下
c语言链栈常规插入删除函数_第1张图片

你可能感兴趣的:(数据结构,指针,链表,c语言,栈)