鱼C论坛

 找回密码
 立即注册
查看: 3146|回复: 5

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

[复制链接]
发表于 2018-4-29 22:58:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. typedef char DataType;
  5. typedef struct node
  6. {
  7.         DataType data;
  8.         struct node *next;
  9. }linkstack,*link;
  10. int init(link top)
  11. {
  12.         if(!top)
  13.         {
  14.                 printf("申请内存失败!\n");
  15.                 return -1;
  16.         }
  17.         top->data='1';
  18.         top->next=NULL;
  19.         return 0;
  20. }
  21. int empty(link top)
  22. {
  23.         if(top->next==NULL)
  24.         return 1;
  25.         else return 0;
  26. }
  27. int push(link top,DataType e)
  28. {
  29.         link p=(link)malloc(sizeof(linkstack));
  30.         if(!p)
  31.         {
  32.                 printf("申请空间失败!\n");return -1;
  33.         }
  34.         p->data=e;
  35.         p->next=top->next;
  36.         top->next=p;
  37.         return 0;
  38. }
  39. int gettop(link top,DataType *e)
  40. {
  41.         link p;//
  42.         if(empty(top))
  43.         {
  44.                 printf("栈是空的!\n");
  45.                 return -1;
  46.         }
  47.         p=top->next;
  48.         *e=p->data;
  49.         return 0;
  50. }
  51. int pop(link top,DataType *e)
  52. {
  53.         if(empty(top))
  54.         {
  55.                 printf("栈是空的!\n");
  56.                 return -1;
  57.         }
  58.         link p;
  59.         p=top->next;
  60.         *e=p->data;
  61.         top->next=p->next;
  62.         free(p);
  63.         return 0;
  64. }
  65. int destroy(link top)
  66. {
  67.         if(!top)
  68.         {
  69.                 printf("栈是空的!\n");
  70.                 return -1;
  71.         }
  72.         link p,q;
  73.         p=top;
  74.         while(!p)
  75.         {
  76.                 q=p;
  77.                 p=p->next;
  78.                 free(q);
  79.         }
  80.         return 0;
  81. }
  82. int match(DataType a,DataType b)
  83. {
  84.         if(a=='('&&b==')')
  85.         return 1;
  86.         else if(a=='['&&b==']')
  87.         return 1;
  88.         else if(a=='{'&&b=='}')
  89.         return 1;
  90.         else
  91.         return 0;
  92. }
  93. int main()
  94. {
  95.         char s[60];
  96.         printf("请输入表达式:");
  97.         gets(s);
  98.         char *pp=s;char *q;
  99.         link top=(link)malloc(sizeof(linkstack));
  100.         init(top);
  101.         while(*pp)
  102.         {
  103.                 switch(*pp)
  104.                 {
  105.                         case'(':
  106.                         case'[':
  107.                         case'{':push(top,*pp);break;
  108.                         case')':
  109.                         case']':
  110.                         case'}':if(empty(top)) {
  111.                                 printf("括号不匹配!\n");return -1;
  112.                         }
  113.                         gettop(top,q);
  114.                         if(match(*q,*pp)) pop(top,q);
  115.                         else
  116.                         {
  117.                         printf("括号不匹配!\n");
  118.                         return -1;
  119.                         }break;
  120.             }
  121.             pp++;
  122.         }
  123.         if(empty(top)) printf("括号匹配!\n");
  124.         return 0;
  125. }
复制代码

本来是个简单的判断表达式括号是否匹配的程序,但是一运行就出错,调试发现是在扫描到右括号的时候用gettop函数,发现top->next被认为是NULL?我明明前面有push操作啊?是不是我的gettop函数写的有问题?求各位大神解答,感激不尽!
最佳答案
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的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-4-30 00:50:54 | 显示全部楼层
无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-30 08:57:35 | 显示全部楼层

我前面有char *q呀,不过我刚刚把q指针变量改成了字符变量,函数参数里面用到q的改成&q,为啥运行就没问题了呢?请指教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

指针就是这样用的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-30 19:08:52 | 显示全部楼层
人造人 发表于 2018-4-30 11:57
指针就是这样用的

我之前的char *q,不也是个指针吗?和换成char q,取&q有什么区别呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 13:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表