2013-04-09 4 views
6

Używam samouczka biblioteki Stanford CS Ed Library na listach połączonych. Próbuję dodać nową listę na początku mojej połączonej listy i nie działa ona w oparciu o wydruk, który otrzymuję z funkcji Length zdefiniowanej poniżej.Dodawanie elementu do pierwszej listy połączonej w C

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

//build new struct for node 
//node has value and points to next node 
struct node{ 
    int value; 
    struct node *next; 
}; 

//declare a new struct node that contains 3 nodes (head, middle, tail) 
struct node *Build123(){ 
    struct node *head, *middle, *tail = NULL; 

    head = malloc(sizeof(struct node)); 
    middle = malloc(sizeof(struct node)); 
    tail = malloc(sizeof(struct node)); 

    head->value = 3; 
    head->next = middle; 

    middle->value = 5; 
    middle->next = tail; 

    tail->value = 9; 
    tail->next = NULL; 

    return head; 
}; 

//declare a function Length and variable counter to calculate size of list 
int Length(struct node *head) { 
    int count = 0; 
    struct node *iterator = head; 
    while (iterator != NULL) { 
     count++; 
     iterator = iterator->next; 
    } 
    return count; 
} 

//declare function Push to add new lists that would be added to the front 
void Push (struct node **headRef, int value){ 
    struct node *newNode; 
    newNode = malloc(sizeof(struct node)); 
    newNode->value = value; 
    newNode->next = *headRef; 
} 

int main(){ 
    //instantiate the 3 element linked list named beast 
    struct node *beast = Build123(); 

    //add 2 elements to the front of the linked list via pass by reference 
    Push(&beast, 6); 
    Push(&beast, 12); 

    //calculate length of linked list after elements have been added 
    int len = Length(beast); 

    //print length of linked list to screen 
    printf("%d\n",len); 
    return 0; 
} 

uzyskać 3, kiedy spodziewać się 5. Czy pomożecie mi znaleźć błąd w kodzie, który uniemożliwia mi uzyskanie oczekiwanej wartości? Nie mogłem zrozumieć, dlaczego pomimo wielkiego majsterkowania. Dziękuję Ci!

Odpowiedz

3

Nie modyfikujesz headRef w swojej funkcji , więc Twoja lista nigdy się nie zmienia. beast zawsze pozostaje wskazujący na pierwotny węzeł, do którego został stworzony, aby wskazywać. Dodaj tę linię:

*headRef = newNode; 

W Push(), a zostaniesz ustawiony.

+0

"zostaniesz ustawiony" - zależy to od tego, gdzie zostanie dodany. –

+0

Przez "dodaj" miałem na myśli "na końcu". Ale tak, wyraźnie musi być w rozsądnym miejscu. –

+0

"dodaj" nie oznacza "na końcu". Pozostałe dwie odpowiedzi są wyraźne. –

4

Problem polega na tym, że gdy robisz coś takiego, jak Push(&beast, 6);, to co wskazuje beast jest niezmienione przez funkcję Push. Mimo że Push dodaje więcej elementów do połączonej listy, kiedy wywołujemy długość na bestii później, wywołuje ją w tym samym węźle, z którego na początku znajdowała się bestia - tak więc zupełnie nie wie o dodatkowych, dodanych węzłach.

Pod koniec push(), trzeba to zrobić:

*headRef = newNode;

tak że beast będzie prawidłowo wskazywać na nowy początek listy.

1

Pod koniec metody push(), trzeba dodać:

*headRef = newNode

To dlatego headRef zawsze powinien wskazywać do pierwszego węzła w połączonej listy.