C ++链接列表打印错误

时间:2014-02-10 16:58:08

标签: c++

我不明白为什么display()func只显示列表的第一个成员。我觉得我的指针搞得一团糟,但我无法理解。我将其与其他链表源进行了比较,似乎该函数是以良好的方式编写的。

#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;
}

5 个答案:

答案 0 :(得分: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中需要它。

答案 1 :(得分: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-&gt; next = NULL。因此,在循环体内进行分配

nextNode->next = node;

现在head-&gt; next不等于NULL。所以在声明之后

nextNode = nextNode->next; 

nextNode可以使用新元素。因为它不等于NULL,所以将重复循环的迭代。同样对于新节点,其数据成员next等于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; 
}

但是考虑到假设head不等于NULL。否则该功能将不正确。我认为你应该重新设计你的名单。

答案 2 :(得分: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; 
    }
}

现在它应该正确添加。

答案 3 :(得分:0)

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

问题在于这段代码。当您找到列表的末尾(如果nextNode-&gt; next == NULL)时,您需要突破循环。试着用一个例子来说服自己。

答案 4 :(得分: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;
   }
}