分别创建两个有序的顺序表(每个表的元素个数及每个元素的值在运行时由键盘输入),现将两个有序表合并,并保证新表依然为有序的顺序表。
算法思想
先各自确定两个顺序表的长度并且各自输入对应长度的个数的元素,最后归并两个顺序表。
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
struct node{ //定义顺序表
int *elem;
int len;
};
void Init_arr(int len,struct node &arr) //初始化顺序表
{
int i=0,j=0,k=0;
int t;
arr.elem=(int *)malloc(len*sizeof(int));
if(arr.elem!=NULL) //内存分配是否成功的判断
{
for(i=0;i<len;i++)
scanf("%d",&arr.elem[i]);
arr.len=len;
for(j=0;j<len-1;j++) //冒泡排序
{
for(k=0;k<len-j-1;k++)
{
if(arr.elem[k]>arr.elem[k+1])
{
t=arr.elem[k];
arr.elem[k]=arr.elem[k+1];
arr.elem[k+1]=t;
}
}
}
}
else{printf("内存分配失败!");
exit(0);
}
}
void Combine_arr(struct node &arr1,struct node &arr2,struct node &arr) //归并顺序表
{
int i=0,j=0,k=0;
arr.elem=(int *)malloc(1000*sizeof(int));
if (arr.elem!=NULL)
{
while(i<arr1.len&&j<arr2.len)
{if(arr1.elem[i]>arr2.elem[j]){
arr.elem[k++]=arr2.elem[j];
j++;
}
else{
arr.elem[k++]=arr1.elem[i];
i++;
}
}
if(i>=arr1.len) //只剩一个表还未归并入新表
{
for(j;j<arr2.len;j++)
arr.elem[k++]=arr2.elem[j];
}
else
{
for(i;i<arr1.len;i++)
arr.elem[k++]=arr1.elem[i];
}
arr.len=k; //新顺序表长度
}
else
{
printf("内存分配失败!");
exit(0);
}
}
void traverse_arr(struct node &arr) //遍历显示出顺序表
{
int i=0;
for(i=0;i<arr.len;i++)
printf("%d ",arr.elem[i]);
printf("\n");
}
int main(void)
{
int p,q;
struct node arr1,arr2,arr;
printf("顺序表1的元素个数为:");scanf("%d",&p);
printf("请输入第1个bd元素:");Init_arr(p,arr1);
traverse_arr(arr1);
printf("顺序表2的元素个数为:");scanf("%d",&q);
printf("请输入第2个bd元素:");Init_arr(q,arr2);
traverse_arr(arr2);
Combine_arr(arr1,arr2,arr);
traverse_arr(arr);
return 0;
}
如果有什么问题和疑问,欢迎在评论区留言哦~