我必须编写代码以在包含findValue的第一个节点之后插入具有值的新节点。如果findValue不在列表中,则将新节点插入到链表的尾部。
尝试插入某些内容时出现细分错误。寻找发生这种情况的原因以及代码中的错误是什么。
void insertAfter(listNode **listPtr, int findValue, int value) {
while((*listPtr)->next !=NULL){
if((*listPtr)->value ==findValue){
listNode *newNodePtr=(listNode *)malloc(sizeof(listNode));
newNodePtr->value = value;
newNodePtr->next = (*listPtr)->next;
(*listPtr)->next =newNodePtr;
(*listPtr)=(*listPtr)->next;
}
if((*listPtr)->next ==NULL){
listNode *newNodePtr = (listNode *)malloc(sizeof(listNode));
newNodePtr->value = value;
newNodePtr->next = NULL;
(*listPtr)->next=newNodePtr;}
}
}
答案 0 :(得分:0)
您的缩进与您的大括号不匹配。之前:
while((*listPtr)->next !=NULL){
if((*listPtr)->value ==findValue){
}
if((*listPtr)->next ==NULL){
}
}
之后:
while((*listPtr)->next !=NULL){
if((*listPtr)->value ==findValue){
}
}
if((*listPtr)->next ==NULL){
}
我们通常不喜欢带有缩进缩进的代码。很难看到出了什么问题。但是由于更多错误,该代码仍然无法正常工作。让我们尝试一下:
while((*listPtr)->next !=NULL){
if((*listPtr)->value ==findValue) {
listNode *newNodePtr=(listNode *)malloc(sizeof(listNode));
newNodePtr->value = value;
newNodePtr->next = (*listPtr)->next;
(*listPtr)->next =newNodePtr;
return;
}
listPtr = &((*listPtr)->next); /* advancer was really messed up */
}
if((*listPtr)->next ==NULL){
listNode *newNodePtr = (listNode *)malloc(sizeof(listNode));
newNodePtr->value = value;
newNodePtr->next = NULL;
(*listPtr)->next=newNodePtr;
}
但是我们可以删除很多重复项:
while((*listPtr) != NULL){
if((*listPtr)->value ==findValue) {
break;
}
listPtr = &((*listPtr)->next);
}
listNode *newNodePtr = (listNode *)malloc(sizeof(listNode));
newNodePtr->value = value;
newNodePtr->next = (*listPtr)->next;
(*listPtr)->next=newNodePtr;
或更简洁地说:
for(;*listPtr && (*listPtr)->value != findValue;
listPtr = &((*listPtr)->next)) { }
struct listNode *newNodePtr = malloc(sizeof(struct listNode));
newNodePtr->value = value;
newNodePtr->next = (*listPtr)->next;
(*listPtr)->next=newNodePtr;
这时,原始代码中的其他错误是可以解决的:
for(;*listPtr && (*listPtr)->value != findValue;
listPtr = &((*listPtr)->next)) { }
struct listNode *newNodePtr = malloc(sizeof(struct listNode));
if (*listPtr) { /* it's insert after, not insert before, but we have to handle not finding anything and putting it on the end */
newNodePtr->value = *listPtr->value;
*listPtr->value = value;
} else {
newNodePtr->value = value;
}
newNodePtr->next = *listPtr; /* Don't try to follow next off the end */
*listPtr = newNodePtr;