对通用链表进行排序

时间:2016-05-06 12:51:13

标签: c sorting linked-list nodes

我在排序通用链接列表时遇到问题。我有一个功能 接收链表和排序标准并根据它进行排序。 我在函数结束前打印列表并准确排序。但是,当我在函数完成后立即打印它时,列表再次未排序,但实际位于正确位置的第一个节点除外(应该首先放置的节点实际上放在第一个位置) ,但在此之后,列表的其余部分按相反的顺序排序。

例如,原始列表是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;
}

0 个答案:

没有答案