C++ 链表打印错误

C++ Linked list print error

本文关键字:错误 打印 链表 C++      更新时间:2023-10-16

我不明白为什么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;
}

您的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 中。

函数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 之后)。结果是头>下一个 = 空。因此,在循环主体内部,您进行分配

nextNode->next = node;

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

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。 否则函数将不正确。我认为你应该重新设计你的列表。

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

现在它应该正确添加。

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

问题是这个代码块。当你找到列表的末尾时(如果nextNode->next == NULL),你需要打破循环。尝试用一个例子来说服自己。

每次添加节点时,您都会从 head 遍历到列表末尾您可以按如下方式更改它

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