顺序表:删除A表中既在B表出现又在C表出现的元素

该博客详细介绍了如何实现一个C++算法,用于删除一个顺序表中同时存在于两个其他递增有序表的元素。首先,算法通过比较B表和C表找出共同元素,然后遍历A表并删除与这些共同元素相匹配的项。文章还包含了算法的时间复杂度分析以及完整的C++代码实现,包括数据结构定义、初始化、插入、删除等辅助函数。
摘要由CSDN通过智能技术生成

删除A表中既在B表出现又在C表出现的元素

数据结构题目

题目:已知A,B和C为三个递增有序的线性表,现要求对A表作如下操作:删去那些既在B表中出现又在C表中出现的元素。试对顺序表编写实现上述操作的算法,并分析你的算法的时间复杂度(注意:题中没有特别指明同一表中的元素值各不相同)。

算法思想:先比较B表和C表,找到同样的元素并存入数组中,再遍历A表,比较是否有元素和数组中的元素相同,若相同,则删除该元素。

题目来自数据结构严蔚敏教材习题集2.29。

c++代码如下:

#include <iostream>
#include <stdlib.h>
using namespace std;
#define ListInitSize 256							//初次分配空间大小 
#define ListIncrement 128							//空间分配增量大小 

typedef struct List
{
	int *pData;										//动态存储空间的基地址 
	int length;										//存储数据元素的个数
	int size;										//当前已分配的存储空间的大小 
}List;

void InitList( List &L )
{	//初始化顺序表
	cout<<"-进行初始化操作-"<<endl; 
	L.pData = (int *)malloc(ListInitSize * sizeof(int));			//申请存储空间
	if( L.pData == NULL )
		exit(1);									//存储空间申请失败
	L.size = ListInitSize;							//当前已分配的存储空间大小
	L.length = 0;									//存储数据元素个数为零
}	//InitList

void ListTraverse( List L )
{	//访问并输出每个元素
	cout<<"-输出顺序表如下-"<<endl; 
	for( int i = 0; i < L.length; i++ )				//遍历整个顺序表 
	{
	 	cout<<L.pData[i]<<endl;						//访问并输出元素 
	}
}	//ListTraverse

void InsertElem( List &L, int i, int e )
{	//在顺序表第i个位置上插入数据元素e
	if( i < 1 || i > L.length+1 )					//参数检查
		cout<<"error2"<<endl;
	if( L.length >= L.size )						//当前存储空间已满,需增加存储空间
	{
		int *newbase = ( int* ) realloc( L.pData, (L.size+ListIncrement)*sizeof(int) );
		if( newbase == NULL )
			cout<<"error3"<<endl;					//内存申请失败
		L.pData = newbase;
		L.size += ListIncrement; 
	}
	//从最后一个元素开始,直到下标为i-1(物理位置)的元素,依次向后挪一个位置
	for( int j = L.length-1; j >= i-1; j-- )
		L.pData[j+1] = L.pData[j];
	L.pData[i-1] = e;								//在数组下标为i-1的位置上插入元素e
	L.length += 1;									//顺序表的长度加1
}	//InsertElem

void DeleteElem( List &L, int i )
{	//将顺序表第i个(逻辑位置)元素删除
	if( i < 1 || i > L.length )						//参数检查
		cout<<"error4"<<endl;
	//从第i个位置(物理位置)开始到最后一个元素,依次向前挪一个位置
	for( int j = i; j <= L.length-1; j ++ )
	{
		L.pData[j-1] = L.pData[j];
	}
	
	L.length -= 1;									//顺序表长度减1
}	//DeleteElem

List DeleteBCElem( List &La, List &Lb, List &Lc )
{	//删除既在B表出现又在C表出现的元素
	int i, j, k = 0, e[La.length];
	for( i = 0; i < Lb.length; i ++ )				//遍历表B 
	{
		for( j = 0; j < Lc.length; j ++ )			//遍历表C
		{
			if( Lb.pData[i] == Lc.pData[j] )		//同一个元素既在B表出现又在C表出现 
			{
				e[k] = Lb.pData[i];					//使用数组存储起来 
				k ++;
			}
		}
	 }
	 for( i = 0; i < La.length; i ++ )				//遍历表A 
	 {
	 	for( j = 0; j < k; j ++ )
		{
	 		if( La.pData[i] == e[j] )				//A表中也出现了相同的元素
				DeleteElem(La,i+1);					//删除该元素 
		}
	} 
	return La;
}	//DeleteBCElem

int main()
{
	List La, Lb, Lc;
	int i, n, d;
	int &e = d;
	InitList(La);
	InitList(Lb);
	InitList(Lc);
	cout<<"-请输入A表的长度n"<<endl;
	cin>>n;
	cout<<"-请依次输入A表的数据元素-"<<endl;
	for( i = 1; i <= d; i ++ )
	{
		cin>>d;
		InsertElem(La,i,e);
	}
	cout<<"-请输入B表的长度n"<<endl;
	cin>>n;
	cout<<"-请依次输入B表的数据元素-"<<endl;
	for( i = 1; i <= n; i ++ )
	{
		cin>>d;
		InsertElem(Lb,i,e);
	}
	cout<<"-请输入C表的长度n"<<endl;
	cin>>n;
	cout<<"-请依次输入C表的数据元素-"<<endl;
	for( i = 1; i <= n; i ++ )
	{
		cin>>d;
		InsertElem(Lc,i,e);
	}
	cout<<"-删除A表中既在B表出现又在C表出现的元素-"<<endl;
	La = DeleteBCElem(La,Lb,Lc);
	ListTraverse(La);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值