我试图创建链接列表插入函数,该函数接受一个列表(或更正确地指向它的指针),然后将值插入列表的末尾。
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(...)时,列表的头部都会更新为指向结尾(如果我没错)。这是怎么回事?
答案 0 :(得分:3)
您没有正确使用指针指针:while
循环中的这一行
(*l) = (*l)->next;
应该是
l = &((*l)->next);
如果您以这种方式使用它,则根本不需要temp
变量。
由于这是C而不是C ++,因此不能转换malloc
。
答案 1 :(得分:1)
如果函数插入空列表,则只应更改* l,因为这是列表的第一个元素发生更改的唯一情况。这可以通过在函数内部使用局部变量而不是* l来实现(初始化为* l)。
答案 2 :(得分:0)
如果你不移动指针l,那么它仍然在列表的头部。首先将l分配给temp,然后沿列表移动temp,但只留下指针l。