链表

时间:2015-05-22 07:10:15

标签: c sorting data-structures struct 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,但我无法查看问题所在。

2 个答案:

答案 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并希望最好。我们只是在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

答案 1 :(得分:0)

我认为您不必在交换功能中更改购物车的属性。您需要的唯一东西是在要交换的项目之前指向元素的指针。

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

我认为它有效,但应该检查一下。如果您以这种方式进行交换,请注意列表的开头。

如果您不必对预制列表进行排序,则应按排序顺序插入项目。