问题描述:
分别创建两个有序的顺序表(每个表的元素个数及每个元素的值在运行时由键盘输入),现将两个有序表合并,并保证新表依然为有序的顺序表。
源代码:
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<iostream>
#define LIST_INIT_SIZE 100
using namespace std;
typedef struct node{ //定义顺序表(数组)
int *elem;//基址
int len;
int listsize;
}Node;
void creatSqlist(int len,Node &arr) //初始化顺序表
{
int i=0,j=0,k=0;
int t;
arr.elem=(int *)malloc(len*sizeof(int));//动态分配内存空间,指针赋给elem地址
arr.listsize = LIST_INIT_SIZE;
if(arr.elem!=NULL) //内存分配是否成功的判断
{
for(i=0;i<len;i++){
cin>>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 combineSqlist(Node &arr1,Node &arr2,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++;
}
}
while(j<arr2.len){//arr2未排完
arr.elem[k++] = arr2.elem[j++];
}
while(i<arr1.len){//arr1未排完
arr.elem[k++] = arr1.elem[i++];
}
arr.len=k; //新顺序表长度
}
else
{
printf("内存分配失败!");
exit(0);
}
}
void displaySqlist(struct node &arr) //遍历显示出顺序表
{
int i=0;
for(i=0;i<arr.len;i++)
printf("%d ",arr.elem[i]);
printf("\n");
}
int main(void)
{
int len1,len2;
Node arr1,arr2,arr;
printf("顺序表1的元素个数为:");
cin>>len1;
printf("请输入顺序表arr1的元素(注意个数):");
creatSqlist(len1,arr1);
displaySqlist(arr1);
printf("顺序表2的元素个数为:");
cin>>len2;
printf("请输入顺序表arr2的元素(注意个数):");
creatSqlist(len2,arr2);
displaySqlist(arr2);
combineSqlist(arr1,arr2,arr);
cout<<"新的合并后的顺序表为:"<<endl;
displaySqlist(arr);
return 0;
}
测试结果: