C++ 插入链表

C++ 插入链表,c++,linked-list,C++,Linked List,我正在尝试做一个简单的插入节点到链表的最后一个位置。但是我遇到了麻烦 #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);

我正在尝试做一个简单的插入节点到链表的最后一个位置。但是我遇到了麻烦

#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;
}
#包括
#包括
#包括
使用名称空间std;
结构体类型
{
int数据;
结构节点*下一步;
};
节点*插入(节点*头部,整数数据);
节点*打印(节点*头);
无效反向运算();
节点*插入(节点*头,整数数据)
{
节点*新节点;
新建节点->数据=数据;
newNode->next=NULL;
if(head==NULL)
{
返回newNode;
}
节点*curr=头部;
while(当前->下一步!=NULL)
{
当前=当前->下一步;
}
curr->next=newNode;
回流头;
}
节点*打印列表(节点*头)
{
while(head)
{
coutnext;
}

cout在
Insert
函数中,您从不分配
newNode

Node* newNode;
您需要这样分配它:

Node* newNode = new Node();
修复此问题后,程序正常运行,输出为:

24

编辑: 关于您在下面的评论,以下几行不分配任何内容

Node* newNode;
struct Node* newNode;
它们只是声明变量,因为您已将它们标识为指针(
*
)。指针只是指向堆上的对象。为了实际在堆上创建对象,您需要使用
新节点()

程序崩溃的原因是您试图从尚未初始化的指针访问内存

如果你想使用,可以使用<代码> Malc C/代码>,但是你在C++中编程,所以作为一个一般规则,除非你真的需要,否则永远不要使用<代码> MalOC 。
如果您使用的是兼容编译器,请使用s,那么您就不必担心
删除
新的

除了
节点*newNode
分配(未初始化变量错误)之外,还将抛出返回值错误:

Node* printList(Node* head)
{
    while (head)
    {
        cout << head->data;
        head = head->next;
    }
    cout << endl;
}
节点*打印列表(节点*头)
{
while(head)
{
cout数据;
头部=头部->下一步;
}

不能“遇到麻烦”不是对你的问题的很好的描述,是吗?请具体一点。为什么你会认为这是你的语法?你是否遇到了编译器错误?如果是,那是什么?最好停止查看代码并使用调试器逐步完成它。指针会指向你的一个。你从来不会在这一行上分配
newNode
 Node*newNode;
@telenobies“代码是可编译的”,对于在调试器中运行代码的请求,这是一个非常错误的响应。这种情况经常出现,而且总是错误的轨迹。请注意,对链表使用共享指针限制了它们的分配深度。@πάνταῥεῖ 一个很好的观点。在这种情况下,这没有多大意义,但在更高级的应用程序中,
shared_ptr
s在大多数情况下是首选的。我现在正在阅读C编程语言。其中一个例子是Struct point makepoint(int x,int y){Struct point temp;…return temp;}。它不做Struct point temp=new point()在这种情况下,它调用的函数返回一个
对象(不是指针)。你应该仔细阅读堆和堆栈分配之间的区别。看看这个家伙的例子。在他的反转函数中,他只有struct Node*curr、*pre、*next。我很困惑。。。