1.问题描述
将a,b两个有序顺序表进行合并,放在c顺序表当中,并且要保证顺序表c仍然有序。
2.解题思路
因为a,b两个顺序表是有序的,所有可以从前往后一起查找a,b当中最小的一个数值,放入到c中。文章来源:https://www.toymoban.com/news/detail-716995.html
如果遍历到最后,a遍历完了,b没有遍历完,就把b剩下的放入c中;反之,b遍a没有遍历完,就把a剩下的放入c中。文章来源地址https://www.toymoban.com/news/detail-716995.html
3.实现代码
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef int ElemType;
typedef struct { //顺序表的结构
ElemType *data;
int length;
int listsize;
}List;
int InitList(List *L) //初始化顺序表
{
L->data = (ElemType*)malloc(MAXSIZE*sizeof(ElemType));
if(!(L->data))
exit(0);
L->length=0;
L->listsize=MAXSIZE;
return 1;
}
void CreatList(List *L) //创建一个顺序表
{
int i;
printf("请输入测试的数据总数:\n");
scanf("%d",&L->length);
printf("请输入测试的数据:\n");
for(i=0;i<L->length;i++)
scanf("%d",&L->data[i]);
}
void Printf(List *L) //打印顺序表中的值
{
int i;
if(L->length==0)
{
printf("顺序表为空!");
return ;
}
else
for(i=0;i<L->length;i++)
printf("%d ",L->data[i]);
printf("\n");
}
void MergeList(List *a,List *b,List *c){ //合并两个顺序表放入c中
int i=0;
int j=0;
int k=0;
int La_len=a->length;
int Lb_len=b->length;
c->length=a->length+b->length;
while((i<La_len)&&(j<Lb_len)){
if(a->data[i]<=b->data[j]) //如果a当前的值小于b
{
c->data[k]=a->data[i]; //c放入当前a的值
i++; //a,c都往后移一位
k++;
}
else{ //如果a当前值大于等于b
c->data[k]=b->data[j]; //c放入当前b的值
j++; //b,c都往后移一位
k++;
}
}
while(i<La_len){ //如果b遍历完,a还没遍历完,把a剩余的全放入c中
c->data[k]=a->data[i];
k++;
i++;
}
while(j<Lb_len){ //如果a遍历完,b还没遍历完,把b剩余的全放入c中
c->data[k]=b->data[j];
k++;
j++;
}
}
int main()
{
List *L1;
List *L2;
List *L3;
L1 = (List*) malloc(sizeof(List));
L2 = (List*) malloc(sizeof(List));
L3 = (List*) malloc(sizeof(List));
InitList(L1);
InitList(L2);
CreatList(L1);
CreatList(L2);
printf("输入顺序表A:");
Printf(L1);
printf("输入顺序表B:");
Printf(L2);
L3->data = (ElemType*)malloc(MAXSIZE*sizeof(ElemType));
MergeList(L1,L2,L3);
getchar();
printf("输入顺序表C:");
Printf(L3);
getchar();
return 0;
}
到了这里,关于数据结构:两个顺序表合并算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!