簡體   English   中英

氣泡排序鏈表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM