在单链列表(C)中的InsertAfter函数

时间:2019-03-12 03:23:00

标签: c

我必须编写代码以在包含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;}
  }
}

1 个答案:

答案 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;