[英]Bubble sort linked list
我有以下兩個正在構建鏈表的結構:
struct Element {
int value;
struct Element *next;
};
struct List {
struct Element *first;
};
現在,我想用氣泡排序對鏈表進行排序。 我實現了sortList方法,該方法將當前元素的值與下一個元素的值進行比較。 如果下一個元素的值大於當前元素的值,則必須交換。 但是此刻它不能正常工作。
void sortList(List *list) {
Element *current = malloc(sizeof(Element));
current = list->first;
Element *nextElement = malloc(sizeof(Element));
nextElement = current->next;
Element *tmp = malloc(sizeof(Element));
tmp = NULL;
int changed = 1;
while (changed) {
changed = 0;
for (current; (current != NULL) && (nextElement != NULL); ) {
if (current->value > nextElement->value) {
tmp = current->next;
current->next = nextElement->next;
nextElement->next = tmp;
changed = 1;
}
current = current->next;
nextElement = nextElement->next;
}
}
}
for之后,在重新啟動while之前,必須設置current和nextElement指向列表的開頭! 否則他們不會改變,並且測試條件立即失敗。 另外,malloc的目的是什么? 您將current,next和temp僅用作指向節點的指針,而不用作真實節點,我認為您可以刪除所有這些指針。 而且,您可以僅使用條件將for重寫一段時間,它更具可讀性。 對不起我的英語不好。
編輯:正如在問題下所寫的,您需要更改列表內的指針。 我認為最簡單的方法是立即將較低的元素移到列表的開頭,然后更改列表的開頭以指向該元素。 之后,排序其余列表。
假設程序正在對現有列表進行排序,則沒有理由在sortList中分配節點,它應該只是在操縱指向現有節點的指針。
交換節點時,指向當前節點的指針需要更新,可以是list.first或Element.next。 使用指向指針的指針會使此操作變得容易一些。
struct Element **ppcur; /* pointer to list->first or element->next */
/* ... */
if(list == NULL || list->first == NULL)
return NULL;
for(ppcur = &(list->first); pnxt = (pcur = *ppcur)->next;
ppcur = &((*ppcur)->next)){
/* ... */
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.