这个是什么意思?还有每次黄色箭头指向的是有错的吗?
next指针指向的内存无效(貌似是0x00000000),所以得不到next结构体的值。
你这应该是个链表的节点吧,一般报这个错误,你可能没有为这个节点分配内存空间,你好好看看你的代码
上代码。。。不然谁知道是什么。。。
这个是代码栈的应用 表达式求值
#include
#include
#include
typedef char ElemType;
typedef float SElemType_data;
typedef struct linknode
{
ElemType data;
struct linknode *next;
}LiStack;
void InitStack1(LiStack *&op)
{
op=(LiStack *)malloc(sizeof(LiStack));
op->next=NULL;
}
void Push1(LiStack *&op,ElemType e)
{
LiStack *p;
p=(LiStack *)malloc(sizeof(LiStack));
p->data=e;
p->next=op->next;
op->next=p;
}
char Pop1(LiStack *&op, ElemType &e)
{
LiStack *p;
if(op->next==NULL)
return false;
p=op->next;
e=p->data;
op->next=p->next;
free(p);
return e;
}
char GetTop1(LiStack *op,ElemType &e)
{
if(op->next==NULL)
return false;
e=op->next->data;
return e;
}
typedef struct linknode_data
{
SElemType_data data;
struct linknode_data *next;
}LiStack_data;
void InitStack2(LiStack_data *&st)
{
st=(LiStack_data *)malloc(sizeof(LiStack_data));
st->next=NULL;
}
void Push2(LiStack_data *&st,SElemType_data e)
{
LiStack_data *p;
p=(LiStack_data *)malloc(sizeof(LiStack_data));
p->data=e;
p->next=st->next;
st->next=p;
}
float Pop2(LiStack_data *&st, SElemType_data &e)
{
LiStack_data *p;
if(st->next==NULL)
return false;
p=st->next;
e=p->data;
st->next=p->next;
free(p);
return e;
}
float GetTop2(LiStack_data st,SElemType_data &e)
{
if(st->next==NULL)
return false;
e=st->next->data;
return e;
}
struct
{
char ch;
int pri;
}lpri[]={{'=',0},{'(',1},{'',5},{'/',5},{'+',3},{'-',3},{')',6}},
rpri[]={{'=',0},{'(',6},{'*',4},{'/',4},{'+',2},{'-',2},{')',1}};
int leftpri(char q)
{
int i;
for(i=0;i<MaxOp;i++)
if(lpri[i].ch==q)
return lpri[i].pri;
}
int rightpri(char q)
{
int i;
for(i=0;i<MaxOp;i++)
if(rpri[i].ch==q)
return rpri[i].pri;
}
bool InOp(char ch)
{
if(ch=='('||ch==')'||ch=='+'||ch=='-'||ch=='*'||ch=='/')
return true;
else
return false;
}
int Precede(char q1,char q2)
{
if(leftpri(q1)==rightpri(q2))
return 0;
else if (leftpri(q1)<rightpri(q2))
return -1;
else
return 1;
}
void trans(char *exp,char postexp[])
{
LiStack *op;
InitStack1(op);
int i=0;
ElemType e;
Push1(op,'=');
while(*exp!='\0')
{
if(!InOp(*exp))
{ while(*exp>='0'&&*exp<='9')
{
postexp[i++]=*exp;
exp++;
}
postexp[i++]='#';
}
else
switch(Precede(GetTop1(op,e),*exp))
{
case -1:
Push1(op,*exp);
exp++;
break;
case 0:
Pop1(op,e);
exp++;
break;
case 1:
postexp[i++]=GetTop1(op,e);
break;
}
}
while(GetTop1(op,e)!='=')
{
postexp[i++]=GetTop1(op,e);
}
postexp[i]='\0';
}
float compvalue(char *postexp)
{
LiStack_data *st;
InitStack2(st);
float d,a,b,c;
while(*postexp!='\0')
{
switch(*postexp)
{
case '+':
Pop2(st,a);
Pop2(st,b);
c=a+b;
Push2(st,c);
break;
case '-':
Pop2(st,a);
Pop2(st,b);
c=b-a;
Push2(st,c);
break;
case '*':
Pop2(st,a);
Pop2(st,b);
c=a*b;
Push2(st,c);
break;
case '/':
Pop2(st,a);
Pop2(st,b);
if(a!=0)
{
c=b/a;
Push2(st,c);
}
else
{
printf("\n\t除零错误!\n");
exit(0);
}
break;
default:
d=0;
while(*postexp>='0'&&*postexp<='9')
{
d=10*d+*postexp-'0';
postexp++;
}
Push2(st,d);
break;
}
postexp++;
}
return(GetTop2(st,d));
return(GetTop2(st,d));
}
void main()
{
char exp[14]="(56-20)/(4+2)";
char postexp[MaxSize];
trans(exp,postexp);
printf("原始表达式:%s\n",exp);
printf("后缀表达式:%s\n",postexp);
printf("表达式的值:%g\n",compvalue(postexp));
}