第二章 线性表(2.7)

2.7.1线性表的合并

算法2.15线性表的合并

算法步骤

1、分别获取LA表长m和LB表长n

2、从LB表中第一个元素开始,循环n次执行以下操作:

从LB中查找第i个数据元素赋值给e;

在LA中查找元素e,如果不存在,则将e插在表LA的最后

算法描述

//合并
void Combine(SqList &A, SqList &B) 
{
	for (int i = 0; i < B.length; i++) 
	{
		int count = 0;
		for (int j = 0; j < A.length; j++) 
		{
			if (A.elem[j] == B.elem[i])
			{
				count += 1;
			}
		}
		if (count == 0) 
		{
			A.elem[A.length++] = B.elem[i];
		}
	}
}

代码

#include<iostream>

using namespace std;

\#define MAX 100

typedef struct 
{
	int *elem;
	int length;
}SqList;

//初始化
int InitSqList(SqList &L) 
{
	L.elem = new int[MAX]; // 为顺序表分配一个大小为MAX的存储空间
	if (!L.elem) 
	{
		return 0;  // 初始化失败 
	}
	else 
	{
		L.length = 0;
		return 1;  // 初始化成功 
	}
}

//获取表长
int ListLength(SqList L) 
{
	return L.length;
}

//遍历
void TraveList(SqList &L) 
{
	for (int i = 0; i < L.length; i++) 
	{
		printf("%d ", L.elem[i]);
	}
	

	printf("\n");

}

//创建线性表
void CreateList(SqList &L) 
{
	printf("请输入线性表的长度:");
	int n;
	scanf("%d", &n);
	

	for (int i = 0; i < n; i++) 
	{
		printf("请输入第%d个元素的值:", i + 1);
		int e;
		scanf("%d", &e);
		L.elem[i] = e;
		L.length = i + 1;
	}

}

//合并
void Combine(SqList &A, SqList &B) 
{
	for (int i = 0; i < B.length; i++) 
	{
		int count = 0;
		for (int j = 0; j < A.length; j++) 
		{
			if (A.elem[j] == B.elem[i])
			{
				count += 1;
			}
		}
		if (count == 0) 
		{
			A.elem[A.length++] = B.elem[i];
		}
	}
}

int main() 
{
	SqList A, B;

	if (InitSqList(A)) 
	{
		printf("线性表A初始化成功!\n");
	}
	else 
	{
		printf("线性表A初始化失败!\n");
	}
	 
	if (InitSqList(B)) 
	{
		printf("线性表B初始化成功!\n");
	}
	else 
	{
		printf("线性表B初始化成功!\n");
	}
	 
	CreateList(A);
	printf("A表长度:%d\n", A.length);
	TraveList(A);
	CreateList(B);
	printf("B表长度:%d\n", B.length);
	TraveList(B);
	 
	printf("合并后的线性表:\n");
	Combine(A, B);
	printf("合并后表长度:%d\n", A.length);
	TraveList(A);
	 
	system("pause");
	 
	return 0;

}

2.7.2有序表的合并

1.顺序有序表的合并

算法2.16顺序有序表的合并

算法步骤

创建一个空表Lc
依次从La或Lb中“摘取”元素值较小的结点插入到Lc表的最后,直至其中一个表变空为止
继续将La或Lb其中一个表的剩余结点插入在Lc表的最后

算法描述

void Combine(SqList A, SqList B, SqList &C) 
{
	int *pa, *pb, *pc, *pa_last, *pb_last;
	pa = A.elem;  // //指针pa和pb的初值分别指向两个表的第一个元素 
	pb = B.elem;
	C.length = A.length + B.length;  // 新表长度为待合并两表的长度之和 
	C.elem = new int[C.length];  // 为合并后的新表分配一个数组空间 
	pc = C.elem;  // 指针pc指向新表的第一个元素 
	pa_last = A.elem + A.length - 1;  // 指针pa_last指向LA表的最后一个元素 
	pb_last = B.elem + B.length - 1; // 指针pb_last指向LB表的最后一个元素 
	while (pa <= pa_last && pb <= pb_last) // 两个表都非空 
	{
		if (*pa <= *pb) 
		{
			*pc++ = *pa++;
		}
		else 
		{
			*pc++ = *pb++;
		}
	}
	while (pa <= pa_last) 
	{
		*pc++ = *pa++;
	}
	while (pb <= pb_last) 
	{
		*pc++ = *pb++;
	}
}

代码

#include<iostream>

using namespace std;

\#define MAX 100

typedef struct 
{
	int *elem;//存储空间基地址 
	int length;
}SqList;

int InitList(SqList &L) 
{
	L.elem = new int[MAX];
	if (!L.elem)
	{
		return 0;
	}
	L.length = 0;
	return 1;
}

void TraveList(SqList L) 
{
	for (int i = 0; i < L.length; i++) 
	{
		printf("%d ", L.elem[i]);
	}
	printf("\n");
}

void CreateList(SqList &L, int n) 
{
	printf("请输入表的元素:\n");
	for (int i = 0; i < n; i++) 
	{
		printf("请输入第%d个元素值:", i + 1);
		int e;
		scanf("%d", &e);
		L.elem[i] = e;
		L.length += 1;
	}
}

void Combine(SqList A, SqList B, SqList &C) 
{
	int *pa, *pb, *pc, *pa_last, *pb_last;
	pa = A.elem;  // //指针pa和pb的初值分别指向两个表的第一个元素 
	pb = B.elem;
	C.length = A.length + B.length;  // 新表长度为待合并两表的长度之和 
	C.elem = new int[C.length];  // 为合并后的新表分配一个数组空间 
	pc = C.elem;  // 指针pc指向新表的第一个元素 
	pa_last = A.elem + A.length - 1;  // 指针pa_last指向LA表的最后一个元素 
	pb_last = B.elem + B.length - 1; // 指针pb_last指向LB表的最后一个元素 
	while (pa <= pa_last && pb <= pb_last) // 两个表都非空 
	{
		if (*pa <= *pb) 
		{
			*pc++ = *pa++;
		}
		else 
		{
			*pc++ = *pb++;
		}
	}
	while (pa <= pa_last) 
	{
		*pc++ = *pa++;
	}
	while (pb <= pb_last) 
	{
		*pc++ = *pb++;
	}
}

int main() 
{
	SqList L1, L2;

	if (InitList(L1)) 
	{
		printf("L1初始化成功.\n");
	}
	else 
	{
		printf("L2初始化失败!\n");
	}
	 
	if (InitList(L2)) 
	{
		printf("L2初始化成功!\n");
	}
	else 
	{
		printf("L2初始化失败!\n");
	}
	 
	printf("请输入L1的长度:");
	int len1;
	scanf("%d", &len1);
	CreateList(L1, len1);
	printf("遍历L1:\n");
	TraveList(L1);
	 
	printf("请输入L2的长度:");
	int len2;
	scanf("%d", &len2);
	CreateList(L2, len2);
	printf("遍历表L2:\n");
	TraveList(L2);
	 
	SqList L3;
	Combine(L1, L2, L3);
	printf("合并后的表:\n");
	TraveList(L3);
	 
	system("pause");
	 
	return 0;

}

2.链式有序表的合并

算法2.17链式有序表的合并

算法步骤

Lc指向La
依次从La或Lb中“摘取”元素值较小的结点插入到Lc表的最后,直至其中一个表变空为止
继续将La或Lb其中一个表的剩余结点插入在LC表的最后
释放Lb表的表头结点

算法描述

void Combine(LinkList &L1, LinkList &L2, LinkList &L3) 
{
	LNode *pa, *pb, *pc;
	pa = L1->next;
	pb = L2->next;
	pc = L3 = L1; // //用L1的头结点作为L3的头结点 
	

	while (pa&&pb) 
	{
		if (pa->data <= pb->data) 
		{
			pc->next = pa;
			pc = pa;
			pa = pa->next;
		}
		else 
		{
			pc->next = pb;
			pc = pb;
			pb = pb->next;
		}
	}
	pc->next = pa ? pa : pb; // 插入剩余段 
	
	delete L2; // 释放L2的头结点

}

代码

#include<stdio.h>
\#include<iostream>
using namespace std;
\#define MAX 100

typedef struct LNode 
{
	int data;
	struct LNode *next;
}LNode, *LinkList;

int InitList(LinkList &L) 
{
	L = new LNode;
	L->next = NULL;
	return 1;
}

void TraveList(LinkList L) 
{
	struct LNode *p;
	p = L->next;
	

	while (p) 
	{
		printf("%d ", p->data);
		p = p->next;
	}
	printf("\n");

}

void CreateList(LinkList &L, int n) 
{
	L = new LNode;
	L->next = NULL;
	LNode *r;
	r = L;
	

	printf("请输入链表的元素:\n");
	for (int i = 0; i < n; i++)
	{
		LNode *p;
		p = new LNode;
		printf("请输入第%d个元素的值:", i+1);
		scanf("%d", &p->data);
		p->next = NULL;
		r->next = p;
		r = p;
	}

}

void Combine(LinkList &L1, LinkList &L2, LinkList &L3) 
{
	LNode *pa, *pb, *pc;
	pa = L1->next;
	pb = L2->next;
	pc = L3 = L1; // //用L1的头结点作为L3的头结点 
	

	while (pa&&pb) 
	{
		if (pa->data <= pb->data) 
		{
			pc->next = pa;
			pc = pa;
			pa = pa->next;
		}
		else 
		{
			pc->next = pb;
			pc = pb;
			pb = pb->next;
		}
	}
	pc->next = pa ? pa : pb; // 插入剩余段 
	
	delete L2; // 释放L2的头结点

}

int main()
{
	LinkList L1, L2, L3;

	if (InitList(L1)) 
	{
		printf("L1初始化成功!\n");
	}
	else
	{
		printf("L1初始化失败!\n");
	}
	 
	if (InitList(L2)) 
	{
		printf("L2初始化成功!\n");
	}
	else {
		printf("L2初始化失败!\n");
	}
	 
	if (InitList(L3)) 
	{
		printf("L3初始化成功!\n");
	}
	else 
	{
		printf("L3初始化失败!");
	}
	 
	printf("请输入L1的长度:");
	int n1;
	scanf("%d", &n1);
	CreateList(L1, n1);
	printf("遍历L1:\n");
	TraveList(L1);
	 
	printf("请输入L2的长度:");
	int n2;
	scanf("%d", &n2);
	CreateList(L2, n2);
	printf("遍历L2:\n");
	TraveList(L2);
	 
	Combine(L1, L2, L3);
	printf("合并后的表:\n");
	TraveList(L3);
	 
	system("pause");
	 
	return 0;

}
posted @ 2022-02-10 16:15    阅读(92)  评论(0)    收藏  举报