2012-07-17 91 views
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; 

更新列表,以指向到端节点,并且每次我运行刀片(。 ..)列表的头更新指向结束(如果我没有错)。这是怎么回事?

回答

3

您没有使用指针正确指针:该线路while循环

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

应该

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

如果你使用这种方式,你就不需要你的temp可变。

既然这是C,而不是C++,那么可以不投malloc

+0

请您进一步解释两种情况之间的区别? – Smokie 2012-07-17 02:33:36

+0

@Smokie第一个是将'next'指针本身赋值给'l'指向的指针;第二个是将一个指针**分配给**'next'给变量'l'本身。 – dasblinkenlight 2012-07-17 02:39:45

1

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

0

如果您不移动指针l,那么它仍然在列表的头部。首先将l指定给temp,然后沿着列表移动temp,但只留下指针l。