C++ 链表打印错误
C++ Linked list print error
我不明白为什么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;
}
}
相关文章:
- 使用 <list> (错误 C2760) 打印队列的元素
- 任何人都可以弄清楚这段代码如何显示运行错误?它打印无限时间 -1 以及正确答案
- 为什么重载运算符<<打印特征类成员会导致段错误?
- 我编写了以下代码来读取C++矩阵,然后打印其行和列.我收到此错误
- 我在C++中编写了一个方法来打印树类的预序,但它显示了分割错误
- 错误含义;以二进制形式打印数字
- 通过基类引用派生类后打印的错误值
- 如何在没有打印语句的情况下报告用户输入错误
- 为什么没有打印错误消息
- C++打印模板容器错误(错误:"运算符<<"的不明确重载)理解?
- 错误:变量或字段'PrintEntity'声明无效无效打印实体(实体 e);
- 将矢量的整数内容打印为字符串会导致分割错误
- 为什么我的C++代码在以下打印链表的代码片段中显示分段错误?
- C++ 添加编译器警告,以错误使用自定义打印/日志功能
- 尝试用纯 c 编程 arduino,得到以下错误:预期的"="、""、";",'asm'或"打印"之前的'__attribute__'|
- Python - 从 c++ DLL 错误打印值
- 使用std :: String ptr的错误打印std :: String
- 枚举类的GoogleTest测试错误打印
- 分段错误:打印动态数组时为 11
- Ustring错误(打印期间)