设线性表A、B,元素值为整型,且递减有序,编写函数,实现下列功能:采用顺序结构,要求在A的空间上构成一个新线性表C,其元素为A和B元素的并集,且表C中的元素值递减有序(互不相同)。
数据结构题目
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 )
{ //初始化顺序表
L.pData = (int *)malloc(ListInitSize * sizeof(int)); //申请存储空间
if( L.pData == NULL )
exit(1); //存储空间申请失败
L.size = ListInitSize; //当前已分配的存储空间大小
L.length = 0; //存储数据元素个数为零
} //InitList
void ListTraverse( List L )
{ //访问并输出每个元素
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 RankList( List &L )
{
int i, j;
for( i = 0; i < L.length-1; i ++ ) //冒泡排序
{
for( j = 0; j < L.length-i-1; j ++ )
{
if( L.pData[j] > L.pData[j+1] )
{
L.pData[j] = L.pData[j] + L.pData[j+1]; //交换数值
L.pData[j+1] = L.pData[j] - L.pData[j+1];
L.pData[j] = L.pData[j] - L.pData[j+1];
}
}
}
}
void DeleteReElem( List &L )
{ //删除重复的元素值
int l = 0;
while( l < L.length ) //每一个元素都要和其他元素相比较
{ //顺序表移动过后仍要进行比较
for( int i = 0; i < L.length; i ++ )
{
for( int j = i+1 ; j < L.length; j ++)
{
if( L.pData[i] == L.pData[j] ) //发现重复元素
{
int s;
//从第j个位置(物理位置)开始到最后一个元素,依次向前挪一个位置
for( s = j+1; s <= L.length; s ++ )
{
L.pData[s-1] = L.pData[s];
}
L.pData[s] = 0;
}
}
}
l ++;
}
}
void NewList( List &La, List &Lb )
{
int lenb = Lb.length, lena = La.length, i;
for( i = lena; i < lena + lenb; i ++ ) //在La后接上Lb
{
InsertElem(La, i+1, Lb.pData[i-lena]);
}
DeleteReElem(La); //删去重复的元素值
RankList(La); //重新进行排序
}
int main()
{
List La, Lb;
int i, n;
int &e = n;
cout<<"-进行La的初始化操作-"<<endl;
InitList(La); //初始化
cout<<"-请输入顺序表的长度-"<<endl;
cin>>n;
cout<<"-请逐个输入顺序表的数据元素-"<<endl;
for( i = 1; i <= n; i ++ )
{
cin>>x;
InsertElem(L, i, e);
}
RankList(La); //先对La中的元素进行排序
cout<<"输出顺序表如下:"<<endl;
ListTraverse(La);
cout<<endl;
cout<<"-进行Lb的初始化操作-"<<endl;
InitList(Lb); //初始化
for( i = 1; i <= 4; i ++ )
{
cin>>n;
InsertElem(Lb, i, e);
}
RankList(Lb); //先对La中的元素进行排序
cout<<"输出顺序表如下:"<<endl;
ListTraverse(Lb);
cout<<"-进行取并集操作-"<<endl;
NewList(La, Lb); //取并集后得到新的顺序表
cout<<"输出顺序表如下:"<<endl;
ListTraverse(La);
cout<<endl;
}