問題就像這樣:我必須通過更改節點(不是其中的值)來對雙鏈表進行排序。 所以,可以說我有此列表:如何使用指針更改雙鏈表中的2個節點? C
struct DataNode {
char* name;
int number;
};
struct QSNode {
DataNode* data;
QSNode* prev;
QSNode* next;
};
我創建具有數據3個節點:(A 1,B 2,C 3)。
現在,我想要做的是與C 3交換A 1,所以它看起來像這樣(C 3,B 2,A 1),但不會更改值,而是實際節點。 現在,我這樣做,通過使用該功能:
QSNode* interchangeNodes(QSNode* list, QSNode* first, QSNode* second) {
QSNode* mark1 = first;
QSNode* mark2 = second;
first->next = second->next;
second->next = first;
first->prev->next = second;
second->prev = first->prev;
second->next->prev = first;
first->prev = second;
QSNode* mark3 = second;
second = first;
first = mark3;
if (mark1 == list)
return first;
else
if (mark2 == list)
return second;
else
if (mark2 == list->prev){
list->prev = second;
return list;
}
else
return list;
}
爲什麼它看起來像這樣?因爲即使我改變了節點,比如說:C 3,B 2,A 1,我希望C 3成爲我的標題。所以當我調用函數來預覽列表中的數據時,C 3將是第一個。
void previewList(QSNode* list) {
QSNode* marker = list;
while (list->next != marker) {
cout << "Name: " << list->data->name << " Number: " << list->data->number << endl;
list = list->next;
}
cout << "Name: " << list->data->name << " Number: " << list->data->number << endl;
}
好的,現在的問題。當我嘗試對它進行排序(重點不是要銷燬列表並重新排列它,而是要更改節點的指針)。
好的,問題是我嘗試了很多選項,我不在乎複雜性在這一點上,所以泡泡排序可以工作。問題就在這裏:
QSNode* sortFinale1(QSNode* list){
int count = 1;
QSNode * tmp = list;
while (tmp->next != list) {
if (tmp->data->number > tmp->next->data->number){
list = interchangeNodes(list, tmp, tmp->next);
}
tmp = tmp->next;
}
return list;
}
注:此功能只是測試一個,表明一個迭代後一個節點不指向。
我嘗試製作一個tmp,以便我的列表保持不變並且行爲類似於數組。但問題是我失去了聯繫。 輸入:
Name4 3
Name3 4
Name2 1
Name1 2
預覽列表輸出& &調用sortFinale1功能:
我的猜測是,我失去了一些東西:
與交流輸出在那種結局1條件。
節點雜耍在鏈表是所有關於改變*指針*點到這些節點。慢慢來,如何做到這一點將變得更加清晰。 – WhozCraig
你確定*新列表應該是「C 3,B 2,C 3」而不是「C 3,B 2,A 1」?如果你想排序你通常*交換*「元素」(你的情況下的節點),並且名稱「交換」也意味着節點彼此交換位置。 –
*交換雙鏈表中的*節點實際上非常簡單:跟蹤兩個節點中的每個節點的上一個節點和下一個節點,並使它們的上一個/下一個鏈接指向交換中的另一個節點,最後更新您交換的節點將它們的前/後鏈接指向正確的節點。試着先在紙上做,然後當你認爲自己做得正確時,嘗試編碼。 –