合并兩個線性表中的元素,相同的元素隻保留一個
SeqList.h
#pragma once
#define ListSize 200
#include <iostream>
using namespace std;
typedef int DataType;
typedef struct
{
DataType list[ListSize];
int length;
}SeqList;
//初始化線性表
void InitList(SeqList *L)
{
L->length = 0;//把線性表長度置為0
}
//判斷線性表是否為空,線性表為空傳回1,否則傳回0
int ListEmpty(SeqList L)
{
if (L.length == 0)
return 1;
else
return 0;
}
//按照序号查找
int GetElem(SeqList L, int i, DataType *e)
/*查找線性表中第i個元素,查找成功傳回給e,并傳回1表示成功,否則傳回-1,表示失敗*/
{
if (i<1 || i>L.length)
return -1;
else
*e = L.list[i - 1];
return 1;
}
//按照内容查找
int LocateElem(SeqList L, DataType e)
{
int i;
for (i = 0; i < L.length; i++)/*從第一個元素開始與e進行比較*/
if (L.list[i] == e) /*若存在與e相等的元素*/
return i + 1; /*傳回該元素的線上性表中的序号*/
return 0; /*否則,傳回0 */
}
//插入操作
int InsertList(SeqList *L, int i, DataType e)
/*在順序表中的第i個位置插入元素e,插入成功傳回1,插入不合法傳回-1,順序表滿傳回0.*/
{
int j;
if (i<1||i>L->length+1)/*在插入元素前,判斷插入位置是否合法*/
{
cout <<"插入位置"<<i<<"不合法!" << endl;
return -1;
}
else if (L->length>=ListSize)/*在插入元素之前,判斷順序表是否已經滿,不能插入元素*/
{
cout << "順序表已經滿,不能插入元素。" << endl;
return 0;
}
else
{
for (j = L->length; j >= i; j--)
/*将第i個位置以後的元素依次後移*/
{
L->list[j] = L->list[j - 1];
}
L->list[i - 1] = e;
L->length = L->length + 1;
return 1;
}
}
/*删除操作,删除第i個元素*/
int DeleteList(SeqList *L, int i, DataType *e)
{
int j;
if (L->length<=0)
{
cout << "順序表表已空,不能進行删除!" << endl;
return 0;
}
else if (i<1||i>L->length)
{
cout << "删除位置不合适!" << endl;
return -1;
}
else
{
*e = L->list[i - 1];
for (j = i; j <= L->length - 1;j++)
{
L->list[j - 1] = L->list[j];
}
L->length = L->length - 1;
return 1;
}
}
/*求線性表的長度*/
int ListLength(SeqList L)
{
return L.length;
}
/*清空順序表*/
void ClearList(SeqList *L)
{
L->length = 0;
}
main.cpp
/*合并兩線性表中的元素,相同元素隻保留一個*/
#include"SeqList.h"
/*将線性表LB中但不線上性表LA中的元素插入線性表LA中*/
void UnionAB(SeqList *A, SeqList B);
void main()
{
int i, flag;
DataType e;
DataType a[] = { 81, 32, 61, 12, 39, 25 };
DataType b[] = { 12, 44, 39, 16, 28, 6, 61, 76 };
/*聲明順序表LA, LB*/
SeqList LA, LB;
/*初始化順序表LA,LB*/
InitList(&LA);
InitList(&LB);
/*将a數組的元素插入LA中*/
for ( i = 0; i < sizeof(a)/sizeof(a[0]); i++)
{
if (InsertList(&LA,i+1,a[i])==0)
{
cout << "位置不合法!" << endl;
return;
}
}
/*将b數組中的元素插入 LB中*/
for ( i = 0; i < sizeof(b)/sizeof(b[0]); i++)
{
if (InsertList(&LB, i+1, b[i])==0)
{
cout << "位置不合法!" << endl;
return;
}
}
cout << "順序表LA中的元素:" << endl;
/*輸出LA中的每一個元素*/
for ( i = 1; i <= LA.length; i++)
{
flag = GetElem(LA, i, &e);
if (flag==1)
{
cout << e <<" ";
}
}
cout << endl;
cout << "順序表LB中的元素:" << endl;
/*輸出LB中的每一個元素*/
for ( i = 1; i <= LB.length; i++)
{
flag = GetElem(LB, i, &e);
if (flag==1)
{
cout << e <<" ";
}
}
cout << endl;
cout << "将LB中但不在LA中的元素插入LA中:" << endl;
UnionAB(&LA, LB);
/*輸出合并後的LA表*/
for ( i = 1; i <= LA.length; i++)
{
flag = GetElem(LA, i, &e);
if (flag==1)
{
cout << e << " ";
}
}
cout << endl;
getchar();
}
/*删除LA中出現LB元素的函數實作*/
void UnionAB(SeqList *LA, SeqList LB)
{
int i, flag, pos;
DataType e;
for ( i = 1; i <= LB.length; i++)
{
flag = GetElem(LB, i, &e);
if (flag==1)
{
pos = LocateElem(*LA, e);/*在LA中查找和LB中取出的e元素相等的元素*/
if (!pos)
{
InsertList(LA, LA->length + 1, e);/*如果找到該元素将元素插入LA中,在LA最後一個元素後面插入*/
}
}
}
}
結果: