在《啊哈!算法》中看到的,在这里做个笔记
在第一次while循环中注意是data [ right [ t ] ]
在打印过程中可以这样理解:
t | 1 | 2 | 3 | 10 | 4 | 5 | 6 | 7 | 8 | 9 |
data[t] | 2 | 3 | 5 | 6 | 8 | 9 | 10 | 18 | 26 | 32 |
t=right(t) | 2 | 3 | 10 | 4 | 5 | 6 | 7 | 8 | 9 | 0 |
#include <stdio.h>
int main(int argc, char *argv[])
{
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!=0)
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];
}
return 0;
}