我试图编写一个冒泡排序实现来对链表进行排序,但目前它导致我的程序崩溃。
这里是如何定义结构的:
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
,但我无法查看问题所在。
答案 0 :(得分:2)
更改交换功能
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
答案 1 :(得分:0)
我认为您不必在交换功能中更改购物车的属性。您需要的唯一东西是在要交换的项目之前指向元素的指针。
void swap(cart **first, cart **ptr1, cart **ptr2){
(*first)->next = *ptr2;
(*ptr1)->next = (*ptr2)->next;
(*ptr2)->next = *ptr1;
}
我认为它有效,但应该检查一下。如果您以这种方式进行交换,请注意列表的开头。
如果您不必对预制列表进行排序,则应按排序顺序插入项目。