排序链表

时间:2013-08-13 09:08:55

标签: c sorting linked-list

我在链接列表中排序时遇到了一些问题。 我有一个双重链表,需要在输入后进行排序,交换功能是我打算使用的,但这里的问题在于它搞砸了可能存在的任何标题指针。我不能通过jusr替换数据来对列表进行排序,因为变量太多而且它们可以在开发过程中发生变化(可以添加或删除新变量)

task *taskHeader;

struct task{
   task *pprev;
   //large number of variables
   int number;
   task *pnext;
   task(){
     pprev = NULL;
     pnext = NULL;
   }
}
//swap function
void swap(task *task2, task *task3)
   task* task1 = task2->prev; // alias for readability
   task* task4 = task3->next; // alias for readability
   if(task1!=NULL) task1->next = task3;
   task3->prev = task1;
   task3->next = task2;
   task2->prev = task3;
   task2->next = task4;
   if(task4!=NULL) task4->prev = task2;
}

void sort(task *taskHeader){
   task *temp = taskHeader;
   while(temp != NULL){
      if(temp->number < temp->pnext->number) swap(temp, temp->pnext);

   }
}

我应该如何附加交换功能以保持我的标头完好无损并且在交换开始或结束任务节点时不会崩溃?目前我这样做是通过在交换函数中添加NULL检查来防止函数超出界限并最终导致指针错误,但有没有更好的方法来解决这个问题?

我应该直接遍历链表,直到我到达pprev == NULL的点,并将标题更改为指向该节点?

1 个答案:

答案 0 :(得分:1)

所以你有一个双链表,很难排序。如果你想要一个有序列表。也许你只需要编写这些功能:

init函数,仅创建头节点并将地址存储到全局变量。

insert函数,它将节点插入正确的位置。

现在,它已订购,但您仍需要其他功能才能使列表有用。

delete功能。

find功能

size功能。

empty功能。

'获取'功能

...

祝你好运。

命令后:

插入:

   node1 
    ||
   node2
    ||       
   node3

如果需要在列表中插入一个新节点,就在node1后面。

 1. create a new node node4             
 2. find the node1                      node1
 2. node1->next->pre = node4             |
 3. node4->next = node1->next    -->     |node4
                                         | ||
                                        node2
                                         ||
                                        node3

 4.node4->pre = node1         
 5.node1->next = node4           -->    node1
                                         ||
                                        node4
                                         ||
                                        node2
                                         ||
                                        node3