我遇到了一个我从未遇到过的问题。我知道崩溃程序的哪一段代码,我只是不知道如何解决它。我有两个链接列表正在搜索特定的"密钥"在两个功能。现在,尽管函数与Ifs一起正常工作,但它不会按预期工作,因为它不是循环,它们只会通过链表一次,而且它们发出的信息不正确。我尝试使用一段似乎是正确的,但最终由于某种原因它崩溃了程序。这就是我希望得到帮助的地方:)
yacc文件:
%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern int yylineno;
int r; int c; int n;
typedef struct{char c[50]; int *p;} em;
%}
%union {struct {char c[50];} buf; struct esta{char info[50]; int nu; struct esta *next;} *p; struct trans{char esti[50]; char estf[50]; char nome[50]; int nu; struct trans *next;} *q;}
%start gda
%token<buf> BEGINTAG ENDTAG DEFINETAG AUT EST CODC
%type<p> desta naute aute nest dest
%type<q> dtraa nautt autt ntra dtra
%type<buf> devea deve eve com
%%
gda : gda desta dtraa devea {struct trans *t;struct esta *ei;struct esta *ef;t=getTransInfo($3,$4.c);ei=getEstInfo($2,t->esti);ef=getEstInfo($2,t->estf);printf("%s %s %s %d %s %d\n",t->esti,t->estf,ei->info,ei->nu,ef->info,ef->nu);}
|
;
desta: DEFINETAG BEGINTAG naute ENDTAG {$$=$3;}
;
naute: naute aute {$$=$2;}
| aute {$$=$1;}
;
aute : AUT nest {$$=$2;}
;
nest : nest dest {$$=$2;$2->next=$1;r++;$2->nu+=r;}
| dest {$$=$1;$1->next=0;r=0;}
;
dest : EST {$$=newEst($1.c);}
;
dtraa: DEFINETAG BEGINTAG nautt ENDTAG {$$=$3;}
;
nautt: nautt autt {$$=$2;}
| autt {$$=$1;}
;
autt : AUT ntra {$$=$2;}
;
ntra : ntra dtra {$$=$2;$2->next=$1;c++;$2->nu+=c;}
| dtra {$$=$1;$1->next=0;c=0;}
;
dtra : EST '-''>' EST '(' EST ')' {$$=newTrans($1.c,$4.c,$6.c);}
;
devea: devea AUT BEGINTAG deve ENDTAG {$$=$4;}
| AUT BEGINTAG deve ENDTAG {$$=$3;}
;
deve : deve eve CODC {$$=$2;}
| eve CODC {$$=$1;}
;
eve : '(' com ')'':' com {$$=$2;}
;
com : EST {strcpy($$.c,$1.c);}
;
%%
int main(){
yyparse();
return 0;
}
int yyerror(char *s){fprintf(stderr, "ERRO(%d):%s\n", yylineno,s); return 0;}
struct esta *newEst(char c[50]){struct esta *p=(struct esta*) malloc(sizeof(struct esta)); strcpy(p->info,c); p->nu=1; p->next=0 ; return p;}
struct trans *newTrans(char ei[50],char ef[50],char n[50]){struct trans *q=(struct trans*)malloc(sizeof(struct trans));strcpy(q->esti,ei);strcpy(q->estf,ef);strcpy(q->nome,n);q->nu=1;q->next=0;return q;}
struct esta *getEstInfo(struct esta *s,char c[50]){if(s->info!=c){s=s->next;}else{return s;}}
struct trans *getTransInfo(struct trans *s,char c[50]){while(s->nome!=c){s=s->next;}return s;}
我所谈论的功能是最后两个。 getEstInfo和getTransInfo。我认为它们都需要改变,但我不知道如何。关于如何使我的代码更高效的任何其他评论都很高兴被接受。谢谢你的时间。
答案 0 :(得分:0)
我找到了解决方案。在失败并再次失败之后,我重新实现了最后两个函数,并且我使用了whiles:
struct esta *getEstInfo (struct esta *s, char c[50])
{
int i;
while (s)
{
i = strcmp(s->info, c);
if (i != 0)
{
s=s->next;
} else
{
return s;
break;
}
}
}
struct trans *getTransInfo (struct trans *s,char c[50])
{
int i;
while (s)
{
i = strcmp (s->nome, c);
if (i != 0)
{
s = s->next;
} else
{
return s;
break;
}
}
}
感谢您的时间:)