gpt4 book ai didi

C 链表只包含第一个元素......不知道剩下的会发生什么

转载 作者:太空宇宙 更新时间:2023-11-04 04:08:56 24 4
gpt4 key购买 nike

我几天前发布了一个关于 C 中链表的问题。我认为一切正常,然后教授给我们发电子邮件说,而不是这个签名:

int insert_intlist( INTLIST* lst, int n); /* Inserts an int (n) into an intlist from the beginning*/

他无意中的意思是:

int insert_intlist( INTLIST** lst, int n); /* Inserts an int (n) into an intlist from the beginning*/

我觉得自己很酷,因为我有一个指向指针的指针,我可以将指针移到 main 之外,当我返回 main 时,我仍然会有完整的链表。

他首先给了我们这个:

INTLIST* init_intlist( int n ) 
{
INTLIST *lst; //pointer to store node
lst = (INTLIST *)malloc(sizeof(INTLIST)); //create enough memory for the node
lst->datum = n; //set the value
lst->next = NULL; //set the pointer
return lst; //return the new list
}

这只是在 main 中像这样初始化列表:

   if (lst==NULL)
lst = init_intlist(i);
else
insert_intlist(lst, i);

lst 是 INTLIST* 类型,所以它被定义为 INTLIST* lst。所以我从文本文件中读取了一些数字,例如 1 3 4 9。它应该从这个创建一个链接列表......所以第一个数字将转到 init_intlist(1);这是上面定义的。然后在本例中获取下一个数字 3 并调用 insert_intlist(lst, 3)。好吧,这是我的 insert_intlist,我想做的就是在列表的开头插入:

int insert_intlist(INTLIST** lst, int n )
{
INTLIST* lstTemp; //pointer to store temporary node to be added to linked list
lstTemp = (INTLIST *)malloc(sizeof(INTLIST)); //create enough memory for the node
lstTemp->datum = n; //assign the value

//check if there is anything in the list,
//there should be, but just in case
if(*lst == NULL)
{
*lst=lstTemp;
lstTemp->next=NULL;
}
else
{
lstTemp->next = *lst; //attach new node to the front
*lst = lstTemp; //incoming new node becomes the head of the list
}

return 0;
}

因此,如果列表最初包含 1,则此函数将简单地创建一个新节点,然后使此临时节点->next 指向列表的头部(我认为是 lst),然后将列表的头部重新分配给这个新的临时节点。

一切看起来都在正常运行,但是当我尝试将我的列表打印到屏幕上时,它只打印出数字 1。

有人知道我做错了什么吗?

最佳答案

您正在传递一个指向指针的指针。您想要更改指向的指针,而不是指向指针本身的指针。这有意义吗?

if(lst == NULL)

在这里,您要检查是否向您传递了 NULL 指针。错误检查的良好做法,但不是您在那里所做的事情。如果 lst 为 NULL,那么您甚至没有指向指针的指针,不能做任何事情,应该返回一个非零错误代码而不做任何其他事情。

一旦您确定您的指针不为 NULL,然后您将查看它指向的指针 (*lst)。指向指针是指向第一个列表项的指针。如果 that 指针为 NULL,then 您将其更改为新项目的指针。基本上,在使用 lst 的地方,您应该使用 *lst(*lst)。 (记住:* 运算符在 -> 运算符之后运行 !所以要获取指针指向的对象中的字段通过 lst [pant, pant],你使用 (*lst)->whatever。)

附言这种指针工作对于学习成为一名优秀的程序员来说至关重要,尤其是对于 C。

附言你弄错的另一件事是,而不是

insert_intlist(lst, i);

你应该这样调用它

insert_intlist(&lst, i);

...并且,对于布朗尼积分,检查返回码是否有错误。

关于C 链表只包含第一个元素......不知道剩下的会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2122108/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com