2016-09-16 9 views
0

Я пытаюсь сделать некоторые головоломки программирования, чтобы узнать C, и у меня возникли проблемы с удалением связанного списка для работы при удалении головного узла. Я думаю, что проблема супер проста, но я не могу ее найти! Проблема, с которой я столкнулась, связана с функцией delete(), когда я пытаюсь удалить головку связанного списка, она не удаляет ее, а вместо этого изменяет ее на значение мусора.связанный список значение мусора c

Может ли кто-нибудь помочь мне, пожалуйста? Спасибо огромное!

Вот пример вывода:

Generating list... 
    Inserted: 0 
    Inserted: 1 
    Inserted: 2 
    Inserted: 3 
    Inserted: 4 
List: 
0 1 2 3 4 
    Deleted: 4 
List: 
0 1 2 3 
    Deleted: 0 
List: 
8344720 1 2 3 

Вот мой исходный код:

#include <stdlib.h> 
#include <stdio.h> 


typedef struct Node { 
    int value; 
    struct Node* next; 
} node; 

// Append a node to the end of the linked list 
int insert(node* head, int value) { 
    node* current = head; 

    /* Check for sentinel value. If first element inserted, overwrite  head instead of appending. */ 
    if (head->value == 420) { 
     head->value = value; 
     head->next = NULL; 
     printf("\tInserted:\t%d\n", head->value); 
     return 0; 
    } 

    /* Traverse to end to append node */ 
    while (current->next != NULL) 
     current = current->next; 

    /* Build new node and append to tail*/ 
    current->next = malloc(sizeof(node)); 
    current->next->value = value; 
    current->next->next = NULL; 

    printf("\tInserted:\t%d\n", current->next->value); 
    return 0; 
} 

/* Accept a number and delete all nodes containing that value */ 
int del(node* head, int value){ 
    node* curr = head; 
    node* prev = NULL; 
    node* del = NULL; 

    printf("\tDeleted:\t%d\n", value); 

    if (head == NULL) { 
     printf("Can't delete value from empty list!\n"); 
     return 1; 
    } 

    /* Search list remove all instances of value. Watch for edge cases. */ 
    while (curr != NULL) { 
     if (curr->value == value){ 
      /* Head case (lol) */ 
      if (curr == head) { 
       del  = head; 
       head  = head->next; 
       curr  = head; 
       free(del); 
      } 
      /* Tail case */ 
      else if (curr->next == NULL) { 
       del  = curr; 
       curr  = prev; 
       curr->next = NULL; 
       free(del); 
       return 0;  /* End of list, break out of loop to avoid segfaulting */ 
      } 
      /* Body case (base case) */ 
      else { 
       del  = curr; 
       curr  = curr->next; 
       prev->next = curr; 
       free(del); 
      } 
     } 
     prev = curr; 
     curr = curr->next; 
    } 

    return 0; 
} 

/* Accept head pointer and print until end of list */ 
int traverse(node* head) { 
    node* current = head; 

    if (head == NULL){ 
     printf("Can't traverse null list!\n"); 
     return 1; 
    } 

    printf("List:\n"); 
    while(current != NULL) { 
     printf(" %d ", current->value); 
     current = current->next; 
    } 
    printf("\n"); 

    return 0; 
} 

/* Let's begin our crazy experiment.... */ 
int main() { 
    node* head = NULL; 
    head  = malloc(sizeof(node)); 
    head->value = 420; 
    head->next = NULL; 


    printf("Generating list...\n"); 

    int value; 
    for (value = 0; value < 5; value++) 
     insert(head, value); 

    traverse(head); 

    del(head, 4); 
     traverse(head); 

    del(head, 0); 
     traverse(head); 

    return 0; 
} 
+2

Standard начинающих. 'head = head-> next'. C передается по значению. Таким образом, эта строка не изменяет исходное значение 'head', которое видит вызывающий, но только * локальная копия * значения' head'. – kaylum

+0

Возможный дубликат [Как изменить указатель, который был передан в функцию в C?] (Http://stackoverflow.com/questions/766893/how-do-i-modify-a-pointer-that-has -been-переданные в-а-функция-в-с) – kaylum

ответ

1

Вы изменяете голову внутри функции дель() и используя старую голову от основной(). Вам нужно передать адрес главы в del и изменить его, чтобы изменения отражались в основном. Вам может понадобиться нечто подобное.

int del(node **head, int value){ node* curr = *head; ....

И от ошибок главного

del(&head);

Смежные вопросы