1

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

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); 

}

运行上述代码后的输出是 1 3。这并不奇怪,因为

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

更新列表以指向结束节点,并且每次我运行 insert(...) 时,列表的头部都会更新为指向末尾(如果我没有错的话)。这有什么办法?

4

3 回答 3

3

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

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

应该

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

如果您以这种方式使用它,则根本不需要您的temp变量。

由于这是 C,而不是 C++,因此可以不强制转换malloc.

于 2012-07-17T01:19:06.407 回答
1

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

于 2012-07-17T01:18:50.427 回答
0

如果你不移动指针 l,那么它仍然在列表的头部。首先将 l 分配给 temp,然后将 temp 沿列表移动,但不理会指针 l。

于 2012-07-17T01:27:16.977 回答