Ваш абзац не соответствует вашим скобкам.До:
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;