[英]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_second
和get_end_of_cart
也可以使用。 所以我想我的錯誤是swap
或sort
,但我看不出問題出在哪里。
更改您的交換功能
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
並希望獲得最好的結果。 我們只是在i
和j
的屬性( item_name
和quantity
)之間交換。
因此,代碼段應如下所示:
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.