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

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

算法思想

先各自确定两个顺序表的长度并且各自输入对应长度的个数的元素,最后归并两个顺序表。

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

如果有什么问题和疑问,欢迎在评论区留言哦~

发布了33 篇原创文章 · 获赞 7 · 访问量 4562

猜你喜欢

转载自blog.csdn.net/qq_45239614/article/details/102472428