2014-02-10 4 views
0

Не понимаю, почему функция display() показывает мне только первый элемент списка. Я думаю, что я сделал беспорядок с указателями, но я не могу понять, где. Я сравнил это с другим источником связанного списка, и кажется, что функция написана на хорошем уровне.C++ Связанный список ошибка печати

#include "stdafx.h" 
#include <string> 
#include <iostream> 
using namespace std; 

struct Node 
{ 
    int Data; 
    Node * next; 
}; 

void initNode(struct Node *head,int n); 
void AddNode(int n,Node* head); 
void display(Node* head); 

int main() 
{ 
    Node * head = new Node; 

    initNode(head,5); 
    display(head); 

    AddNode(10,head); 
    display(head); 

    AddNode(15,head); 
    display(head); 

    cin.get(); 
    return 0; 
} 

void AddNode(int n,Node * head) 
{ 
    Node * node = new Node; 
    node->Data = n; 
    node->next = NULL; 

    Node * nextNode = head; 
    while(nextNode) 
    { 
     if(nextNode->next == NULL) 
     { 
      nextNode->next = node; 
     } 
     nextNode = nextNode->next; 
    } 
} 

void display(Node * head) 
{ 
    while(head) 
    { 
     cout << head->Data << " "<<endl; 
     head = head->next; 
    } 
} 

void initNode(struct Node *head,int n) 
{ 
    head->Data = n; 
    head->next = NULL; 
} 

ответ

1

В вашей AddNode функции добавить разрыв в если блок.

void AddNode(int n,Node * head) 
{ 
    Node * node = new Node; 
    node->Data = n; 
    node->next = NULL; 

    Node * nextNode = head; 
    while(nextNode) 
    { 
     if(nextNode->next == NULL) 
     { 
      nextNode->next = node; 
      break; 
     } 
     nextNode = nextNode->next; 
    } 
} 

Теперь он должен правильно размещаться.

2

Ваш метод AddNode является чрезмерно сложным. Есть ли что-то подобное, чтобы добавить к фронту:

Node *AddNode(int n, Node *head) 
{ 
    Node *newNode = new Node; 
    newNode->Data = n; 
    newNode->next = head; 

    return newNode; 
} 

Или добавить в конец:

Node *AddNode(int n, Node *head) 
{ 
    Node *newNode = new Node; 
    newNode->Data = n; 
    newNode->next = NULL; 

    if(head == NULL) return newNode; 

    Node *current = head; 

    while(current->Next != NULL) 
    { 
    current = current->Next; 
    } 

    current->Next = newNode; 

    return head; 
} 

Делая AddNode таким образом вам не нужно initNode. Теперь вы можете просто день:

Node *head = NULL; 
head = AddNode(5, head); 
head = AddNode(10, head); 
head = AddNode(15, head); 

display(head); 

Кроме того, вам не нужно говорить struct Node в C++, то требуется только в С.

+0

Это другое. Ваша функция добавляет узлы в начале, в то время как OP пытается добавить их в конце. Обычно лучше добавлять в начале, если это возможно, но мы не знаем, что нужно OP. – interjay

+0

@interjay - спасибо. Я обновил ответ – Sean

0
Node * nextNode = head; 
    while(nextNode) 
    { 
     if(nextNode->next == NULL) 
     { 
      nextNode->next = node; 
     } 
     nextNode = nextNode->next; 
    } 

Проблема заключается в блок кода. Когда вы найдете конец списка (если nextNode-> next == NULL), вам нужно выйти из цикла. Попробуйте это на примере, чтобы убедить себя.

0

Каждый раз, когда вы добавляете узел, траверс от головы до конца списка Вы можете изменить его следующим образом

void AddNode(int n){ 
    Node *node=new Node; 
    node->data=n; 
    node->next=NULL; //head is global 
    if(head==NULL){ 
     t=head=n; 
    } 
    else{ 
    t->next=n; //t is global 
    t=t->next; 
    } 
} 
2

Функция AddNode имеет бесконечный цикл.

void AddNode(int n,Node * head) 
{ 
    Node * node = new Node; 
    node->Data = n; 
    node->next = NULL; 

    Node * nextNode = head; 
    while(nextNode) 
    { 
     if(nextNode->next == NULL) 
     { 
      nextNode->next = node; 
     } 
     nextNode = nextNode->next; 
    } 
} 

Предположим, что у вас есть только один элемент, который является головкой (после вызова initNode). И как результат head-> next = NULL. Поэтому внутри корпуса петли вы выполняете назначение

nextNode->next = node; 

Теперь head-> next не равно NULL. So после заявления

nextNode = nextNode->next; 

nextNode caontains новый элемент. Поскольку он не равен NULL, повторение цикла повторяется. Опять для нового узла его следующий член данных равен NULL. И вы добавляете его к себе.

Теперь у вас нет ни одного элемента в списке, который бы имел следующий член данных равным NULL. Таким образом, вы не можете добавлять новые элементы. Последний элемент содержит ссылку на себя. Вы могли бы записать функцию следующим образом

void AddNode(int n,Node * head) 
{ 
    Node * node = new Node; 
    node->Data = n; 
    node->next = NULL; 

    Node * nextNode = head; 
    while(nextNode -> next) nextNode = nextNode->next; 

    nextNode->next = node; 
} 

Но примите во внимание, что предполагается, что голова не равен NULL. иначе функция будет неправильной. Я думаю, что вы должны перепроектировать список.

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