У меня есть связанный список, где каждый узел хранит слово и число. Я могу добавить узлы вверху списка (push
), в центре списка (insertAfter
) и в конце списка (append
). Теперь я добавил функцию для удаления узлов, где он будет принимать символ, он будет искать этот символ в списке и удалять узел, который хранит этот символ.
Проблема в том, что deleteNode
будет работать с обычным узлом, добавленным вверху списка, но когда я добавляю узел в конце или добавляю его в середине списка, он не будет работать.
Tl; dr deleteNode
работает с узлами, созданными с помощью push
, но не с узлами, созданными с помощью append
или insertAfter
.
Я получаю ошибку segmentation fault
, поэтому у меня нет конкретной ошибки от компилятора. Я пытаюсь отладить его, запустив разные части кода, но все еще не могу найти проблему.
struct Node
{
int data;
char *word;
struct Node *next;
};
void push(struct Node** head_ref, int new_data, char *new_word)
{
struct Node* new_node = (struct Node*) malloc(sizeof(struct Node));
new_node->data = new_data;
new_node->word= malloc(strlen(new_word));
strcpy(new_node->word, new_word);
new_node->next = (*head_ref);
(*head_ref) = new_node;
}
/* Given a node prev_node, insert a new node after the given
prev_node */
void insertAfter(struct Node* prev_node, int new_data, char *new_word)
{
if (prev_node == NULL)
{
printf("the given previous node cannot be NULL");
return;
}
struct Node* new_node =(struct Node*) malloc(sizeof(struct Node));
new_node->data = new_data;
new_node->word= malloc(strlen(new_word));
strcpy(new_node->word, new_word);
new_node->next = prev_node->next;
prev_node->next = new_node;
}
void append(struct Node** head_ref, int new_data, char *new_word)
{
struct Node* new_node = (struct Node*) malloc(sizeof(struct Node));
struct Node *last = *head_ref;
new_node->data = new_data;
new_node->word= malloc(strlen(new_word));
strcpy(new_node->word, new_word);
new_node->next = NULL;
if (*head_ref == NULL)
{
*head_ref = new_node;
return;
}
while (last->next != NULL)
last = last->next;
last->next = new_node;
return;
}
void deleteNode(struct Node **head_ref, char *word)
{
struct Node* temp = *head_ref, *prev;
if (strcmp(word, (*head_ref)->word)==0)
{
*head_ref = temp->next; // Changed head
free(temp); // free old head
return;
}
while (strcmp(word, (*head_ref)->word)!=0)
{
prev = temp;
temp = temp->next;
}
if (temp == NULL) return;
prev->next = temp->next;
free(temp); // Free memory
}