C++ 线性表
1.设A、B均为用数组实现的List类型的有序顺序表,试设计一个函数Alternate,从A、B读取值,构件数组C,使得C的值也有序。
要求:用不同的方式实现(至少两种)
#include<iostream>
#include<malloc.h> // malloc()
#include<process.h> //exit()
using namespace std;
const int LIST_INIT_SIZE = 100;
struct SqList{
int *elem;
int length;
int listsize;
};
//初始化线性表,构造一个空表
void InitList(SqList &L);
//清空线性表
void ClearList(SqList &L);
//返回线性表数据元素的个数
int ListLength(SqList L);
//获取线性表第i个位置上的数据
void GetElem(SqList L,int i,int &e);
//将空表的前n项填上数字
void Add_num_to_List(SqList &L,int num);
//插入操作
void ListInsert(SqList &L,int i,int e);
//合并到表C 法1
void Alternate_1(SqList L_A,SqList L_B,SqList &L_C);
//合并到表C法2
void Alternate_2(SqList L_A,SqList L_B,SqList &L_C);
//打印出线性表内容
void PrintList(SqList L);
int main()
{
SqList L_A,L_B,L_C;
InitList(L_A);
InitList(L_B);
InitList(L_C);
Add_num_to_List(L_A,5);
Add_num_to_List(L_B,6);
PrintList(L_A);
PrintList(L_B);
Alternate_1(L_A,L_B,L_C);
PrintList(L_C);
ClearList(L_C);
Alternate_2(L_A,L_B,L_C);
PrintList(L_C);
}
//初始化线性表,构造一个空表
void InitList(SqList &L)
{
//分配空间
//L.elem = new int[LIST_INIT_SIZE];
L.elem = (int *)malloc(LIST_INIT_SIZE*sizeof(int));
if(!L.elem)
{
cout<<"内存空间分配失败!"<<endl;
exit(0);
}
L.length = 0;
L.listsize = LIST_INIT_SIZE;
}
//清空线性表
void ClearList(SqList &L)
{
for(int i =1;i <= L.length;i++)
{
L.elem[i-1] = 0;
}
L.length = 0;
//cout<<"清空线性表成功!"<<endl;
}
//返回线性表数据元素的个数
int ListLength(SqList L)
{
return L.length;
}
//获取线性表第i个位置上的数据
void GetElem(SqList L,int i,int &e)
{
for(int j = 1;j <= L.length;j++)
{
if(j == i)
{
e = L.elem[j-1];
break;
}
}
}
//将空表的前n项填上数字
void Add_num_to_List(SqList &L,int num)
{
L.length = num;
for(int i = 1;i <= L.length;i++)
{
cin>>L.elem[i-1];
}
}
//拓展空间操作
bool ExpandList(SqList &L,int num)
{
int *p=L.elem;
//拓展新的大小
//L.elem = new int[L.length+num];
L.elem = (int *)malloc((L.length+num)*sizeof(int));
if(!L.elem)
{
return false;
exit(0);
}
else
{
for(int i =1;i <=L.length;i++)
{
//将原有的数据元素搬入新开辟的内存空间中
L.elem[i-1] = p[i-1];
}
L.length = L.length + num;
L.listsize = LIST_INIT_SIZE + num;
free(p);//将旧的空间释放
//delete [] p;
return true;
}
}
//插入操作
void ListInsert(SqList &L,int i,int e)
{
if(i<1||i>L.length+1)
{
// cout<<"超出可插入的线性表范围,请重新输入插入的位序!"<<endl;
// return false;
exit(0);
}
if(L.length >= LIST_INIT_SIZE)
{
bool flag = ExpandList(L,(L.length-LIST_INIT_SIZE));
if(flag == true)
{
for(int j = L.length;j >= i;j--)
{
L.elem[j]=L.elem[j-1];
}
L.elem[i-1] = e;
L.length++;
// return true;
}
else
{
// cout<<"线性表空间已满且未成功分配空间!";
// return false;
exit(0);
}
}
else
{
for(int j = L.length;j >=i;j--)
{
L.elem[j]=L.elem[j-1];
}
L.elem[i-1] = e;
L.length++;
// return true;
}
}
//打印线性表
void PrintList(SqList L)
{
for(int i = 1;i <=L.length; i++)
{
cout<<L.elem[i-1]<<" ";
}
cout<<endl;
}
//合并到表C 法1 升序输入到c中
void Alternate_1(SqList L_A,SqList L_B,SqList &L_C)
{
int a,b;
int i,j,k;
i = j = k =1;
int L_A_len = ListLength(L_A);
int L_B_len = ListLength(L_B);
int a_e,b_e;
while((i <= L_A_len)&&(j <= L_B_len))
{
GetElem(L_A,i,a_e);
GetElem(L_B,j,b_e);
if(a_e <= b_e)
{
ListInsert(L_C,k,a_e);
k++;
i++;
}
else
{
ListInsert(L_C,k,b_e);
k++;
j++;
}
}
while( i <= L_A_len)
{
GetElem(L_A,i,a_e);
ListInsert(L_C,k,a_e);
k++;
i++;
}
while(j <= L_B_len)
{
GetElem(L_B,j,b_e);
ListInsert(L_C,k,b_e);
k++;
j++;
}
}
//合并到表C法2
void Alternate_2(SqList L_A,SqList L_B,SqList &L_C)
{
int j,temp;
int k = 1;
for(int i = 1;i <= L_A.length;i++)
{
ListInsert(L_C,k,L_A.elem[i-1]);
k++;
}
for(int i = 1;i <= L_B.length;i++)
{
ListInsert(L_C,k,L_B.elem[i-1]);
k++;
}
for(int i = 1;i < L_C.length-1;i++)
{
temp = L_C.elem[i];//要插入的数
j = i-1;
while(j >= 0&&L_C.elem[j]>temp)
{
L_C.elem[j+1] = L_C.elem[j];
j--;
}
L_C.elem[j+1] = temp;
}
}