【C】使用指针对数组中的元素换位问题

首先一条比较简单的问题:

输入10个整数,将其中最小的数字与第一个数字对换,把最大的数与最后一个数对换。

编写3个函数:(1)输入10个数字(2)进行处理(3)输出10个数字

思想如下图,使用一个长度为11的数组的第1~10位置存储这10个数,这样既符合人的思维又利用a[0]作为数据交换时候的临时存储空间,


代码如下,实现起来非常简单,主要是注意,C语言的指针是如何操作的,包括声明、处理等。

#include<stdio.h>
void input(int a[]){
	for(int i=1;i<11;i++){
		printf("a[%d]=",i);
		scanf("%d",a+i);//因为&*(a+i),所以这里原本有的,求位置与地址的&,被求地址所值的内容*所抵消了
	}
}
void process(int a[]){
	int *p,*t;//用于实现交换操作的指针
	//求出数组中的最大值、最小值
	//这里绝不存在min=*a这样的表达
	//因为数组的头指针是一个死指针,严禁对其进行任何操作
	//但p=a+i是可以的,因为p只是一个指向该数组的指针
	int max=a[1],min=a[1];
	p=a+1;
	t=a+1;//p,t必须被初始化,否则如果最小的数在数组的开头,会出现空指针报错
	for(int i=2;i<11;i++){
		if(max<*(a+i)){
			max=*(a+i);
			p=a+i;//直接把指针插在a的最大值处
		}
		if(min>*(a+i)){
			min=*(a+i);
			t=a+i;
		}
	}
	//交换1,利用a[0]用作处理空间。
	a[0]=*p;
	*p=a[10];
	a[10]=a[0];
	//交换2
	a[0]=*t;
	*t=a[1];
	a[1]=a[0];
}
void output(int a[]){
	for(int i=1;i<11;i++){
		printf("%d,",*(a+i));
	}
	printf("\n");
}
void main(){
	int a[11];
	printf("请输入一个数组:\n");
	input(a);
	printf("数组为:\n");
	output(a);
	process(a);
	printf("处理之后的数组为:\n");
	output(a);
}

运行结果如下:


之后是一条提高了难度的经典题目,但是也不是很难:

有n个整数,使其前面各数顺序向后移m个位置,即把最后m个数变成最前面m个数,如图所示:


代码实现如下:

#include<stdio.h>
void input(int a[],int n){
	for(int i=1;i<n+1;i++){
		printf("a[%d]=",i);
		scanf("%d",a+i);//因为&*(a+i),所以这里原本有的,求位置与地址的&,被求地址所值的内容*所抵消了
	}
}
void process(int a[],int n,int m){
	int *p=a+1;
	for(int i=1;i<n+1-m;i++){
		p++;//将指针移到需要操作的位置
	}
	for(int i=1;p<a+n+1;i++,p++){
		a[0]=*p;
		*p=*(a+i);
		*(a+i)=a[0];
	}
	
}
void output(int a[],int n){
	for(int i=1;i<n+1;i++){
		printf("%d,",*(a+i));
	}
	printf("\n");
}
void main(){
	int a[255];
	int n,m;
	printf("你想输入的数字的数量n=");
	scanf("%d",&n);
	printf("请输入一个数组:\n");	
	input(a,n);
	printf("数组为:\n");
	output(a,n);
	printf("要把最后的几个数移到最前?m=");
	scanf("%d",&m);
	process(a,n,m);
	printf("处理之后的数组为:\n");
	output(a,n);
}

运行结果如下所示:


在输入、输出部分与上面的题目,完全相同,都是数组的简单处理。

在处理部分也不难,把指针p移到要操作的位置,

再也把迭代的i移回数组头,接下去i与指针p同步移动,每一次移动,把数组交换一次,直到p移到数组的末端,算法结束。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值