C++ 当使用动态分配列表时,我的程序从while循环停止工作

C++ 当使用动态分配列表时,我的程序从while循环停止工作,c++,C++,我一直在研究动态分配列表(我们现在在课堂上讨论的内容已经过时了),我似乎无法访问列表中的下一个节点。(我刚刚开始学习这个话题) 问题是我用来遍历列表的while循环从未停止过。我肯定错过了什么,我不明白是什么 struct node { int info; node* next; }; int main() { node *p, *prim=NULL; p = prim; node* t; t = new node; p->next

我一直在研究动态分配列表(我们现在在课堂上讨论的内容已经过时了),我似乎无法访问列表中的下一个节点。(我刚刚开始学习这个话题)

问题是我用来遍历列表的while循环从未停止过。我肯定错过了什么,我不明白是什么

struct node {
    int info;
    node* next;
};

int main()
{
    node *p, *prim=NULL;
    p = prim;
    node* t;
    t = new node;
    p->next = t;
    while (p != NULL)
    {
        cout << "test";
        p = p -> next;
    }
    return 0;
}
struct节点{
国际信息;
节点*下一步;
};
int main()
{
节点*p,*prim=NULL;
p=初始值;
节点*t;
t=新节点;
p->next=t;
while(p!=NULL)
{
下一步;
}
返回0;
}
这是代码

为什么我的程序不输出任何东西,还告诉我“它退出时代码为-1073741819”,而不是0

谢谢

////编辑:我忘了告诉你我也试过这种方法

struct node {
    int info;
    node* next;
};

int main()
{
    node *p, *prim=NULL;
    p = prim;
    node* t;
    t = new node;
    prim->next = t;
    while (p != NULL)
    {
        cout << "test";
        p = p -> next;
    }
    return 0;
}
struct节点{
国际信息;
节点*下一步;
};
int main()
{
节点*p,*prim=NULL;
p=初始值;
节点*t;
t=新节点;
prim->next=t;
while(p!=NULL)
{
下一步;
}
返回0;
}

让我们分析一下您的代码:

node *p, *prim=NULL;     // prim is NULL, p not yet initnialized
p = prim;                // p now equal to NULL as well
node* t;
t = new node;            // t is allocated
p->next = t;             // NULL->next = t

因此,当您尝试取消对分配的
p->next
的引用时,您遇到了一个空指针。

看起来您正在尝试设置一个基本的链表并在其中循环。您的循环看起来不错,但您忘记了实际设置列表的部分

这可能看起来像:

struct node {
    int info;
    node* next;
    //Add a quick constructor to make creating new nodes easy
    node(int i) : info(i), next(nullptr) { }
};

int main()
{
    //Start out with 3 itmes
    // This list will look like:
    //    head -> 5 -> 3 -> 1
    node *head = new node(5);
    head->next = new node(3);
    head->next->next = new node(1);

    //Loop through the list and print each value
    for(node *p = head; p; p = p->next) {
        std::cout << p->info << std::endl;
    }

    //Don't forget to delete the memory you allocated to prevent a leak!
    for(node *p = head; p;) {
        node *temp = p->next;
        delete p;
        p = temp;
    }

    return 0;
}
struct节点{
国际信息;
节点*下一步;
//添加一个快速构造函数,使创建新节点变得容易
节点(inti):信息(i),下一个(nullptr){
};
int main()
{
//从3个itmes开始
//此列表如下所示:
//头部->5->3->1
节点*头=新节点(5);
head->next=新节点(3);
head->next->next=新节点(1);
//循环浏览列表并打印每个值
用于(节点*p=head;p;p=p->next){

std::cout info不是
p
等于
NULL
?首先是的。PRIM应该是列表的头。之后,我在下一个节点(在本例中为t)旁边设置了p->,我认为它也在t旁边设置了头->,因为p=PRIM。(我说得对吗?)在下一个节点旁边设置p->因为p是NULL@JohnSmith您不能设置
p->next
,因为没有
p
可以为其设置
next
。您不能在空指针上使用
->
。@drescherjm所以我应该初始化p或头(在我的代码中是PRIM).是这样吗?所以我需要初始化prim而不是将其设置为NULL?列表的开头应该如何定义?取决于您希望您的程序做什么。您应该告诉我这一点,这样我才能给出更好的建议。:)我很久以前就研究过列表,现在显然迷路了。我正在尝试重新学习它们。基本上,这应该是一个basic动态列表(带头部和尾部)其中结构的每个“info”成员都包含一个数字。我必须输出每个数字。我还没有遇到构造函数。你能删除该部分并编辑代码,使其不使用该行吗?@John构造函数只是一种奇特而简单的方法,可以将
info
设置为我传递的任何值,并将
next
设置为
nullptr
。如果你想像
node*head=new node;head->info=5;head->next=nullptr;
,你可以在
main()
的主体中手动执行。但是对于将来有同样问题的人,我宁愿把我的答案保留为“正确”这是最干净的方式。很抱歉反应太晚。谢谢你抽出时间,我现在明白了。