免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2149 | 回复: 4
打印 上一主题 下一主题

[算法] 关于指针的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-26 22:35 |只看该作者 |倒序浏览
本帖最后由 邪恶名字 于 2011-03-26 22:37 编辑

#include"stdio.h"
#include"stdlib.h"
int main(void)
{
int *p,*min,n;
puts("准备输入几个数字进行排序?");
scanf("%d",&n);
p=(int *)calloc(n,sizeof(int));
for(int o=0;o<n;o++)
{
scanf("%d",p+o);
}
for(int o=0;o<n;o++)
{
min=(p+o);
for(int b=o;b<n;b++)
{
if(*(min)>*(p+b))
{
*min=*(p+b);
*(p+b)=*(p+o);
*(p+o)=*min;\\这里把所有的值改成了最小值
}
}
}
for(int l=0;l<n;l++)
{
printf("%d",*(p+l));
}
free(p);
getchar();
return 0;
}
为什么排序后只显示最小值出来,虽然我知道大概是赋值那里出了问题,但是对指针理解还是不够,希望有人帮忙解说一下;谢谢

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2011-03-27 09:31 |只看该作者
前面min = (int *)(calloc(1, sizeof(int));

然后循环那里,修改一下:
  1.     for (o = 1; o < n; o++) {
  2.         work = 1;
  3.         int b;
  4.         for (b = 0; b < n - o; b++)
  5.             if (*(p + b) > *(p + b + 1)) {
  6.                 *min = *(p + b);
  7.                 *(p + b) = *(p + b + 1);
  8.                 *(p + b + 1) = *min;
  9.                 work=0;
  10.             }   
  11.         if (work) break;
  12.     }   
复制代码

论坛徽章:
0
3 [报告]
发表于 2011-03-28 11:19 |只看该作者
  1. for(int o=0;o<n;o++)
  2. {
  3. min=(p+o);
  4. for(int b=o;b<n;b++)
  5. {
  6. if(*(min)>*(p+b))
  7. {
  8. *min=*(p+b);
  9. *(p+b)=*(p+o);
  10. *(p+o)=*min;\\这里把所有的值改成了最小值
  11. }
  12. }
  13. }
复制代码
这里min已经和p+o一样了,那么后面那段疑似swap的代码就显得很奇怪了
  1. {
  2. *min=*(p+b);
  3. *(p+b)=*(p+o);
  4. *(p+o)=*min;\\这里把所有的值改成了最小值
  5. }
复制代码
这段中*min和*(p+o)是同一个变量。根本起不到交换变量的作用还会抹去其中较大的那个变量。
可以改成

  1. {
  2. int swap = p[b];
  3. p[b] = p[o];
  4. p[o] = p[b];
  5. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2011-03-28 11:22 |只看该作者
回复 2# L_kernel
你的calloc多了个括号

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2011-03-28 11:36 |只看该作者
恩,多了一个左括号。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP