一般線性表的合併(C語言描述)

2020-10-22 01:00:57

一、題目描述

假設利用兩個線性表 LA 和 LB 分別表示兩個集合 A 和 B (即線性表中的資料元素為集合中的成員),現要求一個新的集合 A = AUB .假如,設
LA = (7,5,3,11)
LB = (2,6,3)
合併後
LA = (7,5,3,11,2,6)

二、演演算法

(1)演演算法思想

擴大線性表LA,將存在於線性表LB中而不存在於LA中的資料放到線性表LA中。只要從線性表LB中依次取得每個元素,並依次線上性表LA中進行查訪,若不存在則將其插入。

(2)演演算法描述

/*合併*/
void Union(LinkList& LA, LinkList& LB,int n,int m)
{
	int e,a;
	for (int i = 1;i <= n;i++)
	{
		e = GetElem(LB, i, e);//取LB中第i個元素賦值給e
		a = LocateElem(LA, e);//返回0或者1
		if (a != 1 )//連結串列裡面元素為空了或者沒有找到元素
			ListInsert(LA,m, e);//LA中不存在和e相同的資料元素,插入
	}
}

三、完整原始碼

#include<stdio.h>
#define OK 1
#define ERROR 0

typedef int ElemType;
typedef int Status;

/*定義鏈式儲存結構*/
typedef struct LNode
{
	ElemType data;
	struct LNode* next;
}*LinkList;

/*連結串列的初始化*/
Status InitList(LinkList& L)
{
	L = new LNode;
	L->next = NULL;
	return OK;
}

/*建立連結串列*/
void CreateList(LinkList& L,int n)
{
	LinkList p;//生成一個新結點*p
	L = new LNode;
	L->next = NULL;
	for (int i = n;i > 0;--i)
	{
		p = new LNode;
		printf("請輸入第%d個元素:", i);
		scanf_s("%d", &p->data);//輸入元素
		p->next = L->next;//新結點與後繼結點接起來
		L->next = p;//新結點與前驅結點接起來
	}
}

/*按序號查詢元素*/
Status GetElem(LinkList L, int i, ElemType& e)
{
	LinkList p;
	int j = 1;
	p = L->next;//初始化,p指向第一個結點
	while (p && j < i)
	{
		p = p->next;//p向後掃描
		++j;
	}
	if (!p || j > i) return ERROR;//i值不存在
	e = p->data;//第i個元素的資料域賦值給e
	return e;
}

/*查訪LA*/
Status LocateElem(LinkList L, ElemType e)
{
	LinkList p;
	p = L->next;//p指向頭結點
	while ( p && p->data != e )//連結串列不為空且沒有找到要找元素就一直迴圈
	{
		p = p->next;//p往下找
	}
	/*跳出迴圈,要麼是連結串列沒元素,要麼是找到要找的元素*/
	if (!p) return ERROR;//如果連結串列空了,返回0
	return OK;//返回1說明找到元素了
}

/*插入到LA*/
Status ListInsert(LinkList &L,int m,ElemType &e)
{
	LinkList p;
	p = L;
	int j = 0;
	while (p && j < m)
	{
		p = p->next;
		++j;
	}
	if (!p || j > m) return ERROR;
	LinkList s;//新建結點
	s = new LNode;
	s->data = e;//存入資料域
	s->next = p->next;//更改指標的位置
	p->next = s;
	return OK;
}

/*合併*/
void Union(LinkList& LA, LinkList& LB,int n,int m)
{
	int e,a;
	for (int i = 1;i <= n;i++)
	{
		e = GetElem(LB, i, e);//取LB中第i個元素賦值給e
		a = LocateElem(LA, e);//返回0或者1
		if (a != 1 )//連結串列裡面元素為空了或者沒有找到元素
			ListInsert(LA,m, e);//LA中不存在和e相同的資料元素,插入
	}
}

/*輸出連結串列*/
void PrintList(LinkList L)
{
	LinkList p;
	p = L->next;
	while (p)
	{
		printf("%d,", p->data);
		p = p->next;
	}
}

int main()
{
	int m, n,e;
	LinkList LA, LB;//宣告兩個連結串列
	InitList(LA);//初始化LA
	InitList(LB);//初始化LB

	printf("請輸入LA元素的個數m:");
	scanf_s("%d", &m);
	CreateList(LA, m);//建立LA
	printf("集合LA的元素為:");
	printf("LA=(");
	PrintList(LA);//輸出集合LA
	printf(")\n");
	printf("\n");

	printf("請輸入LB元素的個數n:");
	scanf_s("%d", &n);
	CreateList(LB, n);//建立LB
	printf("集合LB的元素為:");
	printf("LB=(");
	PrintList(LB);//輸出集合LB
	printf(")\n");
	printf("\n");

	printf("合併後集合為:");
	Union(LA,LB,n,m);//合併LA和LB
	printf("LA=(");
	PrintList(LA);
	printf(")\n");
	return 0;
}

四、執行結果展示

在這裡插入圖片描述