gpt4 book ai didi

c - 冒泡排序双向链表

转载 作者:行者123 更新时间:2023-12-02 08:36:16 24 4
gpt4 key购买 nike

我的双向链表冒泡排序函数有问题。当我以单链接方式(仅使用 ->next)对节点进行排序时它可以工作,但我无法使用 ->prev 指针。这是我正在使用的代码:

void sort(int count)
{
struct data *tmp,*current,*nextone;
int i,j;
for(i=0;i<count;i++)
{
current = first;
for(j=0;j<count-1-i;j++ )
{
if(current->number > current->next->number)
{
nextone = current->next;
current->next = nextone->next;
nextone->next = current;
if(current == first)
{
first = nextone;
current = nextone;
}
else
{
current = nextone;
tmp->next = nextone;
}
}
tmp = current;
current = current->next;
}
}
}

这是我正在使用的结构(使用列表的第一个和最后一个元素的全局变量):

struct data    
{
int id;
char name[20];
int number;
struct data *next;
struct data *prev;
};

struct data *first = NULL;
struct data *last = NULL;

最佳答案

以下逻辑可行。

我会遵循类似的算法......如果你想移动整个节点......

struct data *before, *after;
if(current->number > current->next->number)
{
before = current->prev;
after = current->next;
if(before != NULL){
before->next = after;
}
current->next = after->next;
current->prev = after;
after->next = current;
after->previous = before;
}

或者,如果目的是对数据进行排序,您可以简单地交换节点中的数字,而不必费心移动整个节点。您可以扩展以下逻辑以包括 char 数组和 id 的交换。

if(current->number > current->next->number)
{
int tempNum = current->number;
current->number = current->next->number;
current->next->number = tempNum;
}

关于c - 冒泡排序双向链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21151705/

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