C++合并两个有序表

问题描述:

分别创建两个有序的顺序表(每个表的元素个数及每个元素的值在运行时由键盘输入),现将两个有序表合并,并保证新表依然为有序的顺序表。

源代码:

#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;
}

测试结果:

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值