有些语言不支持对象和指针数据类型时,可以数数组来表示一个虚拟的链表,指针就是链表的索引,就像链式基数排序的关键字key的存储方式,排序时只是改变next的索引,在数组中的实际位置并没有改变。下面介绍两种,表示方法。
1.对象的多数组表示
数组key存放该动态集合中的现有关键字,阵阵则分别存储在数组next和prev中。对于一个给定的数组下标x,三个数组项key[x]、next[x]和prev[x]一起表示链表中的一个对像,根据这种解释,阵阵x即为数组key、next、prev的共同下标。最后一个对象的next值最好使用(-1)这种不在数组下标范围中的数。
2.对象的单数组表示
由计算机内存的编址,可以联想到,一个对象在计算机内存中占据一组连续的存储单元,指针仅仅是该对象所在的第一个存储单元的地址,要访问对象内的其他存储单元可以在指针上加上一个偏移量。单数组表示比较灵活,但管理异构对象是非常困难的,但大多数我们考虑的数据结构都是由同构的元素组成的。
3.对象的分配与释放
向一个双向链表表示的动态集合中插入一个关键字,就必须分配一个指向该链表表示中尚未利用的对象指针。因此必须对未利用的空间进行管理。下面是多数组表示的双向链表的同构对象的分配与释放。
假设多数组表示法中的个数组长度为m,切在某一时刻该动态集合含有n<=m个元素。则n个对象代表现存于该动态集合中的元素。而余下的m-n个对象是自由的,将这些自有对象保存在一个链表中(也是数组存储),称为自由表,自由表仅使用next数组,因为没有key,且分配free中的空间时,只从表头获取元素。
下面是分别利用栈的形式实现分配与释放。即只分配栈顶元素,放在链表的表头(栈顶),释放的元素放在free表头。
allocate-object()
if(free==NIL)
error "out of space"
else
x=free;
free=free.next
return x;
free-object(x)
x.next=free;
free=x;
下面是双链表和自由表交错的时候:
在写实现时:注意 key[i]:i位置的关键字 next[i]:i位置的下一个元素 prev[i]:i的前一个元素的数组下标。
4.搜索已排序的紧凑链表的随机算法
这个随机算法很经典
代码如下:
关键在于3—8行的随机算法,当随机到的数key[j]>key[i]并且key[j]<=k(因为已排序所以超过了k的范围),赋给i才是有效的。否则直接取下一个元素值。当key[j]=k,加个if判断,若是则返回,若为小于,当然可以再取下一个。