按題意,既利用指針將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;
}