哪位大佬能帮看看这道c语言?
按题意,既利用指针将b中每个元素按照升序插入到a数组对应位置。
思路:
a,b都是默认输入升序的数(题目没要求验证,我的代码也不验证,请按升序输入,如需验证升序输入,只需定义一个变量记录输入的数字,并在下次循环输入时比大小。)
所以,定义2个指针分别指向a,b最后一个输入的元素地址,嵌套循环,分别往前移动,同时比较两数组元素,每次找到对应位置就将a移位并插入b的位置。
ps:由于存在b小于a的所有元素这种特殊情况,循环外还有a数组全部后移的情况。故位移写成单独函数,符合编程习惯。
下面是代码:
#include <stdio.h>
void move1(int *bp,int a[],int len)//从bp开始往后移动1位
{
int *ep=&a[len-1];
if(bp>=a && bp<=ep)
while(ep>bp)//a当前元素之后的元素向后移1位
{
*ep=*(ep-1);
ep--;
}
}
int main()
{
int i=0,m=50,a[50],b[3],*pa=NULL,*pb=&b[2],flag;
while(m>47) printf("请输入m值(>=47):"),scanf("%d",&m);
printf("请给a数组输入%d个整数(确保升序排列,输入无验证!):\n",m);
i=m;
while(i--) scanf("%d",&a[m-i-1]);
printf("请给b数组输入3个整数(确保升序排列,输入无验证!):\n"),scanf("%d%d%d",&b[0],&b[1],&b[2]);
while(pb>=b)//从b最大数开始
{
pa=&a[m-1];//初始指向a最大数
while(pa>=a)//从a最大数开始
{
flag=0;
if(*pa<=*pb)//找到第一个a小于等于b,就把b元素插入到a元素后面(a移位)
{
flag=1;
move1(pa+1,a,50);//a当前元素之后的元素向后移1位
*(pa+1)=*pb;
break;
}
pa--;
}
if(!flag)//如未发生位移,说明该b元素小于所有a元素,插入再a数组开始位置,a所有元素后移1位
move1(a,a,50),a[0]=*pb;
pb--;
}
pa=a;
printf("合并后的a数组为:\n");
while(pa<=&a[m+3-1]) printf("%d ",*pa++);
return 0;
}
谢谢
简单粗暴思路:直接将b数组的数字放到a数组m到m+2位置,然后对长度m+3的a数组进行排序。
#include "stdafx.h"
#include <iostream>
using namespace std;
void swap(int*p, int*q);
int main()
{
int a[50], b[3],m;
int *p, *q;
p = a;
q = b;
cout << "m:";
cin >>m;
cout <<"a:";
for (int i = 0; i < m; i++)
cin >> *(p+i);
cout << "b:";
for (int i = 0; i < 3; i++)
{
cin >>*(q+i);
*(p+m+i)=*(q+i);
}
for (int i = 0; i < m + 3; i++)
cout << *(p + i)<<" ";
cout << endl;
for (int i = 0; i < m + 3; i++)
{
for (int j = 0; j < m + 3 - i; j++)
if (*(p + i) > *(p + i + j))
swap(p + i, p + i + j);
}
for (int i = 0; i < m + 3; i++)
cout << *(p + i)<<" ";
cout << endl;
system("pause");
return 0;
}
void swap(int*p, int*q)
{
int temp;
temp = *p;
*p = *q;
*q = temp;
}
忘记说了……老师的作业要求上说着不能先移进去再排序,谢谢
广告 您可能关注的内容 |