gpt4 book ai didi

c - 通过对实际节点进行排序而不仅仅是通过交换节点值来对链表进行排序

转载 作者:行者123 更新时间:2023-11-30 17:04:01 25 4
gpt4 key购买 nike

我想对链接列表进行排序,以便节点按排序顺序排列。我查找了几种算法,但它们都交换数据值而不是实际的节点本身。有谁知道我在哪里可以找到一些关于如何交换节点本身而不仅仅是值的代码?

最佳答案

这是对链表进行合并排序的传统且最快的方法。它是一种自下而上风格的合并排序,它使用指向节点的指针数组来保存中间列表,其中 array[i] 要么为 null,要么指向具有 2 的 i 次方节点的列表。原始列表中的节点被合并到数组中,然后数组中的列表被合并以形成单个排序列表。 HP/Microsoft C++ STL std::list::sort 使用相同的算法。

/* prototype */
NODE * MergeLists(NODE *pSrc1, NODE *pSrc2);

/* sort list using array of pointers to first nodes of list */
/* aList[i] = NULL or ptr to list with 2 to the power i nodes */

#define NUMLISTS 32 /* size of array */
NODE * SortList(NODE *pList)
{
NODE * aList[NUMLISTS]; /* array of lists */
NODE * pNode;
NODE * pNext;
int i;
if(pList == NULL) /* check for empty list */
return NULL;
for(i = 0; i < NUMLISTS; i++) /* zero array */
aList[i] = NULL;
pNode = pList; /* merge nodes into array */
while(pNode != NULL){
pNext = pNode->next;
pNode->next = NULL;
for(i = 0; (i < NUMLISTS) && (aList[i] != NULL); i++){
pNode = MergeLists(aList[i], pNode);
aList[i] = NULL;
}
if(i == NUMLISTS) /* don't go past end of array */
i--;
aList[i] = pNode;
pNode = pNext;
}
pNode = NULL; /* merge array into one list */
for(i = 0; i < NUMLISTS; i++)
pNode = MergeLists(aList[i], pNode);
return pNode;
}

/* mergelists - compare uses src2 < src1 */
/* instead of src1 <= src2 to be similar to C++ STL */

NODE * MergeLists(NODE *pSrc1, NODE *pSrc2)
{
NODE *pDst = NULL; /* destination head ptr */
NODE **ppDst = &pDst; /* ptr to head or prev->next */
if(pSrc1 == NULL)
return pSrc2;
if(pSrc2 == NULL)
return pSrc1;
while(1){
if(pSrc2->data < pSrc1->data){ /* if src2 < src1 */
*ppDst = pSrc2;
pSrc2 = *(ppDst = &(pSrc2->next));
if(pSrc2 == NULL){
*ppDst = pSrc1;
break;
}
} else { /* src1 <= src2 */
*ppDst = pSrc1;
pSrc1 = *(ppDst = &(pSrc1->next));
if(pSrc1 == NULL){
*ppDst = pSrc2;
break;
}
}
}
return pDst;
}

关于c - 通过对实际节点进行排序而不仅仅是通过交换节点值来对链表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35952586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com