删除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);
}