我有两个构建链表的结构:
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;
}
}
}
答案 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)){
/* ... */