今天又看到了顺序有序表的合并,好神奇(≧▽≦)/
于是就试啦一下๑乛◡乛๑
sequential list head.h头文件
#ifndef SEQUENTIAL_LIST_HEAD_H_INCLUDED
#define SEQUENTIAL_LIST_HEAD_H_INCLUDED
#define MAXSIZE 100 //顺序表最大长度
#define ElemType int
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef struct
{
ElemType *elem; //储存空间的基地址
int length; //当前长度
} Sqlist;
Status InitList(Sqlist &L); //初始化线性表
Status GetElem(Sqlist L,int i,ElemType &e); //取值
Status LocateElem(Sqlist L,ElemType e); //查找
Status ListInsert(Sqlist &L,int i,ElemType e); //插入
Status ListDelete(Sqlist &L,int i); //删除
void TraverseList(Sqlist L); //遍历
Sqlist CreatList(int n); //创建(类似于链表的创建)
#endif // SEQUENTIAL_LIST_HEAD_H_INCLUDED
void mergeList(Sqlist a,Sqlist b,Sqlist &c)
{//已知顺序有序表a和b递增排列,归并a,b得有序表c,也递增排列。
c.length=a.length+b.length;
c.elem=new ElemType[c.length];
ElemType *pa,*pb,*pc,*pa_last,*pb_last;
pc=c.elem; //指针pc指向新表的第一个元素
pa=a.elem;pb=b.elem; //指针pa和pb的初值分别指向两个表的第一元素
pa_last=a.elem+a.length-1; //指针pa_last指向a的最后一个元素
pb_last=b.elem+b.length-1; //指针pb_last指向b的最后一个元素
while(pa<=pa_last&&pb<=pb_last) //表a和b均为达到表尾
{
if(*pa<=*pb) //依次“摘取”两表中的最小值插入表c
*pc++=*pa++;
else
*pc++=*pb++;
}
while(pa<=pa_last) //b已达到表尾,依次将a中剩余元素插入
*pc++=*pa++;
while(pb<=pb_last) //a已达到表尾,依次将b中剩余元素插入
*pc++=*pb++;
}
main.c文件
#include <iostream>
#include "sequential list head.h"
void mergeList(Sqlist a,Sqlist b,Sqlist &c);
using namespace std;
int main() //用于测试的主函数
{
int n;
Sqlist LA,LB,LC;
cout<<"input the long of data about LA:";
cin>>n;
LA=CreatList(n);
cout<<"input the long of data about LB:";
cin>>n;
LB=CreatList(n);
mergeList(LA,LB,LC);
TraverseList(LC);
return 0;
}
void mergeList(Sqlist a,Sqlist b,Sqlist &c)
{//已知顺序有序表a和b递增排列,归并a,b得有序表c,也递增排列。
c.length=a.length+b.length;
c.elem=new ElemType[c.length];
ElemType *pa,*pb,*pc,*pa_last,*pb_last;
pc=c.elem; //指针pc指向新表的第一个元素
pa=a.elem;pb=b.elem; //指针pa和pb的初值分别指向两个表的第一元素
pa_last=a.elem+a.length-1; //指针pa_last指向a的最后一个元素
pb_last=b.elem+b.length-1; //指针pb_last指向b的最后一个元素
while(pa<=pa_last&&pb<=pb_last) //表a和b均为达到表尾
{
if(*pa<=*pb) //依次“摘取”两表中的最小值插入表c
*pc++=*pa++;
else
*pc++=*pb++;
}
while(pa<=pa_last) //b已达到表尾,依次将a中剩余元素插入
*pc++=*pa++;
while(pb<=pb_last) //a已达到表尾,依次将b中剩余元素插入
*pc++=*pb++;
}