天天看點

順序表示的線性表——順序表3——線性表差集

利用線性表的基本運算,實作如果線上性表A中出現的元素,線上性表B中也出現,則将A中該元素删除。,也就是求兩個線性表的差集。

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"
/*删除A中出現B的元素的函數聲明*/
void DelElem(SeqList *A, SeqList B);
void main()
{
	int i, j, flag;
	DataType e;
	/*聲明順序表A,B*/
	SeqList A, B;
	/*初始化順序表*/
	InitList(&A);
	InitList(&B);
	/*插入順序表A中10個數*/
	for ( i = 1; i <= 10; i++)
	{
		if (InsertList(&A, i, i*2+10)==0)
		{
			cout << "位置不合法!" << endl;
			return;
		}
	}
	/*插入順序表B中8個數*/
	for ( i = 1,j=10; i <= 8;j=j+2, i++)
	{
		if (InsertList(&B,i,j+i*2)==0)
		{
			cout << "位置不合法!" << endl;
			return;
		}

	}
	cout << "順序表A中的元素:" << endl;
	for ( i = 1; i <= A.length; i++)
	{
		flag = GetElem(A, i, &e);
		if (flag==1)
		{
			cout << e << " ";
		}
	}
	cout << endl;
	cout << "順序表B中的元素:" << endl;
	for ( i = 1; i <= B.length; i++)
	{
		flag = GetElem(B, i, &e);
		if (flag == 1)
		{
			cout << e << " ";
		}
	}
	cout << endl;

	cout << "将A中出現在B中的元素删除後, A剩餘的元素(A-B):" <<endl;

	DelElem(&A, B);
	/*顯示删除後A中的所有的元素*/
	for  ( i = 1; i <= A.length; i++)
	{
		flag = GetElem(A, i, &e);
		if (flag==1)
		{
			cout << e << " ";
		}
	}
	cout << endl;
	getchar();
}
/*求A-B,删除A中含有B中元素剩下的A*/
void DelElem(SeqList *A, SeqList B)
{
	int i, flag, pos;
	DataType e;
	for (i = 1; i <= B.length; i++)
	{
		flag = GetElem(B, i, &e);/*依次把B中元素取出來給e*/
		if (flag==1)
		{
			pos = LocateElem(*A, e);   /*在A中查找e*/
			if (pos > 0)               /*如果該元素存在*/
			{
				DeleteList(A, pos, &e);/*删除該元素*/
			}
		}
	}
}
           

結果:

順序表示的線性表——順序表3——線性表差集