按升序排序链表c ++

时间:2012-11-15 16:58:44

标签: c++ linked-list

所以我有一个单独的链表。新项目被添加到链的前面,所以如果你添加了8,4,10,那么列表将是10,4,8。无论如何,现在我试图在插入完成后对列表进行排序,除了我无法弄清楚如何循环这些数字并按升序重新排列它们。我可能会在这里稍稍休息一下,希望能帮助我解决这个问题。

*这是一个学校的项目,所以建议我使用其他容器对我的情况没有帮助,除了提供信息,因为我不能改变我正在使用的东西。

列表布局

struct Node
    {
      int Item;      // User data item
      Node * Succ;   // Link to the node's successor
    };

unsigned Num //number of items in the list
Node * Head //pointer to the first node

我的插入功能如下所示

Node * newOne;
newOne = new (nothrow) Node;
newOne->Item = X;
newOne->Succ = NULL;

if(Head == NULL)
{
        Head = newOne;
}
else
{
        newOne->Succ = Head;
        Head = newOne;
}
Num++;

2 个答案:

答案 0 :(得分:4)

这可以通过两种方式完成,我不打算发布代码,但希望这会对你有帮助。

<强> 1。在插入期间按升序排列

这涉及始终按升序添加元素。例如,如果链接列表是

            | 1  |

并添加5个新链接列表

           |1|--->|5|

如果你接下来添加3,它应该是

           |1| ---> |3| ----> |5|

这包括比较新元素,直到找到正确的位置。

<强> 2。等到所有元素都插入后,按升序排列。

这将涉及在链表的元素上使用排序算法,如合并排序,插入排序,冒泡排序等。

完成数字排序后,按正确的顺序重写链接列表。

示例:

如果链接列表包含

        3 2 5 1 6 

排序算法后

  1 2 3 5 6 (stored in an array)

现在遍历链接列表并按正确的顺序替换元素。

如果节点包含其他元素,请注意,其他元素也需要替换。

注意:这需要额外的内存,另一种方法是交换节点,这需要更长的时间。除非链接列表包含大量节点(因此使内存重要)或具有其他元素,否则使用数组会更简单。

答案 1 :(得分:1)

对单个链表进行排序对代码来说很难(除非你喜欢线性排序,如冒泡排序或插入排序)。将内容复制到矢量,对矢量进行排序,然后重建列表要简单得多。