Chinaunix首页 | 论坛 | 博客
  • 博客访问: 269393
  • 博文数量: 138
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 971
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-03 10:05
文章分类

全部博文(138)

文章存档

2016年(1)

2015年(137)

我的朋友

分类: C/C++

2015-04-01 16:42:36

以前学习的各种链表都是由指针实现的,链表中结点的分配和回收(即释放)都是由系统提供的标准函数mallocfree动态实现的,故称之为动态链表。但是有的高级语言,如BASICFORTRAN等,没有提供指针这种数据类型,此时若想采用链表做存储结构,就必须使用游标来模拟指针,由程序员自己编写分配结点回收结点的过程。

    用游标实现链表,其方法是:定义一个较大的结构数组作为备用结点空间(即存储池)。当申请结点时,每个结点应含有两个域:data域和cursor域(next)data域用来存放结点的数据信息,需注意的是,此时的cursor域不在是指针而是游标指示器,游标指示器指示其后继结点在结构数组中的相对位置(即数组下标)。数组的第0个分量可以设计成表的头结点,头结点的next域指示了表中第一个结点的位置。表中当前最后一个结点的域为0,表示静态单链表的结束。我们把这种用游标指示器实现的单链表叫做静态单链表,static linked list静态单链表同样可以借助一维数组来描述:

#define Maxsize = 链表可能达到的最大长度

typedef struct

{

    ElemType data;

    int cursor;

}Component, StaticList[Maxsize];

假如有如上的静态链表S中存储这线性表(abcdefghi),Maxsize=11,如图所示,要在第四个元素后插入元素e,方法是:先在当前表尾加入一个元素e,即:S[9].data = e;然后修改第四个元素的游标域,将e插入到链表中,即:S[9].cursor = S[4].cursor; S[4].cursor = 9;,接着,若要删除第8个元素h,则先顺着游标链通过计数找到第7个元素存储位置6,删除的具体做法是令S[6].cursor = S[7].cursor


上述例子中未考虑对已释放空间的回收,这样在经过多次插入和删除后,会造成静态链表的假满,即表中有很多空闲空间,但却无法再插入元素。造成这种现象的原因是未对已删除的元素所占的空间进行回收。解决这个问题的方法是将所有未被分配的结点空间以及因删除操作而回收的结点空间用游标链成一个备用静态链表。当进行插入操作时,先从备用链表上取一个分量来存放待插入的元素,然后将其插入到已用链表的相应位置。当进行删除操作时,则将被删除的结点空间链接到备用链表上以备后用。这种方法是指在已申请的大的存储空间中有一个已用的静态单链表,还有一个备用单链表。已用静态单链表的头指针为1.备用静态单链表的头指针需另设一个变量av来表示。


*********************************************************************************************************************************************************************************
实现思路:链表的各个节点预先存放在一个节点数组中 ,每个节点的"next"是一个整数,代表下一个节点在节点数组中的位置。
优缺点:由于不需要动态内存分配置,此链表比文章(5)中的链表实现快,但是需要预先估计链表的大小,防止链表太大时没有节点可分配。
额外操作:在使用游标链表前,需要一个循环把节点数组“串连”起来。
关键问题:
A:怎么样表示一个节点?
Q:以数组的下标表示一个节点
假如数组下标为n,则CursorSpace[n]表示此实际节点
A:怎么样表示next指针? 
Q:以数组下标代替指针。
假如n表示节点,则CursorSpace[n].next表示下一个指向的节点(next就是一个数组下标)
阅读(2149) | 评论(0) | 转发(0) |
1

上一篇:基数排序

下一篇:链表头

给主人留下些什么吧!~~