我遇到的链表问题
程序代码:
#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有错误
*/我已经找出了错误的位置,但不知道怎么修改,求指导


