2017-07-04 139 views
0

我有這個鏈表如何交換C中鏈接列表中的兩個節點?

struct Link 
{ 
    frame_t *frame; 
    struct Link *next; 
}; 

現在我想更換兩個是與函數swap(),因此,例如交換節點(表4,7)會給我

[1, 2, 3, **7**, 5, 6, **4**, 8, 9, 10] 

對於用的

[1, 2, 3, **4**, 5, 6, **7**, 8, 9, 10] 

內容的列表清單我想這樣做是我真正需要更換那些之前使用節點,但我得到了無限循環和節點醫管局已被切斷。

link_t* tmp = currPrev->next; 
link_t* tmpTwo = linkToChangePrev->next; 
tmpTwo->next = tmp->next; 
currPrev->next = tmpTwo; 
tmp->next = tmpTwo; 
linkToChangePrev->next = tmpTwo; 

什麼是最有效的方式來更改鏈接列表中的兩個節點?

+0

什麼是「frame_t」,爲什麼指向它的指針在您的示例中表示爲整數? – unwind

+0

https://stackoverflow.com/questions/1535988/swapping-nodes-on-a-single-linked-list – rsp

+0

儘管其中一個重複問題標記爲C++,但操作代碼與C代碼相同(但交換函數確實包含一個'cout << ... << endl;'行,這是純C++)。這涵蓋了更一般的情況;純粹的C問題涵蓋了更加有限的交換相鄰節點的情況。請注意,C++問題中的一個建議是交換有效載荷,而不是交換指針 - 這具有很大的優點,因爲可以在交換節點之前不需要了解節點的任何信息。 –

回答

1

你的問題有點不足,如果要交換的元素出現多次,會發生什麼情況?

假設它的確定只是交換第一的情況下,我肯定會寫代碼,做兩個步驟:

  1. 查找拿着交換的數據元素。
  2. 交換它們。

也許是這樣的:

const struct Node * find_node(const struct Node *list, frame_t *value) 
{ 
    while(list != NULL) 
    { 
    if(list->frame == value) 
     return list; 
    } 
    return NULL; 
} 

void swap(struct Node *list, frame_t *value1, frame_t *value2) 
{ 
    struct Node *el1 = (struct Node *) find_node(list, value1); 
    struct Node *el2 = (struct Node *) find_node(list, value2); 
    if(el1 != NULL && el2 != NULL) 
    { 
    const frame_t * const f1 = el1->frame; 
    el1->frame = el2->frame; 
    el2->frame = f1; 
    } 
} 

這將簡單地交換兩個首次發現的情況下,如果有重複。

+0

這會更好地向他展示重複的問題。 – tilz0R

+0

函數是不是應該將Link **作爲輸入,還是將指針返回給列表頭?如果其中一項是頭部,則列表的頭部會改變。 –

+0

我讀了這個問題,因爲他希望根據*值*而不是列表中的位置找到要交換的項目。因此,您必須遍歷列表以找到兩個值的位置,然後交換 – JeremyP