题目:编写一个算法实现两个有序(从小到大)顺序表合并成为一个顺序表,合并后的结果放在第一个顺序表中,不另设新的顺序表存储(假设这两个有序顺序表中没有相同的元素)。
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef struct{
ElemType *elem;
int length;
int listsize;
}SqList;
Status InitList_Sq(SqList *L);
Status DestroyList_Sq(SqList *L);
Status GetElem_Sq(SqList L,int i,ElemType *e);
Status ListInsert_Sq(SqList *L,int i,ElemType e);
Status ListTraverse_Sq(SqList L,int (*visit)(ElemType L,ElemType i));
Status smaller(ElemType a,ElemType b);
Status visit(ElemType L,ElemType i);
#include <stdio.h>
#include <stdlib.h>
int main()
{
SqList L1,L2;
int n1,n2;
int data,i,j,k=1;
ElemType *e0,*e1,*e2,*e3;
printf("创建线性表L1和L2 : \n");
InitList_Sq(&L1);//创建L1
InitList_Sq(&L2);//创建L2
//为L1输入数据
printf("请输入一个整数确定线性表 1 中添加的元素个数 : ");
scanf("%d",&n1);getchar();
//输入L1的数据
for(i=1;i <= n1;i++)
{
printf("请输入第 %d 个元素的值 : ",i);
scanf("%d",&data);getchar();
ListInsert_Sq(&L1,i,data); //插入数据
printf("表中第%d个元素值是 %d.\n",i,data);
}
ListTraverse_Sq(L1,&visit);
//为L2输入数据
printf("请输入一个整数确定线性表 2 中添加的元素个数 : ");
scanf("%d",&n2);getchar();
//输入L2的数据
for(i=1;i <= n2;i++)
{
printf("请输入第 %d 个元素的值 : ",i);
scanf("%d",&data);getchar();
ListInsert_Sq(&L2,i,data); //插入数据
printf("插入的位置在 %d 元素值是 %d.\n",i,data);
}
ListTraverse_Sq(L2,&visit);
printf("运行结果是 : \n");
/*实现思想
从L2尾取第一个元素e2,如果该元素的值比L1尾元素的值大,则直接把e2插入到L1尾
否则进入下一判断:获取L1头元素 e0,如果e2小于e0,则直接把e2插入到L1头
否则再进行下一判断:当L1中未比较的值只有一个时,进行判断,决定是否插入
否则再进行下一判断:获取L1中相邻两元素的值e1,e3
如果e2的值在e1和e3之间,则插入;
OK!收工。*/
for(i=L2.length;i>0;i--)
{
GetElem_Sq(L2,i,&e2);
for(j=L1.length;j>0;j--)
{
GetElem_Sq(L1,L1.length,&e0);
if(smaller(e0,e2))
ListInsert_Sq(&L1,++j,e2);
else if(0 == j)
ListInsert_Sq(&L1,++j,e2);
else if(1 == j)
{
GetElem_Sq(L1,j,&e1);
if(smaller(e2,e1))
{
ListInsert_Sq(&L1,j,e2);
}
}
else
{
GetElem_Sq(L1,j,&e1);
GetElem_Sq(L1,j-1,&e3);
if(smaller(e2,e1) && smaller(e3,e2))
{
ListInsert_Sq(&L1,j,e2);
}
}
}
}
ListTraverse_Sq(L1,&visit);
printf("销毁线性表L1和L2 : \n");
DestroyList_Sq(&L1);
DestroyList_Sq(&L2);
return 0;
}
Status InitList_Sq(SqList *L)
{ //构建一个空的顺序线性表L
L->elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L->elem){printf("线性表新建失败!!\n");exit(OVERFLOW);}
L->length = 0;
L->listsize = LIST_INIT_SIZE;printf("线性表新建成功!!\n");
return OK;
}//InitList_Sq
Status DestroyList_Sq(SqList *L)
{ //销毁顺序线性表L
if(!L->elem)exit(ERROR);
free(L->elem);
printf("线性表销毁成功!!\n");
return OK;
}//DestroyList_Sq
Status GetElem_Sq(SqList L,int i,ElemType *e)
{ //返回顺序线性表L中第i个元素的值
if(!L.elem){printf("线性表不存在!!\n"); return ERROR;}
if(i < 1 || i > L.length+1){printf("输入的位置不在线性表中!!\n");return ERROR;}
*e = L.elem[i-1];
return OK;
}//GetElem_Sq
Status ListInsert_Sq(SqList *L,int i,ElemType e)
{ //在顺序线性表L中第i个位置插入新元素e,L的长度加1
if(!L->elem){printf("线性表不存在!!\n"); return ERROR;}
if(i < 1 || i > L->length+1){printf("位置不在线性表中!!\n");return ERROR;}
if(L->length >= L->listsize)
{
ElemType newbase = (ElemType *)realloc(L->elem,
(L->listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)exit(ERROR);
L->elem = newbase;
L->listsize += LISTINCREMENT;
}
ElemType *p,*q;
q = &(L->elem[i-1]);
for(p = &L->elem[L->length-1];p >= q;--p) *(p+1) = *p;
*q = e;
++L->length;
return OK;
}//ListInsert_Sq
Status ListTraverse_Sq(SqList L,int (*visit)(ElemType,ElemType))
{ //依次对L中的每个数据元素调用函数visit()。一旦visit()失败,则操作失败。
//假设visit()的功能是判断数据元素的值是否大于100,大于100返回FALSE,否则返回TRUE
if(!L.elem){printf("线性表不存在!!\n"); return ERROR;}
ElemType *p = L.elem;
int i=1;
while (i <= L.length && (*visit)(*p++,i))
{
printf("表中第 %d 个元素是: %d \n",i,L.elem[i-1]);
++i;
//j = (*visit)(*p++,i);
}
return OK;
}//ListTraverse_Sq
Status smaller(ElemType a,ElemType b)
{
if(a < b)return 1;
else return 0;
}//smaller
Status visit(ElemType L,ElemType i)
{
if(1000 >= L)
{
return TRUE;
}
else
{
return FALSE;
}
}//visit