冒泡排序双链表

时间:2014-01-16 01:19:44

标签: c list sorting bubble-sort doubly-linked-list

我的双向链表的泡泡分拣功能有问题。 当我以单链接的方式对节点进行排序时(仅使用 - > 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;

3 个答案:

答案 0 :(得分:5)

以下逻辑可行。

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

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;
}

答案 1 :(得分:0)

一种更简单的方法就是复制节点的数据,你可以交换数据但指针指向节点。

if(current->number > current->next->number){
   swap(current->id,current->next->id);
   swap(current->name,current->next->name);
    swap(current->number,current->next->number);
}

使用您的方法,您根本不会设置前一个指针。您可以先将双链表排序为单个列表,然后再次遍历列表以设置所有上一个指针。

当然,您可以一次对双链表进行排序,但实现起来有点复杂。您应该考虑每个步骤4个节点,即current,current-&gt; next,以及current-&gt; prev和current-&gt; next-&gt; next。当你想要交换当前和当前 - >接下来, 你应该设置current->prev->next=current->next, current->next=current->next->next等等。

答案 2 :(得分:0)

你只需要坐下来思考一下。

先分配?那么前一个必须为空。

分配到最后? Next必须为null。

你需要做一些其他事情与之前的&amp;你正在交换的下一个元素。

一种更容易的方法(对于更大的数组大小也会很快变得更快)是分配一个指针数组,用指向元素的指针填充它们,然后对数组进行qsort然后执行另一次传递以重新连接指针(和删除临时数组。)

相关问题