C Remove node from linked list

How can I remove a node from a linked list?

Here is my code:

void RemoveNode(Node * node, Node ** head) { if (strcmp(node->state, (*(*head)->next).state) == 0) { Node * temp = *head; *head = (*head)->next; free(temp); return; } Node * current = (*head)->next; Node * previous = *head; while (current != NULL && previous != NULL) { if (strcmp(node->state, (*current->next).state) == 0) { Node * temp = current; previous->next = current->next; free(temp); return; } current = current->next; previous = previous->next; } return; } 

But I keep getting seg errors.

It seems to me that I'm doing something stupid .... Any ideas?

+6
source share
2 answers

My suggestion:

 void RemoveNode(Node * node, Node ** head) { if (strcmp(node->state, ((*head)->state) == 0) { Node * temp = *head; *head = (*head)->next; free(temp); return; } Node * current = (*head)->next; Node * previous = *head; while (current != NULL && previous != NULL) { if (strcmp(node->state, current->state) == 0) { Node * temp = current; previous->next = current->next; free(temp); return; } previous = current; current = current->next; } return; } 
+5
source

I would recommend you try doing this with recursion to avoid the need for a "double pointer". This will greatly simplify the logic. This link contains a very good explanation and doing this recursively. This will especially work if you try to remove a node from an empty linked list.

 Node *ListDelete(Node *currP, State value) { /* See if we are at end of list. */ if (currP == NULL) return NULL; /* * Check to see if current node is one * to be deleted. */ if (currP->state == value) { Node *tempNextP; /* Save the next pointer in the node. */ tempNextP = currP->next; /* Deallocate the node. */ free(currP); /* * Return the NEW pointer to where we * were called from. Ie, the pointer * the previous call will use to "skip * over" the removed node. */ return tempNextP; } /* * -------------- RECURSION------------------- * Check the rest of the list, fixing the next * pointer in case the next node is the one * removed. */ currP->next = ListDelete(currP->next, value); /* * Return the pointer to where we were called * from. Since we did not remove this node it * will be the same. */ return currP; } 
+2
source

Source: https://habr.com/ru/post/952593/


All Articles