关于C语言指针的一个问题
解决时间 2021-06-05 19:01
- 提问者网友:美人性情
- 2021-06-05 06:51
void main()
{
int a[10],*p=a,*max=a,*min=a,t;
for (p=a;p<a+10;p++)
scanf("%d",p);
for (p=a+1;p<a+10;p++)
{
if (*(p-1)<*p) max=p;
if (*(p-1)>*p) min=p;
}
t=*max,*max=*(a+9),*(a+9)=t;
t=*min,*min=*a,*a=t;
for (p=a;p<a+10;p++)
printf ("%d",*p);
printf("\n");
getch();
}
代码如上,目的是输入10个整数存入一维数组,将其中最大数和最后一个数交换,最小数跟第一个数交换。请问哪里错了,tc2.0调试无出错。但是结果不对
最佳答案
- 五星知识达人网友:等灯
- 2021-06-05 07:22
void main()
{
int a[10],*p=a,*max=a,*min=a,t;
for (p=a;p<a+10;p++)
scanf("%d",p);
for (p=a+1;p<a+10;p++)
{
if (*max<*p) max=p;
if (*min>*p) min=p;
}
t=*max,*max=*(a+9),*(a+9)=t;
if (*min != *(a+9))
t=*min,*min=*a,*a=t;
for (p=a;p<a+10;p++)
printf ("%d ",*p);
printf("\n");
getch();
}
全部回答
原因是:只选择了一次max和min,故只交换了第一个和最后一个;
哎,为什么不采取我的呢?
- 2楼网友:掌灯师
- 2021-06-05 08:29
这个程序可以是说是同时选择两个的排序(一次交换两个),快于选择排序(一次交换一个),我以前做过的,根据你的改 了下。
#include <stdio.h>
void main()
{
int a[10]={1,5,6,9,19,1,4,3,0,10}, *p, *q, *r, *max, *min, t;
//for (p = a; p < a+10; p++)
//scanf("%d",p);
//
for (r = a, q = a+9; r < q; r++, q--)//交换一次后,减小范围
{
max = min = r;
for(p = r+1; p <= q; p++)//找max、min,必须钳在第一个for里
{
if (*max < *p) max = p;
if (*min > *p) min = p;
}
if(max != min)
{
t = *min; *min = *r; *r = t;
if(max == r) max = min;//容错,你可以研究一下
t = *max; *max = *q; *q = t;
}
else break;
}
//
for (p = a; p < a+10; p++)
printf ("%d ",*p);
printf("\n");
}
- 3楼网友:人间朝暮
- 2021-06-05 07:47
这个要有前提的
前提是 你每次交换的时候 不会影响到最大值和最小值
例如 10 9 8 。。。1
首先 最大的是1
找到的最大值是第一个 10
那么和最后一个交换 就把 10 和1 交换了
第一个就是1 最小值 本来是第10个的1 但是交换后成了最大的10
对后来照成了影响
所以解决了这点就好办了
先找最大值 交换后 再找最小值 交换 就可以避免这点了
希望我的思路对你有帮助
我要举报
大家都在看
推荐资讯