C 链表插入函数-通过指针传递列表

C 链表插入函数-通过指针传递列表,c,pointers,data-structures,linked-list,C,Pointers,Data Structures,Linked List,我正在尝试创建链表插入函数,该函数接受一个列表(或者更准确地说是指向它的指针),然后将值插入到列表的末尾 void ll_insert(struct ll **l, int n){ struct ll *temp=NULL; while ( (*l) != NULL){ temp= (*l); (*l) = (*l)->next; } (*l)= (struct ll*)malloc(sizeof(struct ll)); (*l)->n=n;

我正在尝试创建链表插入函数,该函数接受一个列表(或者更准确地说是指向它的指针),然后将值插入到列表的末尾

void ll_insert(struct ll **l, int n){
  struct ll *temp=NULL;
  while ( (*l) != NULL){
    temp= (*l);
    (*l) = (*l)->next;
  }
  (*l)= (struct ll*)malloc(sizeof(struct ll));
  (*l)->n=n;
  (*l)->next=NULL;
  if (temp) temp->next= (*l);
}


int main(void){
  struct ll *l=NULL;                                                                                                                                                         
  ll_insert(&l, 1);
  printf("%d ", l->n);
  ll_insert(&l, 1);
  ll_insert(&l, 2);
  ll_insert(&l, 3);
  printf("%d ", l->n); 

}
运行上述代码后的输出为13。这并不奇怪,因为

(*l) = (*l)->next;

更新列表以指向结束节点,并且每次运行insert(…)时,列表的头部都会更新为指向结束(如果我没有错的话)。解决这个问题的方法是什么?

您的函数只有在插入到空列表中时才应该更改*l,因为这是列表第一个元素更改的唯一情况。这可以通过在这些情况下(初始化为*l)在函数内部使用局部变量而不是*l来实现。

如果函数插入到空列表中,则只应更改*l,因为这是列表第一个元素更改的唯一情况。在这些情况下,可以在函数内部使用局部变量而不是*l(初始化为*l)。

您没有正确使用指向指针的指针:这一行在
while
循环中

(*l) = (*l)->next;
应该是

l = &((*l)->next);
如果这样使用,就根本不需要
temp
变量


因为这是C,不是C++,不可以执行<代码> MalOC/<代码> .< /p> :您没有正确使用指针:在<代码>中的这行,而Loo>

(*l) = (*l)->next;
应该是

l = &((*l)->next);
如果这样使用,就根本不需要
temp
变量


因为这是C,不是C++,不可以执行<代码> MalOC/ .< /P> < P>如果你不移动指针L,那么它仍然在列表的头上。首先将l指定给temp,然后沿列表移动temp,但不要移动指针l。

如果不移动指针l,它将保持在列表的开头。首先将l分配给temp,然后沿列表移动temp,但不要使用指针l。

请您进一步解释这两种情况之间的区别好吗?@Smokie第一种情况是将指针
分配给
l
指向的指针,然后将其自身分配给
l
;第二种是将指向
next
的指针赋值给变量
l
本身。请您进一步解释这两种情况之间的区别好吗?@Smokie第一种是将指针
next
本身赋值给
l
所指向的指针;第二个是将指向
next
的指针赋值给变量
l
本身。