冒泡排序链表

时间:2014-12-03 14:50:08

标签: c sorting linked-list bubble-sort

我有两个构建链表的结构:

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;
        }
    }
}

2 个答案:

答案 0 :(得分:0)

在for之后,在重新启动while之前,你必须设置指向列表开头的current和nextElement!或者他们没有改变,并且for的测试条件立即失败。 另外,mallocs的重点是什么?你只使用current,next和temp作为节点的指针,而不是真正的节点,我认为你可以删除所有这些节点。 并且你可以只用condtion重写for for,它更具可读性。 抱歉我的英文。

编辑:根据问题编写,您需要更改列表中的指针。我认为最简单的方法是立即在列表的开头移动下部元素,并更改列表的头部以指向此元素。之后对列表的其余部分进行排序。

答案 1 :(得分:0)

假设程序正在对现有列表进行排序,那么没有理由在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)){
    /* ... */