算法学习 2.5——模拟链表
程序员文章站
2023-12-26 23:13:39
...
模拟链表是链表的另一种表示方式,不使用指针。
(但指针的操作的确方便快捷,如果实在搞不懂指针实现链表的朋友就算了)
什么是模拟链表呢,经过上一节的学习我们知道链表是通过节点的指针指向下一个节点的地址,所谓地址可不可以模拟成位置呢?
仔细想一想,往下看
——————————————————————————————————
既然链表中的节点分为数据和指针地址,那么我们可不可以使用两个数组,一个数组用来存放数据,另一个数组用来存放地址呢。
存放什么地址合适?这里的地址我们可以看成位置,链表中的节点指针存放的是下一个节点的地址,那我们初始化一个数组,用数组的位置来存放当前节点的下一个节点的位置。
例如:初始化一个data数组和一个right数组,
例如:right[1]的值为2就说明当前序列中1号元素右边的元素存放在data[2]中;如果在8前插入6,直接将6放到data[10]中,再将right[3]改为right[10],表示序列中第三个元素右边的数在第10位,再将right[10]改为right[4],这样通过right数组的顺序就可以遍历整个模拟链表了。
实现代码:
#include <stdio.h>
int main()
{
int data[101];//存放数组
int right[101];//存放每一个元素右边元素的位置
int i, n, t, len;
printf("请输入元素个数:");
scanf("%d", &n);
//读入现有元素
printf("\n");
printf("请输入数据:");
for (i = 1; i <= n; i++)
{
scanf("%d", &data[i]);
}
printf("\n");
len = n;
//初始化right数组
for (i = 1; i <= n; i++)
{
if (i != n)
{
right[i] = i + 1;
}
else
{
right[i] = 0;
}
}
printf("请输入插入的数:");
len++;
scanf("%d", &data[len]);//直接在数组data的末尾增加一个数
//从链表的头部开始遍历
t = 1;
while (t != 0)
{
if (data[right[t]] > data[len])//如果当前节点的下一个节点的值大于带插入的数,将数插入到中间
{
right[len] = right[t];//新插入的数的下一个节点标号等于当前节点的下一个节点
right[t] = len;//当前节点的下一个节点编号就是新插入数的编号
break;//插入完成跳出循环
}
t = right[t];
}
if (t == 0)//如果插入的数最大
{
right[len - 1] = len;
right[len] = 0;
}
//输入模拟链表中的数
t = 1;
printf("数据:");
while (t != 0)
{
printf(" %d", data[t]);
t = right[t];
}
return 0;
}
这种写法其实有点弊端,例如插入的数正好是最小的时候,小伙伴可以自己完善哦。