我贼直! 发表于 2018-4-29 22:58:25

我这么写的几个链栈基本操作函数,无法获取top->next??

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef char DataType;
typedef struct node
{
        DataType data;
        struct node *next;
}linkstack,*link;
int init(link top)
{
        if(!top)
        {
                printf("申请内存失败!\n");
                return -1;
        }
        top->data='1';
        top->next=NULL;
        return 0;
}
int empty(link top)
{
        if(top->next==NULL)
        return 1;
        else return 0;
}
int push(link top,DataType e)
{
        link p=(link)malloc(sizeof(linkstack));
        if(!p)
        {
                printf("申请空间失败!\n");return -1;
        }
        p->data=e;
        p->next=top->next;
        top->next=p;
        return 0;
}
int gettop(link top,DataType *e)
{
        link p;//
        if(empty(top))
        {
                printf("栈是空的!\n");
                return -1;
        }
        p=top->next;
        *e=p->data;
        return 0;
}
int pop(link top,DataType *e)
{
        if(empty(top))
        {
                printf("栈是空的!\n");
                return -1;
        }
        link p;
        p=top->next;
        *e=p->data;
        top->next=p->next;
        free(p);
        return 0;
}
int destroy(link top)
{
        if(!top)
        {
                printf("栈是空的!\n");
                return -1;
        }
        link p,q;
        p=top;
        while(!p)
        {
                q=p;
                p=p->next;
                free(q);
        }
        return 0;
}
int match(DataType a,DataType b)
{
        if(a=='('&&b==')')
        return 1;
        else if(a=='['&&b==']')
        return 1;
        else if(a=='{'&&b=='}')
        return 1;
        else
        return 0;
}
int main()
{
        char s;
        printf("请输入表达式:");
        gets(s);
        char *pp=s;char *q;
        link top=(link)malloc(sizeof(linkstack));
        init(top);
        while(*pp)
        {
                switch(*pp)
                {
                        case'(':
                        case'[':
                        case'{':push(top,*pp);break;
                        case')':
                        case']':
                        case'}':if(empty(top)) {
                                printf("括号不匹配!\n");return -1;
                        }
                        gettop(top,q);
                        if(match(*q,*pp)) pop(top,q);
                        else
                        {
                        printf("括号不匹配!\n");
                        return -1;
                        }break;
          }
          pp++;
        }
        if(empty(top)) printf("括号匹配!\n");
        return 0;
}
本来是个简单的判断表达式括号是否匹配的程序,但是一运行就出错,调试发现是在扫描到右括号的时候用gettop函数,发现top->next被认为是NULL?我明明前面有push操作啊?是不是我的gettop函数写的有问题?求各位大神解答,感激不尽!

人造人 发表于 2018-4-30 00:50:54

我贼直! 发表于 2018-4-30 08:57:35

人造人 发表于 2018-4-30 00:50


我前面有char *q呀,不过我刚刚把q指针变量改成了字符变量,函数参数里面用到q的改成&q,为啥运行就没问题了呢?请指教

人造人 发表于 2018-4-30 11:57:35

我贼直! 发表于 2018-4-30 08:57
我前面有char *q呀,不过我刚刚把q指针变量改成了字符变量,函数参数里面用到q的改成&q,为啥运行就没问 ...

指针就是这样用的

我贼直! 发表于 2018-4-30 19:08:52

人造人 发表于 2018-4-30 11:57
指针就是这样用的

我之前的char *q,不也是个指针吗?和换成char q,取&q有什么区别呢?

人造人 发表于 2018-4-30 19:36:56

我贼直! 发表于 2018-4-30 19:08
我之前的char *q,不也是个指针吗?和换成char q,取&q有什么区别呢?

指针是一个变量,一个保存地址的变量
char a = '\n';
char *q = &a;   // q是一个变量,这个变量中保存了一个地址,保存了变量a的地址


char q;   // q是一个变量,这个变量中保存一个字符,&q 得到变量q的地址
页: [1]
查看完整版本: 我这么写的几个链栈基本操作函数,无法获取top->next??