数组实现模拟链表及其理解

模拟链表在<<啊哈算法>>提出了一种实现方式,代码如下

#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;"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值