0.举例
La = 1,3,7,9
Lb = 2,6,10
输出:Lc = 1,2,3,6,7,9,10
1.初始定义
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 100 //初始分配量
#define LISTINCREMENT 10 //增量
typedef int Status;
//变量定义
//线性表顺序结构:
typedef struct{
int *elem;//存储空间基址 数据类型为int
int length;//当前长度
int listsize;//分配容量
}SqList;
2.解一
//排序函数
void RankList_Sq(SqList &L){//非递减有序排列
//对线性表L数据非递减排序
int *p,*q;
for(p = L.elem;p<L.elem+L.length-1;p++){
for(q = p+1;q<=L.elem+L.length-1;q++){
if(*p>=*q){
int t;
t = *p;
*p = *q;
*q = t;
}
}
}
}
//合并函数
void MergeList_Sq_1(SqList La,SqList Lb,SqList &Lc){//La Lb 合并Lc 且Lc非递减有序排列 方法1
for(int i = 1;i<=La.length;i++){ //将La中元素放入Lc
Lc.elem[Lc.length] = La.elem[i-1];
Lc.length++;
}
for(int i = 1;i<=Lb.length;i++){ //将La中元素放入Lc
Lc.elem[Lc.length] = Lb.elem[i-1];
Lc.length++;
}
RankList_Sq(Lc); //重新对Lc元素排序
}
3.解二
//将La Lb 合并为Lc
void MergeList_Sq_2(SqList La,SqList Lb,SqList &Lc){//La Lb 合并Lc 且Lc非递减有序排列 方法2
int *pa = La.elem; //pa指针指向La
int *pb = Lb.elem; //pb指针指向Lb
Lc.listsize = Lc.length = La.length + Lb.length;// 设置Lc的大小和长度
int *pc = Lc.elem = (int *)malloc(Lc.listsize * sizeof(int)); //为Lc分配空间
if(!Lc.elem){
exit(OVERFLOW);
}
int *pa_last = La.elem + La.length - 1; //设置pa指针最终的位置
int *pb_last = Lb.elem + Lb.length - 1; //设置pb指针最终的位置
while(pa<=pa_last && pb<=pb_last){ //比较pa pb指向的内容
if(*pa<=*pb){
*pc++ = *pa++; //pc指向小的
}
else{
*pc++ = *pb++;
}
}
while(pa<=pa_last){ //最后pc指针直接指向La或Lb中剩余的元素
*pc++ = *pa++;
}
while(pb<=pb_last){
*pc++ = *pb++;
}
}
4.优化
由于两表合并最后存储的一个里面,则可能出现多个重复元素,利用下面的函数可以将重复元素只保留一个
void CrepeatList_Sq(SqList &L){//消除重复元素
for(int i = 1;i<L.length;i++){
for(int j = i+1;j<=L.length;){
if(L.elem[i-1]==L.elem[j-1]){
int k;
ListDelete_Sq(L,j,k);
//当出现重复元素并删除后 因为j为第j个元素的位序 所以此时的j不用j++;
}
else{
j++;
}
}
}
}
5.线性表顺序结构基本操作说明
点此查看:《线性表顺序结构操作》
——————END——————
作者注:
记录学习,分享经验。
有兴趣可以关注博主,以后还会持续更新内容哦~