插入链接列表

时间:2016-02-22 23:37:47

标签: 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);
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()中创建新节点的方式。我认为我的语法有问题,但我不确定它是什么。发生这种情况时我真的很讨厌......

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

Insert功能中,您永远不会分配newNode

Node* newNode;

你需要像这样分配它:

Node* newNode = new Node();

修复此程序后程序正确运行,输出为:

24

http://ideone.com/16XL5W

修改 关于下面的评论,以下行不分配任何内容

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