【问题标题】:How do i make a link list print out its contents in alphabetical order?如何使链接列表按字母顺序打印出其内容?
【发布时间】:2013-10-01 01:37:56
【问题描述】:

我有一个包含姓氏、名字和值的单个链接电话簿列表。 我可以按它们创建的顺序打印它们,但不能按值打印。我该如何修改这个?如果您需要查看代码中的其他内容,请告诉我,但这个函数是我主要关心的问题。

ostream& operator<<(ostream& out, const PhoneBook& p)  // out stream 
{
     if(p.head==NULL) 
     {
        cout << "is empty";
     }else
     {
         PhoneBookItem* item = p.head;
         for(int i=0; i < p.num; i++)
         {
            cout << item->lastname<< " ";
            cout << item->firstname<< " : ";
            cout << item->phone<<endl;
            item = item->next;
        }
     }
    return out;

【问题讨论】:

  • 你的意思是按字母顺序打印出来吗?因为如果你想这样做,你需要重新排序整个列表(或选择不同的数据结构)。
  • +1 对 Dgrin91 所说的话。使用 Map 并将值作为键。 Map 保持它的内容按 key 排序。
  • @dgrin91 ,好吧,所以我想我必须制作一个临时电话簿才能将值放入,然后打印出来。没有,抱歉,我不知道如何使用地图,目前这超出了我的课程范围。

标签: c++ linked-list singly-linked-list


【解决方案1】:

选项 1:对列表进行排序,然后打印
选项 2:对于每个循环,搜索下一个应该打印的项目。 (昂贵)
选项 3:使用 Hash/Dictionary 方法而不是链表。哈希/字典是
固定数组和链表的组合。他们对
有好处 比固定数组和链表更快地搜索项目。
选项 4:使用能够按顺序/按字母顺序访问数据的链接列表以外的其他数据结构。

【讨论】:

  • 对于这个任务,我似乎只限于选项 1。我该怎么写呢?
  • @DeanMikkawa,对链表进行排序的最佳方法是使用merge sortbubble sort 容易适应链表,但性能较差。
【解决方案2】:

可以通过多种方式对链表进行排序。

  1. 临时引用数组:分配一个临时数组或指针向量,并遍历链表填充它。对指针进行排序。库 std::sortqsort 可以满足此要求。然后遍历排序后的数组,重置每个节点的“next”指针。最后释放临时数组存储。
  2. 插入排序:将元素从列表中弹出并重新插入到新列表中正确排序的位置。
  3. Mergesort:实现起来并不难,而且它在长列表上的运行速度比插入排序快得多。该算法很简单:将列表拆分为 2。递归地对两半进行合并排序。然后通过重复删除最小的头部并附加到新列表的尾部来合并结果。
  4. 快速排序:使用列表高效实现这有点棘手,但它可能的。我不会讨论它,因为它不是一个好的早期编程项目,而且在许多情况下合并排序更快。

这是一些未经测试的插入排序代码:

PhoneBookItem* sorted = NULL;
while (p.head) {

    // Pop
    PhoneBookItem* head = p.head;
    p.head = head->next;
    head->next = NULL;

    // Find the place to insert.
    PhoneBookItem* lead = sorted;
    PhoneBookItem* trail = NULL;
    while (lead && lead->phone <= head->phone) {
        trail = lead;
        lead = lead->next;
    }

    // Insert either within the list or at the head.
    head->next = lead;
    if (trail)
        trail->next = head;
    else
        sorted = head;
}
p.head = sorted;
// Now print the sorted list as before...

【讨论】:

  • 也可以迭代地进行归并排序,这是我的偏好。
  • @MarkRansom 玩得开心。它要复杂得多,而且不可能更快。您最终可能会在递归表达式中复制编译器对堆栈所做的操作。
  • 这是一个插入排序,不是吗?那里:en.wikipedia.org/wiki/Insertion_sort 是针对大型数据列表的一些其他想法。
  • @harper 是的,正如上面的 #2 所说!这是一个插入排序。它不适合庞大的数据列表,因为它的运行时间是 O(n^2)。您需要合并排序或快速排序,它们的时间为 O(n log n)(在大多数快速排序的情况下,这个时间限制是预期的,而不是绝对的)。
猜你喜欢
  • 2017-10-09
  • 1970-01-01
  • 2016-07-01
  • 2021-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多