如何使链接列表按字母顺序打印出其内容?

时间:2013-10-01 01:37:56

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

我有一个包含姓氏,名字和值的单个链接电话簿列表。 我可以按创建顺序打印出来,但不能按值打印出来。我怎么修改这个?如果您需要在代码中查看其他内容,请告诉我,但此功能是我主要关注的问题。

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;

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

    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...