簡體   English   中英

氣泡在鏈表上排序

[英]Bubble sort on linked list

我正在嘗試編寫冒泡排序的實現,以對鏈接列表進行排序,但此刻正在導致程序崩潰。

結構的定義方法如下:

typedef struct shopping_cart cart;
struct shopping_cart{
    char *item_name;
    int quantity;
    cart *next;
};

這是我的代碼:

void sort(cart *head){
    cart *i, *j;
    cart *second = get_second(head);
    cart *last = get_end_of_cart(head);

    for(i = second; i != NULL; i = i->next){
        for(j = head; j != last; j = j->next){
            if ((compare(j, j->next) > 0)){
                swap(j, j->next);
            }
        }
    }
}

void swap(cart *ptr1, cart *ptr2){
    cart *temp;
    temp = ptr1;
    ptr1 = ptr2;
    ptr2 = temp;
}

cart *get_end_of_cart(cart *head){
    cart *_next = head;

    while (_next->next != NULL){
        _next = _next->next;
    }

    return _next;
}


cart *get_second(cart *head){
    cart *first_item = head;
    cart *second_item = first_item->next;
    return second_item;
}

compare功能肯定有效,所以我不會在這里發布。 我很確定get_secondget_end_of_cart也可以使用。 所以我想我的錯誤是swapsort ,但我看不出問題出在哪里。

更改您的交換功能

void swap(cart **ptr1, cart **ptr2){
    cart *temp = *ptr1;
    *ptr1 = *ptr2;
    *ptr2 = temp;
}

您要做的是傳遞一個指針並在本地更改其值。 您需要改為傳遞指針的地址(指向指針的指針)。

確保在哪里使用swap功能,參數是cart指針的地址。

這是一個片段:

int main(int argc, char **argv) {
    cart *i = (cart *)malloc(sizeof(cart));
    cart *j = (cart *)malloc(sizeof(cart));
    i->item_name = "hello";
    j->item_name =" bla";
    i->next = j;
    printf("i %s\n", i->item_name);
    printf("j %s\n", j->item_name);
    swap(&i, &j);
    printf("i %s\n", i->item_name);
    printf("j %s\n", j->item_name);
}

輸出應為:

i hello
j  bla
i  bla
j hello

編輯

但是,在您的情況下,這是行不通的,因為地址已更改,這在最壞的情況下可能導致分段錯誤。 解決此問題的另一種方法是交換屬性。

void swap(cart *ptr1, cart *ptr2){
    char *tmp_name;
    int tmp_quantity;
    tmp_name = ptr1->item_name;
    tmp_quantity = ptr1->quantity;
    ptr1->item_name = ptr2->item_name;
    ptr1->quantity = ptr2->quantity;
    ptr2->item_name = tmp_name;
    ptr2->quantity = tmp_quantity;
}

現在,我們將不必處理next並希望獲得最好的結果。 我們只是在ij的屬性( item_namequantity )之間交換。

因此,代碼段應如下所示:

int main(int argc, char **argv) {
    cart *i = (cart *)malloc(sizeof(cart));
    cart *j = (cart *)malloc(sizeof(cart));
    i->item_name = "hello";
    j->item_name =" bla";
    i->next = j;
    printf("i %s\n", i->item_name);
    printf("j %s\n", j->item_name);
    swap(i, i->next);
    printf("i %s\n", i->item_name);
    printf("j %s\n", j->item_name);
}

多田! :D

我認為您不必在swap函數中更改購物車的屬性。 您唯一需要做的就是在要交換的項目之前指向元素的指針。

void swap(cart **first, cart **ptr1, cart **ptr2){
    (*first)->next = *ptr2;
    (*ptr1)->next = (*ptr2)->next;
    (*ptr2)->next = *ptr1;
}

我認為它可行,但是應該檢查一下。 如果以這種方式進行交換,請當心列表的開頭。

如果您不必對預制列表進行排序,則應按排序順序插入項目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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