由于编者水平有限,如有错误,请多多包涵。
/*
File name: Example.cpp
Description: 非递减有序线性表LA, 非递减有序线性表LB, 要求排序后存放在LC中,且LC元素仍然为非递减有序排列
Author: Yang_Jiang
Date: 2018年10月12日
Compiler:Visual Studio 2008
*/
# include
# include
# define ElemType int //自定义数据类型
# define MaxSizeLA 15 //LA表长度
# define MaxSizeLB 20 //LB表长度
//定义结构体
typedef struct
{
// ElemType elem1[MaxSize]; 可以直接开辟空间,也可以使用动态内存分配 一块连续的内存空间来使用
ElemType* elem;
int length; //表示该顺序表的实际长度
}SqList,*PSqList;
//函数声明
void inti_list(PSqList , int ); //初始化线性表
void insertLA(PSqList); //向LA表插入非递减有序元素
void insertLB(PSqList); //向LA表插入非递减有序元素
void sort_list(PSqList LA, PSqList LB, PSqList LC); //排序后全部存放到LC表
int main()
{
//非递减有序 顺序表LA , LB
SqList LA;
SqList LB;
//非递减有序LC 排序完成后也是非递减有序顺序表
SqList LC;
//初始化顺序表LA , LB
inti_list(&LA,MaxSizeLA);
inti_list(&LB,MaxSizeLB);
inti_list(&LC,MaxSizeLA + MaxSizeLB);
//向LA LB 插入 非递减有序 数据
insertLA(&LA);
insertLB(&LB);
//打印LA表数据
for(int i=0; i< MaxSizeLA; i++)
{
printf("%d \t ", LA.elem[i]);
}
printf("\n");
//打印LB表数据
for(int i=0; i< MaxSizeLB; i++)
{
printf("%d \t ", LB.elem[i]);
}
//排序
sort_list(&LA,&LB,&LC);
printf("\n排序后:\n");
//打印LC表数据
for(int i=0; i < LC.length ; i++)
{
printf("%d \t ", LC.elem[i]);
}
return 0;
}
/*
函数名:inti_list();
参数:PSqList L , int length
初始条件:MaxSize已经给定
功能:初始化线性表,长度为length
返回值:暂无
*/
void inti_list(PSqList L , int length)
{
L->elem = (ElemType *) malloc(sizeof (ElemType) * length); //开辟一块连续的空间
if( !L->elem )
{
exit(-1); //动态内存空间开辟失败
}
else
{
L->length = 0; //线性表实际长度为0
}
}
/*
函数名:insertLA();
参数:PSqList L
初始条件:线性表已经初始化
功能:向线性表LA添加非递减有序元素
返回值:暂无
*/
void insertLA(PSqList LA)
{
int k = 1;
for(int i=0; i< MaxSizeLA; i++)
{
LA->elem[i] = k + i;
LA->length ++;
}
}
/*
函数名:insertLB();
参数:PSqList L
初始条件:线性表已经初始化
功能:向线性表LB添加非递减有序元素
返回值:暂无
*/
void insertLB(PSqList LB)
{
int k = 2;
for(int i=0; i< MaxSizeLB; i++)
{
LB->elem[i] = k + i;
LB->length ++;
}
}
/*
函数名:sort_list();
参数:PSqList LA, PSqList LB, PSqList LC
初始条件:线性表LA,LB已经按非递减有序排列 且LC已经初始化
功能:非递减有序存放到LC表
返回值:暂无
*/
void sort_list(PSqList LA, PSqList LB, PSqList LC)
{
int a = 0; //LA下标
int b = 0;//LB下标
int c = 0;// LC下标
while( a < LA->length && b < LB->length)
{
if(LA->elem[a] <= LB->elem[b])
{
LC->elem[c] = LA->elem[a];
c++;
a++;
LC->length++;
}
else
{
LC->elem[c] = LB->elem[b];
c++;
b++;
LC->length ++;
}
}
while( a < LA->length)
{
LC->elem[c] = LA->elem[a];
c++;
a++;
LC->length++;
}
while( b < LB->length)
{
LC->elem[c] = LB->elem[b];
b++;
c++;
LC->length++;
}
}
/*
总结
为了更加理解指针和动态内存分配 没有使用 ElemType elem1[MaxSize] 的写法
排序要注意 排列好后要判断LA和LB 还有没有数据存在 有数据存在直接存入LC 因为此时数据已经是排列好的
如果LA LB ! (非递减有序线) 可以通过冒泡排序先对LA LB排序好
然后在进行 非递减有序线 排序
顺序表的缺点: 插入和删除需要耗费大量的时间 代价太大了。
长度固定,需要预先分配存储空间,可能造成大量空间浪费或空间不足的情况。
本程序在Visual Studio 2008编译通过,文件是.cpp文件,代码的写法有点不规范,既有C语言
语法也包含了C++语法 望海涵。
*/