思路

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

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

    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.输出的时候只需要当前数据与前一个输出的数据不同即可。

  代码:

 namespace SORT {
using namespace std;
struct Node {//数据结点
int data;
Node* next;
};
struct head {//头结点
Node* next;
head* down;
head* up;
};
void Create(Node*& root) {
int tmp;
if (root == NULL) {
cin >> tmp;
if (tmp == -)//输入-1是结束该行输入
return;
root = new Node;
root->data = tmp;
root->next = NULL;
Create(root->next);
}
return;
}
void Destory(head*& root) {
head* p = root;//循环遍历指针
head* q = root->down;//每次都指向最小
Node* tmp = NULL;
int num = ;//保存前一次输出的值
while (p != NULL && q != NULL)
{
while (p != NULL) {
if (p->next->data < q->next->data) {
q = p;
p = p->down;
}
else {
p = p->down;
}
}
if (q->next->data != num) {
cout << q->next->data << " ";
num = q->next->data;
}
if (q->up == NULL) {
if (q->next->next == NULL) {
p = root;
if (root->down == NULL) {
delete root->next;
delete root;
return;
}
root->down->up = NULL;
root = root->down;
delete p->next;
delete p;
p = q = root;
}
else {
tmp = q->next;
q->next = q->next->next;
delete tmp;
tmp = NULL;
p = q = root;
}
}//if
else {
if (q->next->next == NULL) {
q->up->down = q->down;
if (q->down == NULL) {
q->up->down = NULL;
delete q->next;
delete q;
}
else {
q->down->up = q->up;
delete q->next;
delete q;
}
p = q = root;
}
else {
tmp = q->next;
q->next = q->next->next;
delete tmp;
tmp = NULL;
p = q = root;
}//else
}//else
}//while
}
void CreateHead(int n) {//n表示有几行数据
head* root = new head;
root->down = NULL;
root->up = NULL;
root->next = NULL;
Create(root->next);//第一行单独创建
head* p = root;
for (int i = ; i < n; i++)
{
head* N = new head;
N->down = NULL;
N->next = NULL;
N->up = p;
p->down = N;
p = N;
Create(p->next);
}
Destory(root);
}
}

  调用:

 int main() {
int num;
std::cin >> num;
SORT::CreateHead(num);
}

  运行结果:

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

C++实现多组数据合并输出的更多相关文章

  1. jquery: json树组数据输出到表格Dom树的处理方法

    项目背景 项目中需要把表格重排显示 处理方法 思路主要是用历遍Json数组把json数据一个个append到5个表格里,还要给每个单元格绑定个单击弹出自定义对话框,表格分了单双行,第一行最后还要改ro ...

  2. NOIP提高组2004 合并果子题解

    NOIP提高组2004 合并果子题解 描述:在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消 ...

  3. R︱高效数据操作——data.table包(实战心得、dplyr对比、key灵活用法、数据合并)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 由于业务中接触的数据量很大,于是不得不转战开始 ...

  4. PANDAS 数据合并与重塑(join/merge篇)

    pandas中也常常用到的join 和merge方法 merge pandas的merge方法提供了一种类似于SQL的内存链接操作,官网文档提到它的性能会比其他开源语言的数据操作(例如R)要高效. 和 ...

  5. JUint4的下载、配置及对一个算法编写单元测试用例(测试多组数据每组多个参数)

    一.JUnit4 jar包下载 链接:https://pan.baidu.com/s/1AdeVGGikcY5dfL151ZnWHA 提取码:h1am 下载完成后,解压一下即可. 二.导入JUnit4 ...

  6. ggpubr进行“paper”组图合并,也许比PS,AI更简单

    本文转载自微信公众号 “生信补给站”,https://mp.weixin.qq.com/s/41iKTulTwGcY-dHtqqSnLA 多个图形进行组图展示,可以既展示一个“事情”的多个角度,也可以 ...

  7. SQL将多行数据合并成一行【转】

    转:https://blog.csdn.net/AntherFantacy/article/details/83824182 今天同事问了一个需求,就是将多行数据合并成一行进行显示,查询了一些资料,照 ...

  8. excel多组数据散点图生成

    在研究数据分布时,散点图是一类比较常用的方法,通过三点图可以很好的显示数据的分布位置.一组数据生成散点图,利用excel是很容易生成的:但是,多组数据生成散点图,不同组数据用不同颜色表示,那该怎么生成 ...

  9. checkbox提交多组数据到action

    突然想通过checkbox来提交多组数据到action,一时间想不起来怎么写,到网上流岚大婶们的笔迹之后,有了新发现! 方法一: 在action用一个String类型的变量来接受checkbox传过来 ...

随机推荐

  1. 《Python 3.5从零开始学》笔记-第8章 面向对象编程

    前几章包括开启python之旅.列表和元组.字符串.字典.条件和循环等语句.函数等基本操作.主要对后面几章比较深入的内容记录笔记. 第8章 面向对象编程 8.3深入类 #!/usr/local/bin ...

  2. (转)代码结构中Dao,Service,Controller,Util,Model是什么意思?

    作者:技能树IT修真院链接:https://www.zhihu.com/question/58410621/answer/623496434来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商 ...

  3. idea中的beautiful插件-自动生成对象set方法

    1. 描述 从前端获取VO对象后,好多时候又要生成数据库对象,需要进行赋值,一个个写很浪费时间,介绍一款idea中的beautiful插件,代码开发过程中自动生成对象的set方法,很好用. 2 .插件 ...

  4. 9.5 考试 第三题 奇袭题解(codeforce 526f)

    问题 C: 奇袭 时间限制: 1 Sec  内存限制: 256 MB 题目描述 由于各种原因,桐人现在被困在Under World(以下简称UW)中,而UW马上 要迎来最终的压力测试——魔界入侵. 唯 ...

  5. Postgresql_fdw

    Postgresql_fdw 测试环境 Ubuntu 16.04 LTS云主机2台,主机名为pg1(192.168.0.34)和pg2(192.168.0.39). 安装postgresql 下面这个 ...

  6. 5G VS WiFi6,实力大比拼!

    移动通信与WiFi,就像移动设备上的两大高手.彼此势均力敌:一个主室内,一个主室外.WiFi是移动网络的室内覆盖补充,也承担着大量的数据流量卸载,二者既想各自占山为王,但也时不时地相互成全对方. 然而 ...

  7. error: 'commit' is not possible because you have unmerged files.

    解决方案: 1.把修改的文件add下,如:git add bidder_mod/src/common/dragon_bidder_data.cc2.git commit

  8. CF356E - Xenia and String Problem

    也许更好的阅读体验 \(\mathcal{Description}\) 定义一种字符串\(gray\)串满足: 长度为奇数 正中间的字母只出现一次 左右两端相同,左右两端也是gray串 一个\(gra ...

  9. DAX 第六篇:统计函数

    统计函数用于创建聚合,对数据进行统计分析.在使用统计函数时,必须考虑到数据模型,表之间关系,数据重复等因素,一般都会搭配过滤函数实现数据的提取和分析. 统计量一般是:均值.求和.计数.最大值.最小值. ...

  10. 什么是Java EE

    Java:是一门编程语言,可以用来编写各种应用程序. Java EE:是一个标准中间件体系结构,旨在简化和规范分布式多层企业应用系统的开发和部署. Java EE是一个标准中间件体系结构 Java E ...