2015-10-31 2 views
-1
struct Node 
{ 
    int data; 
    struct Node *next; 
}; 

Node *AppendNode(Node *head, int data) { 
    Node *ptr = head; 

    struct Node node = {data, ptr->next}; 

    head->next = &node; 

    return head; 
} 

void PrintNode(Node *head) { 
    Node *ptr = head; 
    while (ptr != 0) { 
     printf("%d ", ptr->data); 
     ptr = ptr->next; 
    } 
} 


int main() { 

    Node node = {1 , 0}; 
    Node* head = &node; 
    head = AppendNode(head, 2); 
    PrintNode(head); 



    return 0; 
} 

Выход (1,3830) вместо (1,2). Проверьте отладчики. Я видел изменения значения узла от 2 до 3830 на этом этапе ptr = ptr->next; внутри PrintNode. Извините, я новичок в C++.Ошибка печати связанного списка. Что не так?

+0

Функция AppendNode неверна. Вы берете адрес локальной переменной. Вместо этого переменная узла должна быть указателем на узел, созданный в куче через new. –

ответ

2

Это неправильно:

Node *AppendNode(Node *head, int data) { 
    Node *ptr = head; 

    struct Node node = {data, ptr->next}; 

    head->next = &node; 

    return head; 
} 

Вы вставляете указатель на локальную переменную стека в связанном списке. Как только ваша функция вернется, память, на которую ссылается &node, скоро будет сбита.

Кроме того, независимо от того, что ранее указывал head->next, перед тем как задание будет просочиться (и потеряно).

Лучше:

Node* AppendNode(Node *head, int data) 
{ 
    Node* newNode = new Node; 
    newNode->data = data; 
    newNode->next = head; 
    head = newNode; 
    return head; 
} 

Но технически выше «предваряя» в список, а не «добавление», как ваша функция подписи предполагает. Возможно, это то, что вы хотите, но если нет, это упражнение, которое я оставлю вам. :)

Как следует из другого ответа Бо, не забудьте вызвать «удалить» на своих узлах, когда закончите со списком, чтобы избежать утечки памяти.

2

У вас есть Node в AppendNode. Как только вы покинете функцию, этот узел исчез.

Если вы должны динамически создавать узлы, вы делаете это с помощью new Node. Только не забудьте позже delete.

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