指针和对象的数组实现

      有些语言不支持对象和指针数据类型时,可以数数组来表示一个虚拟的链表,指针就是链表的索引,就像链式基数排序的关键字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判断,若是则返回,若为小于,当然可以再取下一个。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值