0

我需要帮助将数据从类节点插入到链表中。List 是节点的容器。它们需要根据姓氏、名字和年龄进行排序。(我已经有运算符函数来比较它们)我只是不确定如何使用指针来插入和排序它们。下面是我的两个类定义,以及到目前为止我的插入函数。我还从以前的项目中提供了一个潜在的选择排序算法,可以用来处理这个问题。任何人都可以帮忙吗?

//类声明

 class node;
    class list
    {
    public:
    void insert(string f, string l, int a);
    int length();

private:
    node *head;
    int listlength;
};
class node
{
    friend list;
public:
    node();                           // Null constructor
    ~node();                          // Destructor 
    void put(ostream &out);           // Put
    bool operator == (const node &);  // Equal
    bool operator < (const node &);   // Less than
private:
    string first, last;
    int age;
    node *next;
};  

//如何在MAIN中调用insert

while (!infile.eof())
        {
            infile >> first >> last >> age;

            // Process if okay

        if (infile.good())
            a.insert(first, last, age);
        };  

//插入函数

  void list::insert(string f, string l, int a)
        {
        node *temp1, *temp2 = head;
        temp1 = new node();
        temp1->first = f;
        temp1->last = l;
        temp1->age = a;
        temp1->next = NULL;
        if (listlength == 0)
        {
            temp1->next = head;
        }
        else
            while (temp2->next != NULL)
            {
                ;
            }

    }

//潜在排序算法

 void sort(person b[], int count)
{
    int i = 0, j = 0, indexofsmallest = i;
    person smallest = b[i];

    for (i = 0; i < count; i++)
    {
        smallest = b[i];
        indexofsmallest = i;

        for (j = i+1; j < count; j++)
        {
            if (b[j] < smallest)
            {
                smallest = b[j];
                indexofsmallest = j;
            }
        }

        //cstdlib swap function

        swap(b[i], b[indexofsmallest]);
    }

}
4

2 回答 2

2

如果您真的想对不推荐的链表进行排序,则必须调整算法以使用指针而不是数组索引。这看起来像这样:

void sort(node* head, int count)
{
    // int i = 0, j = 0,
    node* smallest = head;

    while (head != NULL)
    {
    smallest = head;
    node* toTest = head->next;
    while (toTest != NULL)
    {
        if (toTest->age < smallest->age)
        {
            smallest = toTest;
        }
        toTest = toTest->next;
    }

    //make your own swap function

    pointerSwap(head, smallest);

    head = head -> next;
}

}

您可以编写自己的适用于指针的交换算法,除非您在列表中发送的项目之前跟踪项目,否则这可能会很困难。

于 2017-10-19T20:25:53.267 回答
1

由于无法快速访问链表中的每个元素,所有常规排序算法都会花费太多时间,尤其是在单链表中,因此一种方法是在插入过程中保持列表排序。最坏情况 O(n^2)

于 2017-10-19T20:01:37.483 回答