所以我在这段代码中出现细分错误,我不知道为什么。我认为这与我使用NULL错误(?)的事实有关,但我认为并非如此。 。我尝试添加更多错误消息,以查看是否可以执行此操作,但是仍然出现相同的错误/:
char* lookup(Dictionary D, char* k){
Node N = D->head;
if(D == NULL){
fprintf(stderr, "Error: calling lookup() on null Dictionary");
exit(EXIT_FAILURE);
}
while(N!=NULL){
if(strcmp(N->key,k)==0){
return N->value;
break;
}
N = N->next;
}
return NULL;
}
void insert(Dictionary D, char* k, char* v){
// Node N = D->head;
if(D==NULL){
fprintf(stderr, "Error: inserting on a null Dictionary\n");
exit(EXIT_FAILURE);
}
if(lookup(D,k)!=NULL){
fprintf(stderr, "already existing\n");
exit(EXIT_FAILURE);
}
else{
if(D->numItems==0){
Node N;
N = newNode(k,v);
D->head = N;
D->numItems++;
}
//if there is only a head node, add node after it
else{
Node S = D->head;
while(S!=NULL) {
S = S->next;
}
S->next = newNode(k,v);
}
D->numItems++;
}
}
答案 0 :(得分:1)
在lookup()函数中
Node N = D->head;
if(D == NULL){
在检查D是否为NULL之前,您已经访问过D。这可能会导致NULL指针访问和核心转储。
在insert()函数中:
while(S!=NULL) {
S = S->next;
}
// You are guaranteed that S is now == NULL, so the
// next line is a NULL pointer access.
S->next = newNode(k,v);
您需要保留最后一项,以便可以说出last->next = newNode(k, v);
也:如果集合中有0个项目,numItems
是否不会增加两次?由于错误的代码格式,很难说...
其他评论:
D
,N
和S
都是坏名字。无论如何,您都可以完成1个以上的字符名称。 dict
和node