?模拟链表介绍
链表中的每一个结点都只有两个部分。
我们可以使用一个数组date来储存每序列中的每一个数。那每一个数右边的数是谁,这一点该如何解决呢?在上一章的内容中我们是使用指针来解决的,这里我们只需再用一个数组right来存放序列中每一个数右边的数是谁就可以了。具体要怎么做呢?
上面的两个数组中,第一个整型数组date是用来存放序列中的具体数字的,另外一个整型数组right是用来存放当前序列中每一个元素右边的元素在数组date中位置的。
例如right【1】的值为2,就表示当前序列中1号元素右边的元素存放在date【2】?中;如果是0,例如right【9】的值为0,就表示当前序列中9号元素的右边没有元素。
现在需要在8面前插入一个6,只需将6直接存在数组date的末尾即date【10】 = 6.
接下来只需要将right【3】改为10,表明新序列中3号元素右边的元素存放在date【10】中。再将right【10】的值改为4,表示新序列中10号元素右边的元素存放在date【4】中。
这样我们通过right数组就可以从头到尾遍历整个序列了(序列的每个元素的值存放在对应的数组date中),如下
?
插入代码实现
//从链表的头部开始遍历
t = 1;
while(t != 0)
{
//如果当前结点下一个结点的值大于待插入数,将数插到中间
if(date[right[t]] > date[len])
{
right[len] = right[t]; //新插入的数的下一个结点标号等于当前结点的下一个标号
right[t] = len; //当前结点的下一个结点编号就是新插入数的编号
break; //插入完成跳出循环
}
t = right[t];
}
代码实现?
#include <stdio.h>
int main()
{
int date[101],right[101];
int i,n,t,len;
//读入已有的数
scanf("%d",&n);
for(i = 1;i <= n;i++)
scanf("%d",&date[i]);
len = n;
//初始化数组right
for(i = 1;i <= n;i++)
{
if(i != n)
right[i] = i + 1;
else
right[i] = 0;
}
//直接在数组date的末尾加一个数
len++;
scanf("%d",&date[len]);
//从链表的头部开始遍历
t = 1;
while(t != 0)
{
//如果当前结点下一个结点的值大于待插入数,将数插到中间
if(date[right[t]] > date[len])
{
right[len] = right[t]; //新插入的数的下一个结点标号等于当前结点的下一个标号
right[t] = len; //当前结点的下一个结点编号就是新插入数的编号
break; //插入完成跳出循环
}
t = right[t];
}
//输出链表中的所有数
t = 1;
while(t != 0)
{
printf("%d",date[t]);
t = right[t];
}
return 0;
}