C++ 为什么在尝试将新节点插入列表时出错

C++ 为什么在尝试将新节点插入列表时出错,c++,list,struct,header,stack,C++,List,Struct,Header,Stack,我有一个声明堆栈和列表的头。 我试图将的节点添加到列表中,但失败。 有人能帮我找出为什么这个函数不起作用吗 ****这两种代码都是标题中的偏差*** /* a link that contains a positive integer value*/ struct link { int value; struct link *next; }; 现在我想做的是: void add(linkedList *list, int newValue) { linkedList*

我有一个声明堆栈和列表的头。 我试图将的节点添加到列表中,但失败。 有人能帮我找出为什么这个函数不起作用吗

****这两种代码都是标题中的偏差***

/* a link that contains a positive integer value*/
struct link
{
    int value;
    struct link *next;
};

现在我想做的是:

void add(linkedList *list, int newValue)
{
    linkedList* temp = list;


    while (temp->head)
    {
        temp->head = temp->head->next;
    }


    temp->head->next->value = newValue;   //<---- this line is making the error
}

// add new link in the beginning of list with newValue in it
void添加(linkedList*列表,int newValue)
{
linkedList*temp=列表;
while(临时->头部)
{
温度->头部=温度->头部->下一步;
}

temp->head->next->value=newValue;//在
add
中,您当前正在修改
temp->head
以遍历列表。
temp
是一个局部变量,但它指向真正的链接列表,因此当您指定给
temp->head
时,它正在修改列表本身的结构

我猜你的真正意图更像是:

void add(linkedList *list, int newValue)
{
    link *temp = list->head;

    while (temp->next != nullptr)
        temp = temp->next;

    link *node = new node;
    node->next = nullptr;
    node->value = newValue;
    temp->next = node;
}
但是,对于堆栈,在添加新项之前,不需要(或不希望)遍历列表

void add(linkedList *list, int newValue) {
    link *node = new link;
    node->next = list->head;
    node->value = newValue;
    list->head = node;
}

不过,和往常一样,使用链表(如果你有选择的话)要三思。至少在我的经验中,它很少是真正有用的数据结构(特别是在这样的情况下,在典型的64位实现中,存储小项目时,每个节点都是32位int和64位指针,因此指针占用的空间是数据本身的两倍。

add
中,您当前正在修改
temp->head
以遍历列表。
temp
是一个局部变量,但它指向真正的链表,因此当您指定给
temp->head
时,它会修改链表本身的结构

我猜你的真正意图更像是:

void add(linkedList *list, int newValue)
{
    link *temp = list->head;

    while (temp->next != nullptr)
        temp = temp->next;

    link *node = new node;
    node->next = nullptr;
    node->value = newValue;
    temp->next = node;
}
但是,对于堆栈,在添加新项之前,不需要(或不希望)遍历列表

void add(linkedList *list, int newValue) {
    link *node = new link;
    node->next = list->head;
    node->value = newValue;
    list->head = node;
}

不过,和往常一样,使用链表(如果你有选择的话)要三思。至少在我的经验中,它很少是真正有用的数据结构(特别是在这样的情况下,在典型的64位实现中,存储小项目时,每个节点都是32位int和64位指针,因此指针占用的空间是数据本身的两倍。

不确定“不工作”是什么意思一个明显的问题是,当
temp->head
NULL
时,您的
while
循环结束,然后在
while
循环后的下一个语句中,您尝试使用
temp->head->next
(NULL)->下一步
。这是有问题的。类似地,您将
temp1
设置为
NULL
,切勿在
while
循环中修改它,然后尝试访问
temp1->head
,即
(NULL)->head
。如果在调试器中运行程序,则可以检查所有这些。不工作意味着每次我尝试在堆栈内的列表中放置另一个链接时,它都会显示一个错误消息,并向我显示子head参数(值)和(下一个)无法在内存中读取,但关于您之前所说的内容,请确定我可以删除temp1,但我如何处理while?请添加确切的错误消息(即复制和粘贴)进入问题。哪一行代码导致错误?练习1.exe中0x00E84600处的错误消息未处理异常:0xC0000005:访问冲突读取位置0x00000004。我在代码(最后1)中编辑了它。Neli Kirk不确定“不工作”是什么意思一个明显的问题是,当
temp->head
NULL
时,您的
while
循环结束,然后在
while
循环后的下一个语句中,您尝试使用
temp->head->next
(NULL)->下一步
。这是有问题的。类似地,您将
temp1
设置为
NULL
,切勿在
while
循环中修改它,然后尝试访问
temp1->head
,即
(NULL)->head
。如果在调试器中运行程序,则可以检查所有这些。不工作意味着每次我尝试在堆栈内的列表中放置另一个链接时,它都会显示一个错误消息,并向我显示子head参数(值)和(下一个)无法在内存中读取,但关于您之前所说的内容,请确定我可以删除temp1,但我如何处理while?请添加确切的错误消息(即复制和粘贴)进入问题。哪行代码导致错误?练习1.exe中0x00E84600处的错误消息未处理异常:0xC0000005:访问冲突读取位置0x00000004。我在代码中编辑了它(最后1)Neli Kirk感谢您的回答@Jerry Coffin它工作得很好(希望我能够理解我在那里的错误)但请相信我,我告诉你:我别无选择:(但如果我能再问你一个问题……在我做了一个链接后,我如何删除链接?@TotalyNotUbisoft:通常是尽量保留一个问题……一个问题。如果你还有其他问题,请继续发布另一个问题。谢谢你的回答@Jerry Coffin它工作得很好(希望我能理解我的错误)但请相信我,当我告诉你这一点时:我别无选择:(但如果我能再问你一个问题…我在做了一个链接后如何删除链接?@TotalyNotUbisoft:通常是尽量保留一个问题…一个问题。如果你有另一个问题,继续并发布另一个问题。