我遇到的链表问题
程序代码:
#include <stdio.h> #include <stdlib.h> enum BOOL{False,True}; typedef struct Lnode //定义节点结构 { char data; //数据域 struct Lnode *next; //后向指针 }LNode; int conversion(LNode *pi); void initial(LNode *); //初始化一个堆栈 void push_linkstack(LNode *,char); //将一个元素入栈 BOOL pop_linkstack(LNode *,char &); //将一个元素出栈 void print_linkstack(LNode *); //显示栈中所有元素 char change(int n); int Match_Brackets(LNode *pi); void main() { LNode *ls, *js; char ch,j; int flag=1; BOOL temp; initial(ls); //初始化堆栈S while(flag) { printf("请选择:\n"); printf("1.显示栈中所有元素\n"); printf("2.入栈\n"); printf("3.出栈\n"); printf("4.进行进制转换\n"); printf("5.判断括号是否配对\n"); printf("6.退出程序\n"); scanf(" %c",&j); switch(j) { case '1': system("cls"); printf("栈中元素如下:"); print_linkstack(ls); break; case '2': system("cls"); printf("请输入要入栈的元素(一个字符):"); scanf(" %c",&ch); //输入要入栈的字符 push_linkstack(ls,ch);//入栈 // print_linkstack(ls); break; case '3': system("cls"); temp=pop_linkstack(ls,ch); //出栈 if(temp==True) { printf("出栈一个元素:%c\n",ch);//若栈不空,显示出栈的元素 printf("栈中剩下的元素为:"); print_linkstack(ls); } else printf("堆栈为空!\n");//否则堆栈为空 break; case '4': system("cls"); initial(js); conversion(js); break; case '5': system("cls"); initial(js); getchar(" "); Match_Brackets(js); break; default:flag=0; printf("程序结束,按任意键退出!\n"); } } system("pause"); } //函数功能:生成空栈 void initial(LNode *pi) { pi=NULL; //栈顶指针初始化为NULL } //函数功能:进栈 void push_linkstack(LNode *pi,char ch) { //入栈,由于采用链式结构,一般不会产生栈满的情况 LNode *po; po=(LNode *)malloc(sizeof(LNode *));//生成一个新节点 po->data=ch; //赋值 po->next=pi; //新节点的后向指针指向原栈顶节点 pi=po; //站顶指针指向新节点 } //函数功能:出栈 BOOL pop_linkstack(LNode *pi,char &e) { //出栈,成功返回True,并用e返回该元素值,失败返回False LNode *po; po=pi; //pi=po->next; //栈顶指针指向下一个节点 if(po==NULL) return False; //栈已空 else { pi=po->next; e=po->data; return True; } } //函数功能:显示栈中的元素 void print_linkstack(LNode *p) { //显示栈中所有元素 if(p==NULL) printf("堆栈为空!\n");//栈为空 else { // printf("堆栈所有元素:"); while(p!=NULL) //否则显示栈中所有元素 { printf(" %c",(*p).data);//什么错误??调试在这就出现错误了,其他没问题 p=p->next; } printf("\n"); } } //函数功能:进行进栈转换 int conversion(LNode *pi) { int n, e,flag=0; char ch; printf("输入要转化的十进制数:\n"); scanf("%d", &n); printf("要转化为多少进制:2进制、8进制、16进制 (填数字)!\n"); scanf("%d", &flag); printf("将十进制数%d转化为%d进制是:\n", n, flag); while(n) { e=n%flag; ch=change(e); push_linkstack(pi, ch);//入栈 n=n/flag; } print_linkstack(pi); return 0; } char change(int n) { if(0==n) return '0'; if(1==n) return '1'; if(2==n) return '2'; if(3==n) return '3'; if(4==n) return '4'; if(5==n) return '5'; if(6==n) return '6'; if(7==n) return '7'; if(8==n) return '8'; if(9==n) return '9'; if(10==n) return 'A'; if(11==n) return 'B'; if(12==n) return 'C'; if(13==n) return 'D'; if(14==n) return 'E'; if(15==n) return 'F'; } int Match_Brackets(LNode *pi) { int i=0; char ch[100] , x=0; printf("请输入需要检查一个字符串或一个表达式:"); gets(ch); while (ch[i]!='\0') { if ((ch[i]=='(')||(ch[i]=='[') ||(ch[i]=='{')) push_linkstack(pi , ch[i]) ; else if (ch[i]==']') { pop_linkstack(pi,x); if( x != '[') { printf("'['括号不匹配\n") ; return False ; } } else if (ch[i]=='}') { pop_linkstack(pi,x); if( x != '{') { printf("'['括号不匹配\n") ; return False ; } } else if (ch[i]==')') { pop_linkstack(pi,x); if(x!='(') { printf("'('括号不匹配\n") ; return False; } } i++; }//end of while if (pi!=NULL) { printf("括号数量不匹配!\n") ; return False; } else { printf("括号匹配或者没有括号!\n"); return True ; } } /* 3和4有错误 */
我已经找出了错误的位置,但不知道怎么修改,求指导