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