我正在尝试将项目添加到链接列表的末尾,或者只是在链接列表为空时添加项目。
到目前为止我已经
了struct node* curr=head;
struct node* newnode=malloc(sizeof(struct node));
newnode->data=item;
newnode->next=NULL;
if (curr == NULL){
curr=newnode;
}
else {
while(curr->next == NULL){
curr=curr->next;
}
curr->next=newnode;
}
return 1;
那么代码看起来如何?任何帮助搞清楚什么是错的都将不胜感激。
答案 0 :(得分:2)
这不起作用
if (curr == NULL){
curr=newnode;}
你需要这个:
if (curr == NULL){
head=newnode;}
你有curr的方式是一个指向新元素的局部变量,并且返回函数返回。你永远不会跟踪一个新的。
正如其他人所说,你需要在循环中!=
。
答案 1 :(得分:1)
我发现有一件事看起来很奇怪
while(curr->next == NULL){
curr=curr->next;}
怀疑你想要在没有一个节点的情况下进入下一个节点。你可能想要的是条件!=
,而不是==
答案 2 :(得分:0)
while(curr->next == NULL)
应该是
while(curr->next != NULL)
答案 3 :(得分:0)
需要进行一些更改:
如果您检查curr ==
NULL
while循环应为while (curr->next != NULL)
答案 4 :(得分:0)
这不会去任何地方,你从头开始,如果那不是空的那么你说“继续下去是空的”。如果下一个不是空的,你仍然会留在头上。
要在列表末尾添加,您需要以下内容:
else
{
while(curr->next != NULL) // keep going while curr->next is not null
{
curr = curr->next; // advance the pointer
}
// Here curr->next will definitely be null
curr->next = newnode; // now point curr->next to the new node
}
有人已经指出,在第一次检查中curr == NULL
的情况下,一旦执行了赋值,就不会返回指针,并且头部永远不会被初始化。
你可以通过在这个函数范围之外声明head
,或者在函数签名中有一个指向指针的方式来逃避它,例如:
int add_node(struct node** head) // I'll assume this is how you've declared your add function
// ^^ notice the pointer to pointer
{
struct node* curr = *head; // curr assignment changes slightly
struct node* newnode = malloc(sizeof(struct node));
newnode->data = item;
newnode->next = NULL;
if (curr == NULL)
{
*head = newnode; // this will dereference the pointer to the pointer and update head without returning anything
}
其余的保持不变。
答案 5 :(得分:0)
这可能是学习双指针习语的好机会,这对于执行链表的扫描修改非常有用。在您的情况下将是
struct node *newnode, **pnext;
newnode = malloc(sizeof *newnode);
newnode->data = item;
newnode->next = NULL;
for (pnext = &head; *pnext != NULL; pnext = &(*pnext)->next);
*pnext = newnode;
请注意,在此方法中,您不再需要任何分支。无论您是在列表的开头,中间还是结尾添加新元素,它都可以统一运行。