第1关:两个递增有序链表合并为一个递增有序链表
本关任务:编写一个递增有序链表的合并程序。
#include<iostream>
#include<fstream>
using namespace std;
#define ERROR 0
typedef struct LNode //定义单链表
{
int data;
struct LNode *next;
} LNode, *LinkList;
int num_a, num_b;
void InitList_L(LinkList &L) //创建单链表
{
L = new LNode;
L->next = NULL;
}
void input(LinkList &L, int n) //依次往单链表L里输入数据
{
int i;
LNode *p, *r;
r = L;
while (n --)
{
p = new LNode;
cin >> p->data;
p->next = NULL;
r->next = p;
r = p;
}
}
void output(LinkList L) //依次输出单链表里的每个元素
{
int i = 0;
LNode *p;
p = L->next;
while (p) {
if (i)
cout << " ";
cout << p->data;
p = p->next;
i = 1;
}
}
void MergeList_L(LinkList &LA, LinkList &LB, LinkList &LC) //算法设计1
{
//已知单链表LA和LB的元素按值递增排列
//归并LA和LB得到新的单链表LC,LC的元素也按值递增排列,不允许有重复数据
/*******************************Begin***************************/
LinkList k = LA,p = LA -> next,q = LB -> next;
while(p && q)
{
int a = p -> data,b = q -> data;
if(a <= b)
{
k -> next = p;
k = p;
p = p -> next;
if(a == b) q = q -> next;
}
else
{
k -> next = q;
k = q;
q = q -> next;
}
}
k -> next = p ? p : q;
LC = LA;
/********************************End****************************/
} //MergeList_L()
int main()
{
LinkList La, Lb, Lc;
scanf("%d %d", &num_a, &num_b);
InitList_L(La); //La表的创建
input(La, num_a); //依次往单链表La里输入数据
InitList_L(Lb); //Lb表的创建
input(Lb, num_b); //依次往单链表La里输入数据
InitList_L(Lc);
MergeList_L(La, Lb, Lc); //将单链表La和Lb进行合并
output(Lc);
return 0;
}
第2关:两个非递减链表合并成一个非递增链表
本关任务:编写一个非递增有序链表的合并程序。
思路 : 可以先将两个递增链表合并成一个递增链表,再将得到的新链表翻转(用头插法)。
#include<iostream>
#include<fstream>
using namespace std;
#define ERROR 0
typedef struct LNode //定义单链表
{
int data;
struct LNode *next;
} LNode, *LinkList;
int num_a, num_b;
void InitList_L(LinkList &L) //创建单链表
{
L = new LNode;
L->next = NULL;
}
void input(LinkList &L, int n) //依次往单链表L里输入数据
{
int i;
LNode *p, *r;
r = L;
while (n --)
{
p = new LNode;
cin >> p->data;
p->next = NULL;
r->next = p;
r = p;
}
}
void output(LinkList L) //依次输出单链表里的每个元素
{
int i = 0;
LNode *p;
p = L->next;
while (p) {
if (i)
cout << " ";
cout << p->data;
p = p->next;
i = 1;
}
}
void MergeList_L(LinkList &LA, LinkList &LB, LinkList &LC) //算法设计1
{
//已知单链表LA和LB的元素按值非递减排列
//归并LA和LB得到新的单链表LC,LC的元素按值非递增排列,允许有重复数据
/****************************Begin***************************/
LinkList k = LA,p = LA -> next,q = LB -> next;
while(p && q)
{
int a = p -> data,b = q -> data;
if(a <= b)
{
k -> next = p;
k = p;
p = p -> next;
}
else
{
k -> next = q;
k = q;
q = q -> next;
}
}
k -> next = p ? p : q;
k = LA -> next;
LinkList t = k -> next;
while(t)
{
LinkList m = t;
t = t -> next;
m -> next = LA -> next;
LA -> next = m;
}
/***************************End******************************/
k -> next = NULL;
LC = LA;
}
int main()
{
LinkList La, Lb, Lc;
scanf("%d %d", &num_a, &num_b);
InitList_L(La); //La表的创建
input(La, num_a); //依次往单链表La里输入数据
InitList_L(Lb); //Lb表的创建
input(Lb, num_b); //依次往单链表La里输入数据
InitList_L(Lc);
MergeList_L(La, Lb, Lc); //将单链表La和Lb进行合并
output(Lc);
return 0;
}
第3关:两个链表的交集
本关任务:编写两个链表交集的程序。
定义一个新的指针 k 指向链表 A 的头结点,遍历链表 A 和 B,找到相同的元素,将A中节点链到 k 后面,再让 k 指向该节点,最后让 k 的后继指向 NULL。
#include<iostream>
#include<fstream>
using namespace std;
#define ERROR 0
typedef struct LNode //定义单链表
{
int data;
struct LNode *next;
} LNode, *LinkList;
int num_a, num_b;
void InitList_L(LinkList &L) //创建单链表
{
L = new LNode;
L->next = NULL;
}
void input(LinkList &L, int n) //依次往单链表L里输入数据
{
int i;
LNode *p, *r;
r = L;
while (n --)
{
p = new LNode;
cin >> p->data;
p->next = NULL;
r->next = p;
r = p;
}
}
void output(LinkList L) //依次输出单链表里的每个元素
{
int i = 0;
LNode *p;
p = L->next;
while (p) {
if (i)
cout << " ";
cout << p->data;
p = p->next;
i = 1;
}
}
void MergeList_L(LinkList &LA, LinkList &LB, LinkList &LC) //算法设计3
{
//已知单链表LA和LB的元素按值递增排列
//将两个链表的交集数据存放在A链表当中
/*******************************************Begin***************************************************/
LinkList k = LA,p = LA -> next,q = LB -> next;
while(p && q)
{
int a = p -> data,b = q -> data;
if(a < b) p = p -> next;
else if(a > b) q = q -> next;
else
{
k -> next = p;
k = p;
p = p -> next;
}
}
k -> next = NULL;
LC = LA;
/**********************************************End*************************************************/
} //MergeList_L()
int main()
{
LinkList La, Lb, Lc;
scanf("%d %d", &num_a, &num_b);
InitList_L(La); //La表的创建
input(La, num_a); //依次往单链表La里输入数据
InitList_L(Lb); //Lb表的创建
input(Lb, num_b); //依次往单链表La里输入数据
InitList_L(Lc);
MergeList_L(La, Lb, Lc); //将单链表La和Lb进行合并
output(Lc);
return 0;
}
第4关:两个递增链表的差集
本关任务:编写一个递增有序链表差集的程序。
找到链表 A 中有,但链表 B 中没有的元素文章来源:https://www.toymoban.com/news/detail-735500.html
#include<iostream>
#include<fstream>
using namespace std;
#define ERROR 0
typedef struct LNode //定义单链表
{
int data;
struct LNode *next;
} LNode, *LinkList;
int num_a, num_b;
void InitList_L(LinkList &L) //创建单链表
{
L = new LNode;
L->next = NULL;
}
void input(LinkList &L, int n) //依次往单链表L里输入数据
{
int i;
LNode *p, *r;
r = L;
while (n --)
{
p = new LNode;
cin >> p->data;
p->next = NULL;
r->next = p;
r = p;
}
}
void output(LinkList L) //依次输出单链表里的每个元素
{
int i = 0;
LNode *p;
p = L->next;
while (p) {
if (i)
cout << " ";
cout << p->data;
p = p->next;
i = 1;
}
}
void MergeList_L(LinkList &LA, LinkList &LB, int &n) //算法设计4
{
//已知单链表LA和LB的元素按值递增排列
//将两个链表的差集数据存放在A链表当中 ,并返回元素个数
/***************************************Begin**************************/
LinkList k = LA,p = LA -> next,q = LB -> next;
while(p && q)
{
int a = p -> data,b = q -> data;
if(a < b)
{
k -> next = p;
k = p;
p = p -> next;
n ++ ;
}
else if(a == b) p = p -> next,q = q -> next;
else q = q -> next;
}
k -> next = NULL;
/**************************************End***************************/
} //MergeList_L()
int main()
{
LinkList La, Lb, Lc;
scanf("%d %d", &num_a, &num_b);
InitList_L(La); //La表的创建
input(La, num_a); //依次往单链表La里输入数据
InitList_L(Lb); //Lb表的创建
input(Lb, num_b); //依次往单链表La里输入数据
int n;
MergeList_L(La, Lb, n); //将单链表La和Lb进行合并
cout << n << endl;
output(La);
return 0;
}
第5关:分解链表
本关任务:编写一个链表的分解程序。文章来源地址https://www.toymoban.com/news/detail-735500.html
#include<iostream>
#include<fstream>
using namespace std;
#define ERROR 0
typedef struct LNode //定义单链表
{
int data;
struct LNode *next;
} LNode, *LinkList;
int num_a, num_b;
void InitList_L(LinkList &L) //创建单链表
{
L = new LNode;
L->next = NULL;
}
void input(LinkList &L, int n) //依次往单链表L里输入数据
{
int i;
LNode *p, *r;
r = L;
while (n --)
{
p = new LNode;
cin >> p->data;
p->next = NULL;
r->next = p;
r = p;
}
}
void output(LinkList L) //依次输出单链表里的每个元素
{
int i = 0;
LNode *p;
p = L->next;
while (p) {
if (i)
cout << " ";
cout << p->data;
p = p->next;
i = 1;
}
}
void DivList_L(LinkList &LA, LinkList &LB, LinkList &LC) //算法设计5
{
//已知单链表LA
//将LA拆分成两个表,LB中的数据小于0, LC中的数据大于0
/**************************Begin****************************/
InitList_L(LB);
InitList_L(LC);
LinkList p = LA -> next,b = LB,c = LC;
while(p)
{
LinkList t = p;
p = p -> next;
if(t -> data > 0)
{
t -> next = c -> next;
c -> next = t;
}
if(t -> data < 0)
{
t -> next = b -> next;
b -> next = t;
}
}
/************************End******************************/
}
int main()
{
LinkList La, Lb, Lc;
scanf("%d", &num_a);
InitList_L(La); //La表的创建
input(La, num_a); //依次往单链表La里输入数据
DivList_L(La, Lb, Lc); //将单链表La拆分成Lb和Lc
output(Lb);
cout << endl;
output(Lc);
return 0;
}
到了这里,关于链表的合并和分解-习题1-5的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!