user-0 提问: 求大神看一下用链栈判断回文串的C语言代码哪里不对，帮忙改一下

回复:
user: user-1
content: 引用 4 楼 JackeychanNNNN 的回复:[quote=引用 3 楼 JackeychanNNNN 的回复:] [quote=引用 2 楼 cfjtaishan 的回复:] #include <stdio.h> #include <string.h> #include <malloc.h>  typedef struct node {     char data;     struct node *link; }JD;  JD *push(JD **top, char x) {     JD *p;     p = (JD*)malloc(sizeof(JD));     p->data = x;     p->link = *top;     *top = p;     return(p); } JD *pop(JD **top,char *e) {     JD *q;     if (!(*top)) {         *e = 0;         return NULL;     }     q = *top;     *e = (*top)->data;     *top = (*top)->link;     free(q);      return *top; }  static void pre_pop(JD *top) {     JD *p = top;      while (p) {         putchar(p->data);         p = p->link;     }     putchar(10); } int main() {     JD *top = NULL;     int i,lenth;     char str[20]="abcdcba";     char e; /*     top = (JD*)malloc(sizeof(JD));     top->link = NULL; */     lenth=strlen(str);     for(i=0; i<lenth; i++)         push(&top,str[i]);     //pre_pop(top);     for(i=0;i<lenth;i++)     {         pop(&top, &e);         if(e!=str[i])         {             printf("NO\n");             return 1;         }     }     printf("YES\n"); }  参考一下吧  如果不想使用返回值，就需要传递二重指针； 如果不使用二重指针，建议使用返回值。 谢谢 可以解释一下注释部分的是什么意思吗？第二种方法吗？[/quote] 看懂了，请问设置top=NULL和top->link=NULL有什么区别吗?因为貌似两个都可以 [/quote] 不一样。一个是要哨兵的，一个不用哨兵的。top->link是定义哨兵的。但是对于这个需求，可以不用哨兵。

user: user-0
content: 引用 3 楼 JackeychanNNNN 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] #include <stdio.h> #include <string.h> #include <malloc.h>  typedef struct node {     char data;     struct node *link; }JD;  JD *push(JD **top, char x) {     JD *p;     p = (JD*)malloc(sizeof(JD));     p->data = x;     p->link = *top;     *top = p;     return(p); } JD *pop(JD **top,char *e) {     JD *q;     if (!(*top)) {         *e = 0;         return NULL;     }     q = *top;     *e = (*top)->data;     *top = (*top)->link;     free(q);      return *top; }  static void pre_pop(JD *top) {     JD *p = top;      while (p) {         putchar(p->data);         p = p->link;     }     putchar(10); } int main() {     JD *top = NULL;     int i,lenth;     char str[20]="abcdcba";     char e; /*     top = (JD*)malloc(sizeof(JD));     top->link = NULL; */     lenth=strlen(str);     for(i=0; i<lenth; i++)         push(&top,str[i]);     //pre_pop(top);     for(i=0;i<lenth;i++)     {         pop(&top, &e);         if(e!=str[i])         {             printf("NO\n");             return 1;         }     }     printf("YES\n"); }  参考一下吧  如果不想使用返回值，就需要传递二重指针； 如果不使用二重指针，建议使用返回值。 谢谢 可以解释一下注释部分的是什么意思吗？第二种方法吗？[/quote] 看懂了，请问设置top=NULL和top->link=NULL有什么区别吗?因为貌似两个都可以

user: user-1
content: 引用 3 楼 JackeychanNNNN 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] #include <stdio.h> #include <string.h> #include <malloc.h>  typedef struct node {     char data;     struct node *link; }JD;  JD *push(JD **top, char x) {     JD *p;     p = (JD*)malloc(sizeof(JD));     p->data = x;     p->link = *top;     *top = p;     return(p); } JD *pop(JD **top,char *e) {     JD *q;     if (!(*top)) {         *e = 0;         return NULL;     }     q = *top;     *e = (*top)->data;     *top = (*top)->link;     free(q);      return *top; }  static void pre_pop(JD *top) {     JD *p = top;      while (p) {         putchar(p->data);         p = p->link;     }     putchar(10); } int main() {     JD *top = NULL;     int i,lenth;     char str[20]="abcdcba";     char e; /*     top = (JD*)malloc(sizeof(JD));     top->link = NULL; */     lenth=strlen(str);     for(i=0; i<lenth; i++)         push(&top,str[i]);     //pre_pop(top);     for(i=0;i<lenth;i++)     {         pop(&top, &e);         if(e!=str[i])         {             printf("NO\n");             return 1;         }     }     printf("YES\n"); }  参考一下吧  如果不想使用返回值，就需要传递二重指针； 如果不使用二重指针，建议使用返回值。 谢谢 可以解释一下注释部分的是什么意思吗？第二种方法吗？[/quote] 注释的部分是用于调试用的。就是确认前面入栈的内容是否符合自己的预期，若符合预期，那么可以继续后面出栈。否则要先定位入栈的逻辑问题。

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:#include <stdio.h> #include <string.h> #include <malloc.h>  typedef struct node {     char data;     struct node *link; }JD;  JD *push(JD **top, char x) {     JD *p;     p = (JD*)malloc(sizeof(JD));     p->data = x;     p->link = *top;     *top = p;     return(p); } JD *pop(JD **top,char *e) {     JD *q;     if (!(*top)) {         *e = 0;         return NULL;     }     q = *top;     *e = (*top)->data;     *top = (*top)->link;     free(q);      return *top; }  static void pre_pop(JD *top) {     JD *p = top;      while (p) {         putchar(p->data);         p = p->link;     }     putchar(10); } int main() {     JD *top = NULL;     int i,lenth;     char str[20]="abcdcba";     char e; /*     top = (JD*)malloc(sizeof(JD));     top->link = NULL; */     lenth=strlen(str);     for(i=0; i<lenth; i++)         push(&top,str[i]);     //pre_pop(top);     for(i=0;i<lenth;i++)     {         pop(&top, &e);         if(e!=str[i])         {             printf("NO\n");             return 1;         }     }     printf("YES\n"); }  参考一下吧  如果不想使用返回值，就需要传递二重指针； 如果不使用二重指针，建议使用返回值。 谢谢 可以解释一下注释部分的是什么意思吗？第二种方法吗？

user: user-1
content: #include <stdio.h> #include <string.h> #include <malloc.h>  typedef struct node {     char data;     struct node *link; }JD;  JD *push(JD **top, char x) {     JD *p;     p = (JD*)malloc(sizeof(JD));     p->data = x;     p->link = *top;     *top = p;     return(p); } JD *pop(JD **top,char *e) {     JD *q;     if (!(*top)) {         *e = 0;         return NULL;     }     q = *top;     *e = (*top)->data;     *top = (*top)->link;     free(q);      return *top; }  static void pre_pop(JD *top) {     JD *p = top;      while (p) {         putchar(p->data);         p = p->link;     }     putchar(10); } int main() {     JD *top = NULL;     int i,lenth;     char str[20]="abcdcba";     char e; /*     top = (JD*)malloc(sizeof(JD));     top->link = NULL; */     lenth=strlen(str);     for(i=0; i<lenth; i++)         push(&top,str[i]);     //pre_pop(top);     for(i=0;i<lenth;i++)     {         pop(&top, &e);         if(e!=str[i])         {             printf("NO\n");             return 1;         }     }     printf("YES\n"); }  参考一下吧  如果不想使用返回值，就需要传递二重指针； 如果不使用二重指针，建议使用返回值。

user: user-2
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  百度搜相关关键字。