我在排序通用链接列表时遇到问题。我有一个功能 接收链表和排序标准并根据它进行排序。 我在函数结束前打印列表并准确排序。但是,当我在函数完成后立即打印它时,列表再次未排序,但实际位于正确位置的第一个节点除外(应该首先放置的节点实际上放在第一个位置) ,但在此之后,列表的其余部分按相反的顺序排序。
例如,原始列表是6,7,5,4,3,2。在功能结束时 列表是2,3,4,5,6,7,但在排序功能结束后,列表是2,7,6,5,4,3。 我尝试了很多方法(冒泡排序,最大排序等),它们都给出了我描述的相同结果。有没有人知道可能是什么问题?
这是我的代码 -
ListResult listBubble(Node start,CompareListElements compare,CopyListElement copy){
Node iterator=start,last=NULL;
bool swapped=true;
while(swapped){
swapped=false;
iterator=start;
while(iterator->next!=last){
if(compare(iterator->info,iterator->next->info)>0){
printf("to swap: %s and %s\n",(char*)iterator->info,(char*)iterator->next->info);
if(swapNodes(&iterator,&(iterator->next),copy)!=LIST_SUCCESS){
return LIST_OUT_OF_MEMORY;
}
swapped=true;
}
iterator=iterator->next;
}
last=iterator;
}
return LIST_SUCCESS;
}
/*The "problematic" function*/
ListResult listSort(List list,CompareListElements compareElement){
RESULT_NULL_CHECK(list)//Checking the list is valid
RESULT_NULL_CHECK(compareElement)//Checking the camparing function is valid
if(listGetSize(list)<=1){
return LIST_SUCCESS;
}//Nothing to sort if only one node
ListResult el=listBubble(list->head,compareElement,list->copyFunction);
/*A printing of the list comes here*/
return el;
}
//Calling the function:
ASSERT_TEST(listSort(list,string_compare)==LIST_SUCCESS);
// *edit* code of swapNodes
static ListResult swapNodes(Node* node1,Node* node2, CopyListElement copy){
ListElement temp=copy((*node1)->info);
MEMORY_NULL_CHECK(temp)//checking if there was no memory allocation problem
(*node1)->info=copy((*node2)->info);
MEMORY_NULL_CHECK((*node1)->info)
(*node2)->info=copy(temp);
MEMORY_NULL_CHECK((*node2)->info)
return LIST_SUCCESS;
}