思路

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

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

    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. Windows下通过VNC远程访问Linux服务器,并实现可视化

    前言 最近因部门需要,老大想让我在公司Linux服务器上弄个Oracle,以用作部门测试环境的数据库服务器,经过一番折腾后,成功完成了任务.因公司Linux服务器是无图形界面的,本人接触Linux不多 ...

  2. 对于Typora(markdown)的基本使用

    对于刚开始使用该软件,应该在熟悉基本的markdown语法的基础上,再进行快捷键的使用! 标题 (快捷键:ctrl + 数字) 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 ###### ...

  3. Linux关闭进程。

    一.shell命令根据端口后关闭指定进程. $(netstat -nlp | | awk '{print $7}' | awk -F"/" '{ print $1 }') nets ...

  4. Spring Boot微服务电商项目开发实战 --- 多环境部署配置、端口号统一配置及Dubbo提供者消费者实现

    昨天已经搭建好了SpringBoot基于Maven的基础父子级项目,今天开始进入项目分模块及分布式实现.首先我们基于昨天的项目,在父级工程下建lyn-sys,lyn-customer,lyn-good ...

  5. ZIP:ZipFile

    ZipFile: /* 此类用于从 ZIP 文件读取条目 */ ZipFile(File file) :打开供阅读的 ZIP 文件,由指定的 File 对象给出. ZipFile(File file, ...

  6. linux svn 中文 https://my.oschina.net/VASKS/blog/659236

    https://my.oschina.net/VASKS/blog/659236 设置服务器: export LC_ALL=zh_CN.UTF-8长久之计, echo export LC_ALL=zh ...

  7. java反射构建对象和方法的反射调用

    Java反射技术应用广泛,其能够配置:类的全限定名,方法和参数,完成对象的初始化,设置是反射某些方法.可以增强java的可配置性. 1.1 通过反射构建对象(无参数): 例如我们使用 ReflectS ...

  8. 「PowerBI」分析服务多维数据结构重回关系数据库的一大绝招

    在过往Excel催化剂定位的轻量级Excel+PowerBIDesktop的解决方案中,已经做过了近乎完美的PowerBIDesktop数据模型数据导出到Excel工作表的应用,这也是个人版数据应用的 ...

  9. 个人永久性免费-Excel催化剂功能第50波-批量打印、导出PDF、双面打印功能

    在倡导无纸化办公的今天,是否打印是一个碍眼的功能呢,某些时候的确是,但对于数据的留存,在现在鼓吹区块链技术的今天,仍然不失它的核心价值,数据报表.单据打印出来留存,仍然是一种不可或缺的数据存档和防篡改 ...

  10. Spring管理事物两种方式

    Spring管理事物两种方式 1. 编程式事物管理(在开发中不经常使用) 使用步骤 1. 配置数据库事物管理 DataSourceTransactionManager <!--配置事物管理器-- ...