假設利用兩個線性表 LA 和 LB 分別表示兩個集合 A 和 B (即線性表中的資料元素為集合中的成員),現要求一個新的集合 A = AUB .假如,設
LA = (7,5,3,11)
LB = (2,6,3)
合併後
LA = (7,5,3,11,2,6)
擴大線性表LA,將存在於線性表LB中而不存在於LA中的資料放到線性表LA中。只要從線性表LB中依次取得每個元素,並依次線上性表LA中進行查訪,若不存在則將其插入。
/*合併*/
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;
}