2014-02-10 122 views
0

我不明白爲什麼display()func只顯示列表的第一個成員。我認爲我做了一些亂七八糟的指針,但我不明白在哪裏。我已經將它與其他鏈表源進行了比較,它似乎是以良好的方式編寫的。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函數中,在if塊中添加一箇中斷。

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); 

而且,你不必說,在C++ 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。因此在聲明之後

nextNode = nextNode->next; 

nextNode包含新元素。因爲它不等於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。否則該功能將不正確。我認爲你應該重新設計你的名單。