在已知数组中 插入一个数

wxy709435320 2011-03-30 09:13:06
#include <stdio.h>
//#define N 5

int main()
{
int i,j,num,end,tmp1,tmp2;
int a[6]={10,40,50,60,80};
printf("Array a:\n");
for(i=0;i<5;i++)
printf("%4d",a[i]);
printf("\n");
printf("Insert data:\n");
scanf("%4d",&num);
end=a[4];
if(end<num)
{
a[5]=num;
}
else
{
for(i=0;i<5;i++)
{
if(a[i]>num)
{
tmp1=a[i];
a[i]=num;
for(j=i+1;j<6;j++)
{
tmp2=a[j];
a[j]=tmp1;
tmp1=tmp2;
}
break;
}
}
}
printf("Now array a:\n",a[i]);
for(i=0;i<6;i++)
printf("%4d",a[i]);
printf("\n");
return 0;
}
我是 初学者 有些地方看的不太懂 就是 交换哪一步? 希望 学长们 能够帮我解释解释 这个程序
...全文
601 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wxy709435320 2011-03-30
  • 打赏
  • 举报
回复
恩 谢谢
direction917 2011-03-30
  • 打赏
  • 举报
回复
数组插入,有时候中间插入的时候需要腾地方。所以, 需要把那个位置以及之后的数都往后逐个移动一个单位,才能为插入的值空出地方来。建议参考下数据结构。
pengzhixi 2011-03-30
  • 打赏
  • 举报
回复
把要插入的元素和数组的元素(从后往前)比较数组元素大就后移一个位置就是了。
wxy709435320 2011-03-30
  • 打赏
  • 举报
回复
能够用什么方法?我这里不是很明白?
blackstar8888 2011-03-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wxy709435320 的回复:]

为什么 最后 又把变量 tmp2的值赋给了 变量tmp1 前面的tmp1 不是已经赋值了啊a[i]吗 怎么 两次赋值?
[/Quote]
for(j=i+1;j<6;j++)
{
tmp2=a[j];
a[j]=tmp1;
tmp1=tmp2;
}
tmp1给下一次for循环使用。tmp1代表了前一个元素,tmp2代表后一个元素。移动的时候用tmp1取代tmp2。楼主debug跟一下其实都明白了。还一点你贴出的代码实现这个功能是个很差的方式,用1楼的方法吧。
pengzhixi 2011-03-30
  • 打赏
  • 举报
回复
从后面往前面比较要容易得多了。你这个从前面往后面比较麻烦很多。
wxy709435320 2011-03-30
  • 打赏
  • 举报
回复
为什么 最后 又把变量 tmp2的值赋给了 变量tmp1 前面的tmp1 不是已经赋值了啊a[i]吗 怎么 两次赋值?
heartgoon2010 2011-03-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 heartgoon2010 的回复:]
实际上它是要前移的元素值
[/Quote]
更正:实际上它是要后移的元素值
shaotine_wu 2011-03-30
  • 打赏
  • 举报
回复

if(end<num) //如果输入的数字比数组中的最后一个还大,就直接插入到数组最后,也就是第六个数组成员
{
a[5]=num;
}
else //否则,就在数组中查找第一个比num大的数
{
for(i=0;i<5;i++) //查找第一比num大的数
{
if(a[i]>num)
{
tmp1=a[i]; //用临时变量存放要替换的数
a[i]=num; //替换
for(j=i+1;j<6;j++) //从该位置开始数组整体后移
{
tmp2=a[j];
a[j]=tmp1;
tmp1=tmp2;
}
heartgoon2010 2011-03-30
  • 打赏
  • 举报
回复
首先找到出入点a[i],即在第i个元素前插入;
然后保存a[i]的值,实际上它是要前移的元素值,同时在第i个位置插入输入元素值;
接着循环操作:保存后一个元素值,将前一个元素后移,被保存的元素成为下一个要后移的元素
pengzhixi 2011-03-30
  • 打赏
  • 举报
回复
修正下是a[i+1]=num;
pengzhixi 2011-03-30
  • 打赏
  • 举报
回复
这一步可以简化的。
你可以插入元素依次和数组中的元素(从最后一个元素起)比较如果插入元素小于该数组元素那么就将该数组元素往后面位置拷贝就是了。
int i;
for(i=4;i>0;--i)
{
if (a[i]>num)
a[i+1]=a[i];
else break;
}
a[i]=num;

大概的代码就是这样。
pengzhixi 2011-03-30
  • 打赏
  • 举报
回复
for(i=0;i<5;i++)
{
if(a[i]>num)
{
tmp1=a[i];
a[i]=num;
for(j=i+1;j<6;j++)
{
tmp2=a[j];
a[j]=tmp1;
tmp1=tmp2;
}
交换这段实际上是找到插入元素的位置后将插入元素放到这个位置上,然后将这个位置上的元素往后移动一个位置。后面的元素都依次往后移动一个位置。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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