模拟链表在<<啊哈算法>>提出了一种实现方式,代码如下
#include<stdio.h>
int main()
{
int data[101], right[101];//定义了两个数组
int i, n, t, len;
scanf_s("%d", &n);//读入数组的元素个数n
for (i = 1; i <= n; i++)
scanf_s("%d", &data[i]);//读入数组元素
//data数组里面存储的是元素
len = n;//len也是数组元素个数
for (i = 1; i <= n; i++)
{
if (i != n)
right[i] = i + 1;
else
right[i] = 0;
}
//这个不是很理解,就执行几次循环看一下吧
// 假设长度为5,输入1 2 3 4 9
//第一次的时候right[1]=2;
//第二次的时候right[2]=3;
//第三次的时候right[3]=4;
len++;//现在len比数组元素个数多一个
scanf_s("%d", &data[len]);//获取要插入的数值存到data[len]
//假设插入个5
t = 1;
while (t != 0)
{
if (data[right[t]] > data[len])
{
right[len] = right[t];
right[t] = len;
break;
}
t = right[t];
}
//再看这个循环right[1]=2,data[2]与data[len]比较
//不满足然后t=2
//第二次循环right[2]=3,data[3]与data[len]比较
//不满足然后t=3
t = 1;
while (t != 0)
{
printf("%d", data[t]);
t = right[t];
}
getchar();
getchar();
return 0;
}
但是参照他给出的解释并没有非常理解这个的原理,于是自己结合这个代码理解了一下,并分享在下面.
结合这个图,也还是没有理解,但是想到既然叫模拟链表,跟链表还是有共同之处的,于是生套链表,试图理解.
那样的话,首先花了这个图
这个图的话,更好理解,在这两个模拟链表中,t=1类似头指针,然后data[1]和right[1]类似数据域和指针域,t=right[t];相当于单链表里面的p=p->next;作用是找到下一个结点.
结合<<啊哈算法>>中"right是存放当前序列中每一个元素右边的元素在数组data中位置的",这句话应该理解为"当前序列是data,比如到了data[5],这个元素,那么data[5]下一个元素如果表示为data[i]的话,那么right[5]=i;"