C++实现多组数据合并输出

Posted d0y-xia

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++实现多组数据合并输出相关的知识,希望对你有一定的参考价值。

  思路

    假设有多组数据,每一组都是按从小到大的顺序输入的,设计如下数据结构

技术图片

    前面一列是每一组数据的首部,后面是真正的数据,首部的定义为:

    struct head 
        Node* next;
        head* down;
        head* up;
    ;

    数据部分的定义为:

    struct Node 
        int data;
        Node* next;
    ;

     1.我们称左上角为根,左下角为尾,根的前指针(up)和尾的后指针(down)为NULL,next指向数据,那么在输出的时候,只需要遍历第二列选出最小的数据即可,在输出该结点之后将该节点删除,并更新该数据结构。

     2.定义两个指针p和q,分别用来遍历和指向最小数据。

       a.如果q(指向最小数据的指针)指到了根,并且p->next->next=NULL,则表示根所在的一行已经输出完毕,需要更新根,于是判断根的下指针是否也为NULL,如果是,表示已经结束,如果不是则将下一行首部设置为根。

       b.如果p->next->next不等于NULL,则只需要将p的next指向p的next的next即p->next = p->next->next。

       c.如果q指向除根以外的首部,并且,后面有多的数据,则p->next = p->next->next,如果没有多余数据表示这一行已经全部输出,删除p和p->next指向的空间,并将p的上一行的首部的下指针指向p的下一行的首部,下一行的上指针指向p的上一行首部。

     3.输出的时候只需要当前数据与前一个输出的数据不同即可。

  代码:

  1 namespace SORT 
  2     using namespace std;
  3     struct Node //数据结点
  4         int data;
  5         Node* next;
  6     ;
  7     struct head //头结点
  8         Node* next;
  9         head* down;
 10         head* up;
 11     ;
 12     void Create(Node*& root) 
 13         int tmp;
 14         if (root == NULL) 
 15             cin >> tmp;
 16             if (tmp == -1)//输入-1是结束该行输入
 17                 return;
 18             root = new Node;
 19             root->data = tmp;
 20             root->next = NULL;
 21             Create(root->next);
 22         
 23         return;
 24     
 25     void Destory(head*& root) 
 26         head* p = root;//循环遍历指针
 27         head* q = root->down;//每次都指向最小
 28         Node* tmp = NULL;
 29         int num = 0;//保存前一次输出的值
 30         while (p != NULL && q != NULL)
 31         
 32             while (p != NULL) 
 33                 if (p->next->data < q->next->data) 
 34                     q = p;
 35                     p = p->down;
 36                 
 37                 else 
 38                     p = p->down;
 39                 
 40             
 41             if (q->next->data != num) 
 42                 cout << q->next->data << " ";
 43                 num = q->next->data;
 44             
 45             if (q->up == NULL) 
 46                 if (q->next->next == NULL) 
 47                     p = root;
 48                     if (root->down == NULL) 
 49                         delete root->next;
 50                         delete root;
 51                         return;
 52                     
 53                     root->down->up = NULL;
 54                     root = root->down;
 55                     delete p->next;
 56                     delete p;
 57                     p = q = root;
 58                 
 59                 else 
 60                     tmp = q->next;
 61                     q->next = q->next->next;
 62                     delete tmp;
 63                     tmp = NULL;
 64                     p = q = root;
 65                 
 66             //if
 67             else 
 68                 if (q->next->next == NULL) 
 69                     q->up->down = q->down;
 70                     if (q->down == NULL) 
 71                         q->up->down = NULL;
 72                         delete q->next;
 73                         delete q;
 74                     
 75                     else 
 76                         q->down->up = q->up;
 77                         delete q->next;
 78                         delete q;
 79                     
 80                     p = q = root;
 81                 
 82                 else 
 83                     tmp = q->next;
 84                     q->next = q->next->next;
 85                     delete tmp;
 86                     tmp = NULL;
 87                     p = q = root;
 88                 //else
 89             //else
 90         //while
 91     
 92     void CreateHead(int n) //n表示有几行数据
 93         head* root = new head;
 94         root->down = NULL;
 95         root->up = NULL;
 96         root->next = NULL;
 97         Create(root->next);//第一行单独创建
 98         head* p = root;
 99         for (int i = 1; i < n; i++)
100         
101             head* N = new head;
102             N->down = NULL;
103             N->next = NULL;
104             N->up = p;
105             p->down = N;
106             p = N;
107             Create(p->next);
108         
109         Destory(root);
110     
111 

 

  调用:

 

1 int main() 
2     int num;
3     std::cin >> num;
4     SORT::CreateHead(num);
5 

 

 

 

  运行结果:

技术图片

  如果有什么错误欢迎大家指正。

 

以上是关于C++实现多组数据合并输出的主要内容,如果未能解决你的问题,请参考以下文章

华为机试真题 C++ 实现数组拼接

C++实现日期相关OJ题

Leetcode No.21 Merge Two Sorted Lists合并两个有序链表(c++实现)

华为机试真题 C++ 实现区间交集

C++ 随机化快速排序 最简单易懂的代码! 基于归并分区思想实现

数据结构===哈夫曼编码实现/C或者C++