我正在尝试做一个简单的插入节点来链接列表的最后位置。但我遇到了麻烦。
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
struct Node
{
int data;
struct Node* next;
};
Node* Insert(Node* head, int data);
Node* print(Node* head);
void ReverseIterative();
Node* Insert(Node* head, int data)
{
Node* newNode;
newNode->data = data;
newNode->next = NULL;
if(head == NULL)
{
return newNode;
}
Node* curr=head;
while(curr->next!=NULL)
{
curr=curr->next;
}
curr->next = newNode;
return head;
}
Node* printList(Node* head)
{
while(head)
{
cout<<head->data;
head=head->next;
}
cout<<endl;
}
int main()
{
struct Node* head = NULL;
head = Insert(head, 2);
head = Insert(head, 4);
printList(head);
return 0;
}
我不确定我做错了什么。请帮忙〜!我查看了我的逻辑,一切都应该是正确的。这可能是我在insert()中创建新节点的方式。我认为我的语法有问题,但我不确定它是什么。发生这种情况时我真的很讨厌......
感谢您的帮助
答案 0 :(得分:2)
在Insert
功能中,您永远不会分配newNode
。
Node* newNode;
你需要像这样分配它:
Node* newNode = new Node();
修复此程序后程序正确运行,输出为:
24
修改强> 关于下面的评论,以下行不分配任何内容:
Node* newNode;
struct Node* newNode;
它们只是声明变量,因为您已将它们标识为指针(*
)。指针只指向堆上的对象。为了在堆上实际创建对象,您需要使用new Node()
。
程序崩溃的原因是你试图从尚未初始化的指针访问内存。
如果您愿意,可以使用malloc
,但是您使用C ++进行编程,因此一般情况下,除非您确实需要,否则永远不要使用malloc
。
如果您使用的是兼容的编译器,请使用shared_ptr,然后您就不必担心delete
new
的事情。
答案 1 :(得分:0)
除了Node* newNode
分配(未初始化的变量错误)之外,以下内容将抛出返回值错误:
Node* printList(Node* head)
{
while (head)
{
cout << head->data;
head = head->next;
}
cout << endl;
}
您已将Node*
设置为返回类型,但此函数没有return
值。因为此函数正在打印您的列表,所以它不需要返回任何内容。将返回类型更改为void
。