首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

天杀的程序:这也能出错?该怎么处理

2012-03-08 
天杀的程序:这也能出错?我的程序用于将十个数中的最大一个与最后一个交换,最小一个和第一个交换,我用的指

天杀的程序:这也能出错?
我的程序用于将十个数中的最大一个与最后一个交换,最小一个和第一个交换,我用的指针,可我发现,这几个数交换时,竟相互覆盖,我简直无语了,大家帮我看一下.
int   *exc(int   *x,int   n)
{int   i,min,max,j,k,m;
  max=*(x+n-1);
  min=*x;
  for(i=n-2;i> =0;i--)
  {if(*(x+i)> max)
  {j=*(x+i);*(x+i)=max;max=j;}
  }
  for(i=1;i <10;i++)
  {if(*(x+i) <min)
    {m=*(x+i);*(x+i)=min;min=m;}
  }
return(x);
}
int   print(int   *y,int   n)
{int   i;
for(i=0;i <10;i++)
  printf( "%d ",*(y+i));
}
main()
{int   a[10],*p,i,*q;
  for(i=0;i <10;i++)
  scanf( "%d ",&a[i]);
  p=a;
  q=exc(p,10);
  print(q,10);
  }

[解决办法]
//挺好问的,就给出点自己的建议
int *exc(int *x,int n)
{int i,min,max,j,k,m;
max=*(x+n-1);
min=*x;
for(i=n-2;i> =0;i--)
{if(*(x+i)> max)
{
j=*(x+i);*(x+i)=max;max=j; //注意这里,怎么没碰到一个较大的数就交换数值?
}
}
for(i=1;i <10;i++)
{if(*(x+i) <min)
{m=*(x+i);*(x+i)=min;min=m;//注意这里,怎么没碰到一个较小的数就交换数值?
}
}
return(x);
}
建议如下修改:
int *exc(int *x,int n)
{int *min,*max;
int *next, *tail;
tail=max=x+n-1; //tail记住最后一个地址,最大数现在假设存储在最后一个位置。
next = max - 1; //初始化下一个可能最大值得地址
min=x; //最小数现在假设存储在第一个位置
while(next > = x)
//遍历所有地址
{
if( *next > *max)
//如果*next比当前最大值*max大,那么记录下该位置
{
max = next;
}
next--; //下一个搜索位置
}
if(max <> tail)
//如果找到比最后一个值大的数则交换
{
int temp = *max;
*max = *tail;
*tail = temp;
}
next = min + 1; //初始化下一个可能最小值得地址
while(next <= tail)
//遍历所有地址
{
if( *next < *min)
//如果*next比当前最小值*min小,那么记录下该位置
{
min = next;
}
next++; //下一个搜索位置
}
if(min <> x)
//如果找到比第一个值小的数则交换
{
int temp = *min;
*min= *x
*x = temp;
}
//tail=min=max=NULL;
return(x);
}

热点排行