用C ++对链表进行排序

时间:2012-10-17 05:40:58

标签: c++ list sorting linked-list queue

我正试图围绕如何编写一个算法来对链表进行排序,但我很难想出一些可行的方法。我们需要做的是有一个链表,其中包含一个字符串中的名称,以及一个int小时。显示列表和小时数之后,我们必须按队列中的小时按升序对列表进行排序。我有列表,所有它的功能存储在类对象中,如您所见。我清除了我所拥有的全部功能,希望提出一个新的想法,但没有想到任何事情。我最初打算创建一个具有排序列表的第二个链表,但后来我开始怀疑是否可以在同一个列表中对其进行排序。这是我发布的代码。

#include   <iostream>
#include   <ctime>
using namespace std;

// OrderedLL class
template<class T>
class   OrderedLL
{
private: 
struct NODE
{
    string  sName;
    int sHours;
    NODE    *next;
};
NODE    *list;
NODE    *rear;

public:
// Constructor
OrderedLL () { list = rear =  NULL;}

// Insert item x -------------------------------------
void    Insert(string x, int y)
{
    NODE *r;
    // Create a new node
    r = new(NODE); r->sName = x; r->sHours = y;
    r->next = NULL;
    // Inserts the item into the list
    r->next = list;
    list = r;
}

// Display the linked list --------------------------
void display()
{ NODE *p = list;
while( p != NULL)
    { cout << p->sName << "/" << p->sHours << "-->"; p = p->next;}
cout << "NULL\n";
}

// Delete x from the linked list --------------------
void DeleteNode(T x)
{
NODE *p = list, *r = list;
while( p->info != x) {r=p; p=p->next; }
if( p == list)
    { // delete the first node
    list = p->next; delete(p);
    }
    else
    { r->next = p->next; delete(p);}
}

// Sort by hours ------------------------------------
void    sortHours()
{
NODE    *p, *q;



}

// Display the total hours --------------------------
friend  T   totHours(OrderedLL  LL)
{
    NODE    *p;
    int total = 0;  

    p = LL.list;
    while(p != NULL)
    {
        total += p->sHours;
        p = p->next;
    }
    cout << "Total spending time = " << total << endl;
}





}; // end of OrderedLL class

int main(void)
{
    // Declare variables
time_t          a;
OrderedLL<int>      unsortedLL;
OrderedLL<int>      sortedLL;
int         inHours;
string          inName;




// Displays the current time and date
time(&a);
cout << "Today is " << ctime(&a) << endl;

// Asks the user to enter a name and hours 5 times, inserting each entry
// into the queue
for(int i = 0; i < 5; i++)
{
    cout << "Enter name and Time: ";
    cin >> inName >> inHours;
    unsortedLL.Insert(inName, inHours);
}

// Displays the unsorted list
cout << "\nWaiting List-->";
unsortedLL.display();
totHours(unsortedLL);

// Calls for the function to sort the list into a queue by hours
unsortedLL.sortHours();

unsortedLL.display();
return 0;

} // End of "main"

一如既往地感谢任何可以提供帮助的人

3 个答案:

答案 0 :(得分:1)

尝试对链表进行排序,就像排序整数数组一样。而不是交换节点,交换节点内的内容

答案 1 :(得分:1)

如果您不关心效率,可以使用任何排序算法。链接列表和数组之间的区别在于, swap 操作在排序时交换两个元素的位置会慢得多,因为它必须通过列表的链接运行。

O(n²)bubble sort很容易用链表实现,因为它只与邻居交换一个元素。

如果你关心效率,你可以考虑实施merge sort算法,即使它有点复杂。

答案 2 :(得分:0)

你应该像这样插入

void Insert(string x, int y)
{
    NODE *r;NODE *temp;
    // Create a new node
    r = new NODE; r->sName = x; r->sHours = y;r->next = NULL;
    if(list==null)//check if list is empty
    {
    list=r;//insert the node r in the list
    }
    else
    {
    temp=list;
    while(temp->next!=null)temp=temp->next;//reach to the end of the list
    temp->next=r;//insert it at the end of the list
    }
}

不需要后方指针 ..只需检查list->next是否为null,如果是,则表示您已结束

并且您的sorthour函数应为

void sortHours()
{

    for(NODE* n=list;n->next!=null;n=n->next)//get each of the node in list 1 by 1 except the last one i.e. n
    {

        for(NODE* n1=n->next;n1!=null;n1=n1->next)//compare the list n node with all the nodes that follow it i.e.n1
        {

            if(n->sHours > n1->sHours)//if one of the node is the less than n
            {
                //swap n and n1
                node temp=*n;
                n->age=n1->age;
                n->name=n1->name;
                n1->age=temp.age;
                n1->name=temp.name;
            }

        }

    }
}