2013-12-20 70 views
0

下面是在雙鏈表中插入節點的代碼。雙鏈表列指針混淆

struct dllist 
{ 
    int data; 
    struct dllist *prev, *next; 
}; 


void DLLInsert(struct dllist **head, int position, int data) 
{ 
    int k = 1; 
    struct dllist *temp, *newNode; 
    newNode = (struct dllist *)malloc(sizeof(struct dllist)); 
    if (!newNode) 
    { 
     printf("Memory Error\n"); 
    } 
    newNode->data = data; 
    if (position == 1) 
    { 
     newNode->next = *head; 
     newNode->prev = NULL; 
     *head = newNode; 
     return; 
    } 
    else 
    { 
     temp = *head; 
     while (temp->next != NULL && k < position - 1) 
     { 
      k++; 
      temp = temp->next; 
     } 
     if (temp->next == NULL) 
     { 
      temp->next = newNode; 
      newNode->prev = temp; 
      newNode->next = NULL; 
     } 
     else 
     { 
      newNode->prev = temp; 
      newNode->next = temp->next; 
      temp->next = newNode; 
      temp->next->prev = newNode; 
     } 
    } 
} 

我在作爲新手的底層指針操作中有些困惑。一個**頭被傳遞給函數來修改它。但是,當位置> 1時,與位置== 1的情況相比,使用* head(temp)的副本來修改列表。有人可以解釋我爲什麼這樣嗎?

由於

+1

在一種情況下,您只需要修改'* head'指向的內容。另一方面,你需要修改指針本身。 (用紙盒和箭頭在紙上畫兩個盒子,你會明白爲什麼。) –

回答

1

當位置> 1時,溫度被設置爲*head,以及將碼迭代temp通過在索引position鏈表到該節點。實際上,您正在修改索引position處的節點。

當position = 1時,你正在修改頭節點,所以你不需要迭代。

+0

@ irrelephant-謝謝你的解釋。所以實際上,它意味着我可以通過將* head傳遞給一個函數來修改struct元素(即data,next和prev),但是要修改* head本身,我需要傳遞** head。我對麼? –

+0

是的,但我不明白這與關於鏈表的問題有什麼關係。要使用'DLLInsert()',你總是會傳遞'struct dlllist **'作爲'head'。 – irrelephant

1

position==1的情況下,您的新元素將成爲新的元首。你已經知道它到底在哪裏。否則,你需要找到位置。

temp = *head; 
     while (temp->next != NULL && k < position - 1) 

這是用來遍歷列表,直到找到要插入的位置上的元素。

temp = temp->next; 

分配給temp第一個元素是head,但它會被替換在每個迭代的下一個元素。