2012-07-17 107 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。