鍊錶排序交換節點為什麼還得單獨交換next指標?

2021-07-11 00:16:36 字數 1964 閱讀 5341

通過給鍊錶排序,交換節點時,明明已經交換資料域,後面還得交換next指標:

typedef struct node

node;

//鍊錶節點排序

int nodesort(node *phead)

node *ppre = null;

node *pcur = null;

node tmp; //臨時交換變數

//選擇法排序

for (ppre = phead->next; ppre != null; ppre = ppre->next)

}} return 0;

}

這是為什麼呢?下面給大家一步一步通過畫圖分析。

typedef struct node

node;

node *p1 = malloc( sizeof(node) );

p1->id = 1;

node *p2 = malloc( sizeof(node) );

p2->id = 2;

p1->next = p2;

p2->next = null;

我們將上面的**,畫一下記憶體四區圖(棧區、堆區、全域性區、**區),由於這裡只用到棧區和堆區,所以只畫棧區和堆區的示例圖,這裡需要使用指標的乙個規律:指標指向誰,就把誰的位址賦值給指標。

很多時候,我們畫鍊錶圖畫的都是簡潔圖:

下面通過畫圖說明一下鍊錶節點交換,為什麼還得交換next指標?

node tmp; //臨時交換節點

if (p1->id < p2->id) //降序

tmp = *p1;

將p1指向記憶體的值賦值給tmp對應的記憶體中。

將p2指向記憶體的值分別賦值給p1指向的記憶體。

將tmp記憶體的值賦值給p2指向記憶體中。

這樣操作完後,發現

p1的next指向null,p2的next指向p2本身,p1和p2兩個節點沒有關係。合理情況應該是,p1的next指向p2, p2的next指向null

所以,上面的交換,只是把資料域成功交換了,next指標域並不符合我們要求。

下面開始重新交換next指標域:

雙向鍊錶的插入排序(交換節點)

插入排序需要從後往前遍歷尋找可以插入的位置,所以會使用到雙向鍊錶 typedef struct node 定義的結構體 list 建立帶頭節點的雙鏈表 list create list printf 請輸入資料 輸入 1結束 for int i 0 i if head i 0 else if q r...

c語言雙鏈表排序交換節點 雙向鍊錶排序C語言程式

雙向鍊錶排序.cpp 定義控制台應用程式的入口點。include include include define len sizeof struct node struct node int data struct node next struct node last struct list stru...

鍊錶的氣泡排序 沒有頭結點,交換鍊錶節點

問題描述 對乙個沒有頭結點的鍊錶進行氣泡排序,如果出現逆序交換鍊錶的節點,而不是交換鍊錶的值。include include include include using namespace std struct listnode void bubblesort vector numbers,int ...