数据结构
#include<stdio.h>
//顺序表从k开始的后继元素向后移动一个单位
void DataMov(int num[],int count,int k)
{
for (int i=count-1; i>=k; i--)
{
num[i+1]=num[i];
}
}
//遍历数据表
void DataPrint(int num[],int count)
{
for (int i = 0; i < count; i++)
{
printf("%d ",num[i]);
}
printf("\n");
}
int main(int argc, char const *argv[])
{
int num[15]={2,4,7,11};//顺序表
int x=5;
int count;//count 表示顺序表中数的个数
//利用顺序表中数值增大的特点,得出count值
for (count = 1; num[count]>num[count-1]; count++);
printf("count=%d\n",count);
//遍历顺序表
DataPrint(num,count);
//利用二分查找法确定x的位置
if (x < num[0]) //当x 小于最小值时,顺序表从0开始向后移动
{
DataMov(num,count,0);
num[0]=x;
}
else if (x > num[count-1]) //当x比最大值大,则直接在末尾插入
{
num[count]=x;
}
else //当x在最大值和最小值中间时,二分查找
{
int left=0,right=count-1;//lest记录二分查找范围的左值下标,right记录二分查找范围的右值下标
int mid=(left+right)/2;//mid记录二分查找的中值的下表
//循环缩小二分查找范围,当范围缩小到两个相邻数值之间时,循环结束
while (right-left!=1)
{
mid=(left+right)/2;
if (x>num[mid]) left=mid;//x与中值比较,当x大时,左值范围缩小
else right=mid;//否则右值范围缩小
}
DataMov(num,count,right);//找到x的位置,在left和right中间,从right下标开始的元素往后移
num[right]=x;//把x的值插入right下标位置
}
count++;//顺序表个数+1
//遍历顺序表
DataPrint(num,count);
return 0;
}