算法2-2:有序线性表的有序合并
2021/6/14 20:51:17
本文主要是介绍算法2-2:有序线性表的有序合并,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
题目描述
已知线性表 LA 和 LB 中的数据元素按值非递减有序排列,现要求将 LA 和 LB 归并为一个新的线性表 LC, 且 LC 中的数据元素仍然按值非递减有序排列。例如,设LA=(3,5,8,11) ,LB=(2,6,8,9,11,15,20) 则
LC=(2,3,6,6,8,8,9,11,11,15,20)
输入
有多组测试数据,每组测试数据占两行。第一行是集合A,第一个整数m(0<=m<=100)代表集合A起始有m个元素,后面有m个非递减排序的整数,代表A中的元素。第二行是集合B,第一个整数n(0<=n<=100)代表集合B起始有n个元素,后面有n个非递减排序的整数,代表B中的元素。每行中整数之间用一个空格隔开。
输出
每组测试数据只要求输出一行,这一行含有 m+n 个来自集合 A 和集合B 中的元素。结果依旧是非递减的。每个整数间用一个空格隔开。
#include <iostream> using namespace std; struct LinkNode { int data; LinkNode* link; LinkNode(LinkNode* ptr = NULL) { link = ptr; } LinkNode(int x) { data = x; } LinkNode(LinkNode* ptr = NULL, int a = 0) { data = a; link = ptr; } }; class List { public: LinkNode* first; List(LinkNode* p = NULL, int x = NULL) { first = new LinkNode(p, x); } ~List() { makeempty(); } void makeempty(); LinkNode* Locate(int i); bool insert(int i, int& x); //第i个后插结点 void sort(List& a, List& b, int a1, int b1); bool remove(int i); //删除第i个结点 void input(int& x); void output(); }; void List::makeempty() { LinkNode* q; while (first->link != NULL) { q = first->link; first->link = q->link; delete q; } } LinkNode* List::Locate(int i){ if (i < 0) return NULL; LinkNode* current = first; int k = 0; while (current != NULL && k < i) { current = current->link; k++; } return current; } bool List::remove(int i) { LinkNode* current = this->Locate(i - 1); if (current == NULL || current->link == NULL)return false; LinkNode* del = current->link; current->link = del->link;delete del; return true; } bool List::insert(int i, int& x) { LinkNode* current = Locate(i); if (current == NULL)return false; LinkNode* newNode = new LinkNode(x); if (newNode == NULL) { cerr << "存储分配错误!" << endl; exit(1); } newNode->link = current->link; current->link = newNode; return true; } void List::input(int &x) { //x为建立表中结点个数 LinkNode* last = first; for (int i = 0; i < x; i++) { LinkNode* newNode = new LinkNode(NULL,NULL); cin >> (newNode->data); last->link = newNode;last = newNode; } last->link = NULL; } void List::output() { LinkNode* p = first->link; while (p != NULL) { cout << p->data<<" "; p = p->link; } } void List::sort(List& a, List& b,int a1,int b1) { //有序插入 List c; int mark = 0; int sizea = a1; int sizeb = b1; char flag=' '; int i = 0, x = 0, min = a.first->link->data, count = 0; for (int j = 0,k = 0,l = 0; j < a1+b1; j++) { for (; k < sizea; k++) { if (min >= (a.Locate(k + 1)->data)) { min = (a.Locate(k + 1)->data); flag = 'a'; mark = k + 1; } } for (; l < sizeb; l++) { if (min >= (b.Locate(l + 1)->data)) { min = (b.Locate(l + 1)->data); flag = 'b'; mark = l + 1; } } if (flag == 'a') { a.remove(mark); sizea--; } else { b.remove(mark); sizeb--; } count++; k = 0; l = 0;flag = ' '; c.insert(count-1, min); if (a.first->link == NULL && b.first->link == NULL)break; else if (min = a.first->link == NULL)min = b.first->link->data; else min = a.first->link->data; } c.output(); }; int main() { List A, B, C; int sizea, sizeb; cin >> sizea; if (sizea >= 0 && sizea <= 100)A.input(sizea); cin >> sizeb; if (sizeb >= 0 && sizeb <= 100 && sizea >= 0 && sizea <= 100) { B.input(sizeb); C.sort(A, B, sizea, sizeb); //A,B合入C中 } return 0; }
这篇关于算法2-2:有序线性表的有序合并的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-26大厂数据结构与算法教程:入门级详解
- 2024-12-26大厂算法与数据结构教程:新手入门指南
- 2024-12-26Python编程入门指南
- 2024-12-26数据结构高级教程:新手入门及初级提升指南
- 2024-12-26并查集入门教程:从零开始学会并查集
- 2024-12-26大厂数据结构与算法入门指南
- 2024-12-26大厂算法与数据结构入门教程
- 2024-12-26二叉树入门教程:轻松掌握基础概念与操作
- 2024-12-26初学者指南:轻松掌握链表
- 2024-12-26平衡树入门教程:轻松理解与应用