天天看点

线性表合并——合并两个集合

现有两个线性表LA和LA分别表示两个集合A和B,合并为一个新的集合A=A∪B.
           

完整代码如下:

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <malloc.h>
#include <iostream> 
using namespace std;

#define LIST_INIT_SIZE 100	//线性表存储空间初始分配量
#define LISTINCREMENT  10 	//线性表存储空间的分配增量
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define MAX_SIZE 100
#define List int

typedef int Status;
typedef int ElemType;
typedef struct
{
    ElemType *elem;		//存储空间基址
    int length;    		//当前长度
    int listsize;  		//当前分配的存储容量(以sizeof(ElemType)为单位)
} SqList;

/****************基本操作函数*****************/ 
//1.线性表L的初始化
Status InitList_Sq(SqList &L)			//构建一个空的线性表 
{
	L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
	if ( !L.elem )						//存储分配失败	
		exit(OVERFLOW);
	L.length = 0;						//空表长度为0 
	L.listsize = LIST_INIT_SIZE;		//初始化存储容量 
	return OK;
} 

//2.求线性表的长度
int GetLength(SqList L)
{
	return(L.length);
} 

//3.顺序表的取值,根据位置i获取内容
int GetElem(SqList L, int i, ElemType &e)
{
	if (i < 1 || i > L.length)		//判断i的位置是否合理 
		return ERROR;
	else
		return (L.elem[i-1]); 		//第i-1个单元存储着第i个数据 
} 

//4.顺序表的查找
//算法思想:
//	1.在线性表L中查找与指定元素e相同的数据元素的位置
//	2.从表的一端开始,逐个进行比较 
int LocateElem(SqList L, ElemType e)
{
	for (int i = 0; i < L.length; i++)
	{
		if (L.elem[i] == e)
			return (i+1);		
	}
	return ERROR;
}

//5.创建顺序表函数 初始化前n个数据
int CreatList(SqList &L, int n)
{
	if (n < 0 || n > LIST_INIT_SIZE)
		return ERROR;				//n非法
	for (int i = 0; i<n; i++)
	{
		scanf("%d", &L.elem[i]);
		L.length++;
	}
	return OK;	
}

//6.顺序表的插入
//算法思想:
//	1.判断插入位置i是否合法
//	2.判断顺序表的存储空间是否已满,已满增加存储空间
//	3.将第n至第i位的元素一次向后移动一个位置,空出第i个位置
//	4.将要插入的新元素放入e放入第i个位置
//	5.表长加1,插入成功返回OK 
Status ListInsert_Sq(SqList &L , int i, ElemType e)
{
	ElemType *newbase, *p, *q;
	
	if (i < 1 || i > L.length+1)		//i值不合法 
		return ERROR;
		
	if (L.length >= L.listsize)			//当前存储空间已满,增加分配 
	{
		newbase = (ElemType *)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));
		if ( !newbase )					//分配失败 
			exit(OVERFLOW);
		L.elem = newbase;				//新基址 
		L.listsize += LISTINCREMENT;	//增加存储容量 
	}
	
	q = &(L.elem[i-1]);					//q为插入位置的地址 
	for (p = &L.elem[L.length-1]; p >= q; --p)
	{
		*(p+1) = *p;					//插入位置及之后的元素后移一个位置 
	}
	*q = e;								//全部移动完后插入e 
	++L.length;							//表长加1 
	return OK;
} 


//********************************功能函数*****************************************//
//输出功能函数 按位置从小到大输出顺序表所有元素
void PrintList(SqList L)
{
	printf("当前顺序表所有元素:");
	for (int i = 0; i<L.length; i++)
	{
		printf("%d ", L.elem[i]);
	}
	printf("\n");
}

//创建顺序表函数
void Create(SqList &L)
{
	int n;
	L.length = 0;
	printf("请输入要创建的顺序表长度(>1):");
	scanf("%d", &n);
	printf("请输入%d个数(空格隔开): ", n);
	
	if ( CreatList(L, n) ) 
	{
		printf("创建成功!\n");
		PrintList(L);
	}
	else 
		printf("输入长度非法!\n");
}

//合并顺序表 
//	将所有在顺序表Lb但不在La中的数据元素插入到La中 
void unionn(SqList &La, SqList Lb)
{
	int La_len = GetLength(La);				//求顺序表长度 
	int Lb_len = GetLength(Lb);
	ElemType equal, e;
	
	for (int i = 1; i <= Lb_len; i++)
	{
		equal = GetElem(Lb, i, e);			//取Lb中第i个数据元素赋值给equal 
		if ( !LocateElem(La, equal) )		//La中不存在和e相同的数据元素,则插入 
		{
			ListInsert_Sq(La, ++La_len, equal);
		}
	}
}

//主函数 
int main()
{
	SqList La; 
	InitList_Sq(La);
	printf("请录入顺序表La的数据:\n");
	Create(La);
	printf("\n");
	SqList Lb; 
	InitList_Sq(Lb);
	printf("请录入顺序表Lb的数据:\n");
	Create(Lb);
	printf("\n");
	unionn(La, Lb);
	printf("输出合并后的顺序表La: \n");
	PrintList(La);
	printf("\n");

	return 0;
}

           

运行结果

线性表合并——合并两个集合

继续阅读