题目:
第一行给出一个整数n,第二行给出n个已经从小到大排好的数,第三行给出需要往这串数中插入的数a,输出仍符合从小到大排列的新的序列。
输入样例:
9
2 3 5 8 9 10 18 26 32
6
输出样例:
2 3 5 6 8 9 10 18 26 32
书中给的代码:
#include <stdio.h>
int main(){
int data[101],right[101];
int i,n,t,len;
scanf("%d",&n);
//读入已有的数
for(i =1;i <=n;i++){
scanf("%d",&data[i]);
}
len =n;
//初始化数组right
for(i =1;i <=n;i++){
if(i !=n){
right[i] =i +1;
}
else{
right[i] =0;
}
}
//直接在数组data的末尾增加一个数
len++;
scanf("%d",&data[len]);
//从链表的头部开始遍历
t=1;
while(t !=0){
if(data[right[t]] >data[len]){ //如果当前结点下一个结点的值大于待插入数,将数插入到中间
right[len] =right[t];//新插入数的下一个结点标号等于当前结点的下一个结点编号
right[t] =len;//当前结点的下一个结点编号就是新插入数的编号
break;//插入完成跳出循环
}
t =right[t];
}
//输出链表中所有的数
t =1;
while(t !=0){
printf("%d ",data[t]);
t =right[t];
}
getchar(); getchar();
return 0;
}
该代码同上一节链表一样有一点问题,在这里我做了一些修改。原代码不足之处:没有考虑输入的数字为最小值的情况。
比如:
9
2 3 5 8 9 10 18 26 32
1
输出结果为:
我的代码:
#include<stdio.h>
int main(){
int data[101],right[101];
int i,n,t,len,flag;
scanf("%d",&n);
for(i =1;i <=n;i++){
scanf("%d",&data[i]);
}
len =n;
for(i =0;i <=n;i++){
if(i !=n){
right[i] =i +1;
}
else{
right[i] =0;
}
}
len++;
scanf("%d",&data[len]);
if(data[1] >data[len]){
right[len] =1;
flag =1;
}
else{
t =1;
while(t !=0){
if(data[right[t]] >data[len]){
right[len] =right[t];
right[t] =len;
flag =0;
break;
}
else{
t =right[t];
}
}
}
printf("插入后的数列为");
if(flag ==1){
t =len;
}
else{
t =1;
}
while(t !=0){
printf("%d ",data[t]);
t =right[t];
}
getchar();getchar();
return 0;
}
输入:
9
2 3 5 8 9 10 18 26 32
6
输出:
输入:
9
2 3 5 8 9 10 18 26 32
1
输出:
输入:
9
2 3 5 8 9 10 18 26 32
88
输出: