由了“动态堆栈”思考C

下面是动态堆栈的创建代码:

#include "stdio.h"
struct node
{
    char  data;
    struct  node  *next;
};
struct node *creat()
{
      char ch;
      struct node *head,*r,*p;
      head=NULL;
      while ((ch=getchar())!='/n')
      {
           p=(struct node *)malloc(sizeof(struct node));
           p->data=ch;
           if(head==NULL)
                head=p;
           else
                r->next=p;
           r=p;
      }
      return head;
}
void MakeNull(struct node *s)/*使栈s为空*/
{
        struct node *p=s;
        while(s!=NULL)
        {
            s=s->next;
            free(p);/*释放空间*/
            p=s;
        }
}
Top(struct node *s)
{
    if(s==NULL)/*s为空栈,直接跳出,提示出错信息*/
        printf("The struct node  is empty.");
    else
        return s->data;
}
Pop(struct node *s)
{
        struct node *p;
        if(s==NULL) /*s为空栈,直接跳出,提示出错信息*/
            printf("The stack is empty.");
        else
        {
            p=s;
            s=s->next;
            free(p);
            return s;
        }
}
Push(struct node *s,char x)
{
        struct node *p;
        p=(struct node *)malloc(sizeof(struct node));
        p->data=x;
        p->next=s;
        return p;
}
print(struct node *p)
{
    do
    {
        printf("%c",p->data);
        p=p->next;
    } while(p);
    printf("/n");
}
void main()
{
    struct node *m_stack=creat();
    struct node *p,*r;
    char ch;
    if(m_stack!=NULL)
    {
        p=Push(m_stack,'j');
        print(p);
        r=Pop(m_stack);
        print(r);
        ch=Top(m_stack);
        printf("%c",ch);
    }
    else
    {
        p=Push(m_stack,'j');
        print(p);
    }
    getch();
}

 

所谓栈,其实就是一种特殊的链表,一端开放一端固定。对栈的操作其实就是对链表的操作。对于链表而言,我们可以将两个链表连接、删除链表中的一个节点、插入节点。同样对于栈的操作可以是在栈头加入节点和在栈头删除节点。

 

Push()函数的操作是在栈头加入一个节点:

Push(struct node *s,char x)
{
        struct node *p;
        p=(struct node *)malloc(sizeof(struct node));
        p->data=x;
        p->next=s;
        s=p;
}
这里的s代表的是传递进来栈的第一个节点,我们可以把它看作是一个指针,指向第一个节点的指针。把新节点指向链表然后把该节点放在s盒子中。

 

这个程序老是出问题;虽然能把所想要的东西打印出来了 ,但是总带有“副产品”!高手请指点!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值