前言
NWAFU 2019阶段1_4
一、题目描述
题目描述
调整正整型数组使奇数全部都位于偶数前面,注意数组的遍历顺序要求为一方从左端开始向后,另一方从右端开始向前,若前数为偶数且后数为奇数,则进行交换,否则继续遍历。程序主体已经完成(请左键点击这里下载,文件在本地另存为main.c后答题),但其中包含若干错误,请根据题目要求改正程序中的所有错误,使其顺利达成题目功能要求。
输入
正整型数组的元素个数sz(sz<4000),然后依次为数组各元素的整型值
输出
交换过程,其格式为:Times 交换次数:数1<==>数2,每次交换占一行
然后输出交换后的数组各元素,元素之间用一个空格分隔,最后一个元素后无空格
样例输入
9
1 2 3 4 5 6 7 8 9
样例输出
Times 1: 2<==>9
Times 2: 4<==>7
1 9 3 7 5 6 4 8 2
二、设计步骤
最重要的考点在于动态内存分配,应当为(sz+1) * sizeof(int),否则会导致内存泄漏。
代码实现:
#include <stdio.h>
#include <stdlib.h>
/* 交换指针a和b所指向的两个整数 */
void ex_num(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
/* 调整正整型数组a,其中n为数组元素的个数 */
void exchange(int a[], int n)
{
int left, right;
int cnt = 1;
left = 0;
right = n;
while (left < right)
{
if (!(a[left] & 1) && (a[right] & 1)) {
printf("Times %d: %d<==>%d\n", cnt++, a[left], a[right]);
ex_num(&a[left], &a[right]);
}
left = (a[left] & 1) ? left+1 : left;
right = !(a[right] & 1) ? right-1 : right;
}
return;
}
int main()
{
int *arr, i,sz;
scanf("%d",&sz);
arr=(int *)malloc((sz+1) * sizeof(int));
if (arr==NULL) return 0;
for (i = 0; i < sz; i++) {
scanf("%d", &arr[i]);
}
exchange(arr, sz);
for (i = 0; i < sz; i++) {
if(i)
printf(" ");
printf("%d", *(arr+i));
}
printf("\n");
free(arr);
return 0;
}
总结
EOF