用指针实现选择法排序问题

ftefzs 2011-07-07 03:25:57
从键盘输入8个数,用选择法按由大到小的顺序排列
为什么程序这样写能编译通过,但是执行时,输入参数后,提示出现“遇到问题需要关闭”
# include<stdio.h>

void main()
{ int data[8],*p,*p2,*k,temp,i;

p=data;
for(i=0;i<8;i++)
{ scanf("%d",p);
p++; }

for(p=data;p<data+8-1;p++)
{ k=p;
for(p2=p+1;p2<data+8;p2++)
if(*p<*p2) k=p2;
if(k!=p)
{temp=*p;
*p=*p2;
*p2=temp;}
}

for(i=0,p=data;i<8;i++,p++)
printf("%3d",*p);

}

问题出在哪里呢?

但是这样写就可以:
# include<stdio.h>
# include<string.h>
void main()
{ int data[8],*p,*p2,temp,i;

p=data;
for(i=0;i<8;i++)
{ scanf("%d",p);
p++; }

for(p=data;p<data+8-1;p++)
{ for(p2=p+1;p2<data+8;p2++)
if(*p<*p2)
{temp=*p;
*p=*p2;
*p2=temp;}
}

for(i=0,p=data;i<8;i++,p++)
printf("%3d",*p);
printf("\n");

}
...全文
978 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhou87997755 2012-06-22
  • 打赏
  • 举报
回复
# include<stdio.h>
int main()
{
int a[3],i,j,*p1,*p2,*k,t;
p1=a;
for(i=0;i<3;i++)
{
scanf("%d",p1);
p1++;
}
for(p1=a;p1<a+3;p1++)
{
k=p1;
for(p2=p1+1;p2<a+3;p2++)
if(*k>*p2)
k=p2;
if(k!=p1)
{
t=*p1;
*p1=*k;
*k=t;
}
for(p1=a;p1<a+3;p1++)
printf("%d ",*p1);
}
return 0;
}
yuanquan323 2011-07-10
  • 打赏
  • 举报
回复
此楼是正解~
[Quote=引用 1 楼 magipan 的回复:]

C/C++ code

for(p=data;p<data+8-1;p++)
{ k=p;
for(p2=p+1;p2<data+8;p2++)//这个循环之后p2=data+8已经越界了,你后面还用了
if(*p<*p2) k=p2;
if(k!=p) //此时和*p2交换会得到垃圾数据的,而且你的p2不一定是最大值
……
[/Quote]
ftefzs 2011-07-09
  • 打赏
  • 举报
回复
还是不懂啊。。
AnYidan 2011-07-08
  • 打赏
  • 举报
回复
指针移动的副作用 -- 在移动指针前记录原指针
至善者善之敌 2011-07-07
  • 打赏
  • 举报
回复

程序有问题
void main()
{ int data[3],*p,*p2,*k,temp,i;

p=data;
for(i=0;i<3;i++)
{ scanf("%d",p);
p++; }

for(p=data;p<data+3-1;p++)
{
k=p;
for(p2=p+1;p2<data+3;p2++)
{
if(*p<*p2) k=p2;
if(k!=p)
{
temp=*p;
*p=*p2;
*p2=temp;
}
}
}

for(i=0,p=data;i<3;i++,p++)
printf("%3d",*p);

}


成了倒叙了
magipan 2011-07-07
  • 打赏
  • 举报
回复

for(p=data;p<data+8-1;p++)
{ k=p;
for(p2=p+1;p2<data+8;p2++)//这个循环之后p2=data+8已经越界了,你后面还用了
if(*p<*p2) k=p2;
if(k!=p) //此时和*p2交换会得到垃圾数据的,而且你的p2不一定是最大值
{temp=*p;
*p=*p2;
*p2=temp;}
}


你的第二个方法不是选择法,而是冒泡了吧。。
for(p=data;p<data+8-1;p++)
{ k=p;
for(p2=p+1;p2<data+8;p2++)//这个循环找到剩下数字中的最大值,由k指向
if(*k<*p2) k=p2;
if(k!=p)
{temp=*p;
*p=*k;
*k=temp;}
}

70,035

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧