目录
一、解决问题的步骤
用一个数组a[10]来表示这个数列,步骤如下:
1,寻找需要插入元素的位置,可以定义一个旗帜变量flag来表示这个位置
10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 |
2、将flag之后的元素向后移动一位,对flag到最后一项的值通过倒序的方法逐个输出
10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 |
3、将输入的元素插入flag处并且逐个输出插入元素之后的数组中的各个元素
10 | 20 | 30 | 40 | a[flag] | 50 | 60 | 70 | 80 | 90 |
二、源程序的编写
在开始之前我们需要考虑到:插入的数有两个情况一是插入的数据比所有的数都打或者都小,二是插入的数据在数组中两个数的中间,需要根据情况选择插入的位置。
首先定义一个含有十个元素的数组,然后定义一个旗帜变量flag用于表示插入元素的位置,并按照递增的顺序赋九个值,然后输入一个值
int a[10]={10,20,30,40,50,60,70,80,90},n,flag; //flag为旗帜变量
printf("请输入一个数:");
scanf("%d",&n);
然后判断输入的值n所需要插入的位置,如果小于数组的第一项,则flag赋值0;如果大于数组的最后一项,则flag赋值9,如果位于数组中的两个数的中间则flag赋值为循环次数i+1,并且单循环进行到此处的时候使用break语句跳出循环,不过也可以删去break,只不过程序会多进行几次无意义的循环。
if(n<a[0])
flag=0;
else if(n>a[9])
flag=9;
for(int i=0;i<9;i++)
{
if(n>=a[i]&&n<=a[i+1]) //如果n介于数组中的两个数的中间,则i+1就是n需要插入的数组中的位置
{
flag=i+1;
break;
}
}
其次运用循环通过逆序的方式将flag之后的元素向后移动一位,其中a[j+1]=a[j]实现flag后每一项的值向后移动一位的过程,然后将n存入数组的第flag项之中之中,最后将插入了元素n之后的数组的各项输出
for(int j=9;j>=flag;j--)
a[j+1]=a[j];
a[flag]=n;
for(int i=0;i<10;i++)
printf("%d ",a[i]);
完整的程序如下:
#include<stdio.h>
int main()
{
int a[10]={10,20,30,40,50,60,70,80,90},n,flag; //flag为旗帜变量
printf("请输入一个数:");
scanf("%d",&n);
if(n<=a[0]) // 若输入的值小于数组第一项,flag赋值0
flag=0;
else if(n>=a[9]) // 若输入的值大于数组最后一项,flag赋值9
flag=9;
for(int i=0;i<9;i++)
{
if(n>=a[i]&&n<=a[i+1]) //若输入的值位于数组中间,flag赋值i+1
{
flag=i+1;
break;
}
}
for(int j=9;j>=flag;j--) //逆序输出使flag之后的值的位置向后移动一位
a[j+1]=a[j];
a[flag]=n;
for(int i=0;i<10;i++) //输出插入n之后的数组
printf("%d ",a[i]);
}
输出结果如下:
请输入一个数:-11
-11 10 20 30 40 50 60 70 80 90
请输入一个数:55
10 20 30 40 50 55 60 70 80 90
请输入一个数:99999
10 20 30 40 50 60 70 80 90 99999
通过以上的程序就可以实现在一个有序数列中插入一个数后使该数列仍然有序。