#include<bits/stdc++.h>
using namespace std;
//线性表的合并,有序表的合并(无重复元素)(有重复元素)
#define Maxsize 100
//顺序表的合并---------------------------------------------
typedef struct{
int *elem;
int length;
}Sqlist;
//初始化
void Init(Sqlist &l){
//顺序表分配空间
l.elem = new int[Maxsize];
if(!l.elem) exit(0);
l.length = 0;
}
//创建
void Creat(Sqlist &l){
int num;
cin>>num;//数目
l.length = num;
for(int i=0;i<num;i++){
cin>>l.elem[i];
}
}
//无序表合并 la=(7,5,3,11);lb=(2,6,3),合并-->lc=(7,5,3,11,2,6);
Sqlist Combine(Sqlist &la,Sqlist &lb){
//从lb重一次取出元素在la中查询,若不存在,就插入到la表尾
for(int i=0;i<lb.length;i++){
for(int j=0;j<la.length;j++){
if(la.elem[j]==lb.elem[i]){
//有相同元素,跳过
continue;
}
else if(j==la.length-1){
//没找到,插入表尾,表长加一
la.elem[j+1] = lb.elem[i];
la.length++;
}
}
}
return la;
}
//有序表的合并
Sqlist Combine2(Sqlist &la,Sqlist &lb){
//新建顺序表lc,将la,lb中较小元素插入到lc
Sqlist lc;
Init(lc);
int i=0,j=0,k=0;
while(la.length==i&&lb.length==j){//两个都到头就结束
//两个都还没完成
if(i<la.length && j<lb.length){
//小的插入到lc,计数器加一
if(la.elem[i]<=lb.elem[j]){
lc.elem[k] = la.elem[i];
k++;
i++;
}
else{
lc.elem[k] = lb.elem[j];
k++;
j++;
}
}
//a完成了
else if(la.length==i){
lc.elem[k] = lb.elem[j];
k++;
j++;
}
//b完成了
else if(lb.length==j){
lc.elem[k] = la.elem[i];
k++;
i++;
}
}
return lc;
}
//链表的合并-------------------------------------------------------------
typedef struct Lnode{
int data;
Lnode *next;
}Lnode,*Linklist;
//初始化
void Init(Linklist &l){
l = new Lnode;//建立空结点
l->next = NULL; //指向空
}
//创建
void Creat(Linklist &l){
int num;
cin>>num;//数目
while(num--){
Linklist p = new Lnode;//建立新结点
cin>>p->data;
l->next = p;//插入到上一结点之后
p->next = NULL;
}
}
//有序表合并(有重复)
Linklist Combine(Linklist &la,Linklist &lb){
//依次从a,b中找到较小的点插入到c后面
//三个指针a,b,c指向la,lb的首元结点,la的头结点
Linklist a = la->next;
Linklist b = lb->next;
Linklist c = la;
while(a&&b){//a,b指向结点都不为空
if(a->data <= b->data){
c->next = a;//c的指针域指向a
c = a;//c指向下一结点
a = a->next;//a指向下一结点
}
else{
c->next = b;
c = b;
b = b->next;
}
}
if(!a){
c->next = b;//剩余的插入到c之后
}
else{
c->next = a;
}
delete lb;//释放lb空间
return la;
}
//有序表合并(无重复)-->单独考虑“==”
Linklist Combine2(Linklist &la,Linklist &lb){
//依次从a,b中找到较小的点插入到c后面
//三个指针a,b,c指向la,lb的首元结点,la的头结点
Linklist a = la->next;
Linklist b = lb->next;
Linklist c = la;
while(a&&b){//a,b指向结点都不为空
if(a->data == b->data){
c->next = a;//c的指针域指向a
c = a; //c指向下一结点
a = a->next;//a指向下一结点
b = b->next;//b跳过与a相同的结点
}
else if(a->data < b->data){
c->next = a;//c的指针域指向a
c = a;//c指向下一结点
a = a->next;//a指向下一结点
}
else{
c->next = b;
c = b;
b = b->next;
}
}
if(!a){
c->next = b;//剩余的插入到c之后
}
else{
c->next = a;
}
delete lb;//释放lb空间
return la;
}
int main(){
//编辑主函数
return 0;
}
线性表、链表的合并(代码)
于 2023-10-30 21:40:00 首次发布