需要注意的是:
*L.elem=L.elem[0]
*(L.elem+i)=L.elem[i]
指针程序(线性表从L.elem[0]开始):
//通过指针比较合并la、lb为lc,使得lc仍为非递减序列
#include<stdio.h>
#include<malloc.h>
#include<iostream>
using namespace std;
#define OVERFLOW -2
#define OK 1
#define LIST_INIT_SIZE 20
#define LISTINCREMENT 10
typedef struct{
int *elem;
int length;
int listsize;
}SqList;
SqList la,lb,lc;
int InitList(SqList &l)
{
l.elem=(int*)malloc(LIST_INIT_SIZE*sizeof(int));
if(!l.elem) exit(OVERFLOW);
l.length=0;
l.listsize=LIST_INIT_SIZE;
return OK;
}
void MergeList(SqList la,SqList lb,SqList &lc)
{
int *qa,*qb,*qc;
int *qa_last,*qb_last;
qa=la.elem;
qb=lb.elem;
lc.length=lc.listsize=la.length+lb.length;
lc.elem=qc=(int*)malloc(lc.listsize*sizeof(int));
if(!lc.elem)
exit(OVERFLOW);
qa_last=la.elem+la.length-1;
qb_last=lb.elem+lb.length-1;
while(qa<=qa_last && qb<=qb_last)
{
if(*qa <= *qb)
*qc++ = *qa++;
else
*qc++ = *qb++;
}
while(qa <= qa_last)
*qc++ = *qa++;
while(qb <= qb_last)
*qc++ = *qb++;
}
int main()
{
int i;
InitList(la);
InitList(lb);
cout<<"请依次输入la、lb的表长:"<<endl;
cin>>la.length;cin>>lb.length;
cout<<"请依次输入la、lb的元素:"<<endl;
for(i=0;i<la.length;i++)
cin>>la.elem[i];
for(i=0;i<lb.length;i++)
cin>>lb.elem[i];
MergeList(la,lb,lc);
cout<<"la、lb合并为lc的结果为:"<<endl;
for(i=0;i<lc.length;i++)
cout<<lc.elem[i]<<" ";
}
//la: 3,5,8,11
//lb: 2,6,8,9,11,15,20
//lc: 2,3,5,6,8,8,9,11,11,15,20
非指针程序:
//已知线性表la、lb中的数据元素按值非递减有序排列,要求la、lb
//归并为一个总表lc,lc仍为非递减排序
#include<stdio.h>
#include<iostream>
using namespace std;
#define OVERFLOW -2
#define OK 1
#define ERROR 0
#define LIST_INIT_SIZE 20//线性表存储空间的初始量
#define LISTINCREMENT 10//线性表存储空间的增量
typedef struct{
int *elem;//储存空间的基地址
int length;//当前长度
int listsize;//当前分配的储存容量
}SqList;
SqList la,lb,lc;
int InitList(SqList &l)
{
l.elem=(int*)malloc(LIST_INIT_SIZE*sizeof(int));
if(!l.elem) exit(OVERFLOW);
l.length=0;
l.listsize=LIST_INIT_SIZE;
return OK;
}
void MergeList(SqList la,SqList lb,SqList &lc)
{
int i=1,j=1,k=0;
InitList(lc);
while((i<=la.length)&&(j<=lb.length))
{
if(la.elem[i]<=lb.elem[j])
{
lc.elem[++k]=la.elem[i];
i++;
}
else
{
lc.elem[++k]=lb.elem[j];
j++;
}
lc.length++;
}
while(i<=la.length)
{
lc.elem[++k]=la.elem[i];
i++;
lc.length++;
}
while(j<=lb.length)
{
lc.elem[++k]=lb.elem[j];
j++;
lc.length++;
}
}
int main()
{
int i;
int *base;
InitList(la);InitList(lb);
cout<<"请输入la的长度:"<<endl;
cin>>la.length;
if(la.length>=LIST_INIT_SIZE)
{
base=(int*)realloc(la.elem,(la.listsize+LISTINCREMENT)*sizeof(int));
if(!base) exit(OVERFLOW);
la.elem=base;
la.listsize+=LISTINCREMENT;
}
cout<<"请输入lb的长度:"<<endl;
cin>>lb.length;
if(lb.length>=LIST_INIT_SIZE)
{
base=(int*)realloc(lb.elem,(lb.listsize+LISTINCREMENT)*sizeof(int));
if(!base) exit(OVERFLOW);
lb.elem=base;
lb.listsize+=LISTINCREMENT;
}
cout<<"请依次输入la的元素:"<<endl;
for(i=1;i<=la.length;i++)
cin>>la.elem[i];
cout<<"请依次输入lb的元素:"<<endl;
for(i=1;i<=lb.length;i++)
cin>>lb.elem[i];
MergeList(la,lb,lc);
cout<<"la、lb归并后lc中的元素为:"<<endl;
for(i=1;i<=lc.length;i++)
cout<<lc.elem[i]<<" ";
}
//la: 3,5,8,11
//lb: 2,6,8,9,11,15,20
//lc: 2,3,5,6,8,8,9,11,11,15,20
运行结果: