C語言 雙向鍊錶的快速排序

2021-10-21 23:33:54 字數 2329 閱讀 7296

之前一直想用雙向鍊錶來快排,想像陣列快排一樣給第乙個陣列下標(第乙個有值節點的指標)和最後乙個陣列下標(最後乙個有值節點指標),結果執行時經常有問題,程式有時會出錯,於是紙上演算了幾次發現會訪問到未知的記憶體.

因為當low和high在最左側或者最右側相同時,再經過一次呼叫時

box_qsort

(i,low->prev)

;box_qsort

(low->next,j)

;

可以發現因為最後乙個有值節點的next為null,當此時low為null,

box *key =

(box *

)malloc

(sizeof

(box));

//儲存節點資料

key->num = low->num;

low->num不存在,所以會導致程式異常.

而這樣解決方法我認為就是給最後乙個節點再連線乙個節點,這樣就沒有問題了,一切正常

不過要注意在展示鍊錶時不要展示了多加的那個節點

傻了,直接前面加乙個判斷就行了…

void

box_print

(box *box_head)

//顯示雙向鍊錶內容

printf

("\n");

}

以下是完整**的展示:

#

include

#include

typedef

struct

_box

//結構體

box;

box *

box_creathead()

//建立乙個頭節點

void

box_add

(box *box_head)

//頭插法建立雙向鍊錶

box_head->next = p;}}

void

box_qsort

(box *low,box *high)

//快排核心內容

key->num = low->num;

if(low==high||low->prev==high)

while

(low!=high&&low->prev!=high)

for(

;low!=high&&low->prev!=high&&key->num>=low->num;low=low->next);if

(key->numnum)

} low->num = key->num;

box_qsort

(i,low->prev)

;//這裡因為有了頭節點所以不用考慮

box_qsort

(low->next,j)

;//如果不給最後乙個有值的節點接乙個節點,就會訪問到不確定的記憶體

}void

box_print

(box *box_head)

//顯示雙向鍊錶內容

printf

("\n");

}box*

box_findbase

(box *box_head)

//找到鍊錶最後乙個節點

while

(p->next)

return p;

}//沒用..

void

box_creatbase

(box *high)

//為最後乙個節點接乙個空的節點

intmain()

展示下執行結果:

這個是普通陣列的快排**的展示:

#

include

//從小到大

voidqs(

int*a,

int low,

int high)

for(

;low=a[low]

;low++);

//從左往右找

if(key

a[low]

=key;

qs(a,i,low-1)

;qs(a,low+

1,j);}

intmain

(void

)}

如果有錯誤請您一定指出,我洗耳恭聽!

雙向鍊錶C語言

鍊錶結構定義 typedef struct node 建立鍊錶 int creat list struct node h h data 0 0 h llink null h rlink null return 1 清空鍊錶 int free list struct node h return 1 查...

C語言雙向鍊錶

雙向鍊錶基本結構 typedef struct pnode pnode 建立乙個雙向鍊錶,並列印出煉表中儲存的資料 include include 包含malloc函式 void main pnode 第乙個節點head pnode head malloc sizeof pnode head dat...

C語言雙向鍊錶

原文 c語言雙向鍊錶 今天寫了點雙向鍊錶的各種操作,寫插入的時候費了點時間,不過,現在看來還是值得耗費那點時間去寫的,這種小東西應該能信手拈來才行啊。1 雙向鍊錶 2 include 3 include strcmp const char const char return 0 is equal 4...