转载自:http://blog.csdn.net/jiuyueguang/article/details/12090569
0:实现静态链表的方法
定义一个较大的结构数组作为备用结点空间
(
即存储池
)
。当申请结点时,每个结点应含有两个域:
data
域和
cursor
域。
data
域用来存放结点的数据信息,此时的
cursor
域不在是指针而是游标指示器,游标指示器指示其后继结点在结构数组中的相对位置
(
即数组下标
)
。
数组的第
0
个分量可以设计成表的头结点,头结点的
next
域指示了表中第一个结点的位置。表中当前最后一个结点的域为
0
,表示静态单链表的结束。我们把这种用游标指示器实现的单链表叫做静态单链表,
static linked list
。
静态单链表同样可以借助一维数组来描述。
有趣的是:程序自始至终用的都是同一个数组,那怎么来区分呢?解决方案是:把这个数组
逻辑
分成两个部分(在下面的代码中你可以看到),一部分叫做空闲节点区域,另一部分叫非空闲节点区域(笔者这么叫,你也可以叫别的名字,但是你要想象把这个数组分成两个部分就ok了),前面说了是“逻辑”分隔,那怎么维护这个数组呢?答案是靠cursor域链接下一个节点来维护的。比如看下图(图真难画啊……),那么怎么标注非空闲链表呢?答案是自己定义一个下标来记住非空闲链表头节点下标就ok了。
你的头脑中要有一个场景:一个数组逻辑分成两部分,他们都是通过指针来连接的,空闲链表由空闲头结点来链接起来,非空闲链表由非空闲头结点连接起来,空闲头结点就是数组下标为0的节点,由于每次申请都是从空闲头结点下一个位置申请空闲节点,所以导致非空闲头结点是数组下标为1的节点(这个你在下图或者程序中能够体会到)并且把这个下标记录下来,然后下面的工作就是维护这两个链表了
1:静态链表的实现
- 数据结构 数据结构很好理解,不在赘述。
- 初始化
- 申请分配一个空闲节点 注意:这里每次申请空闲节点都是把空闲链表的第一个节点(非头节点)返回,同理在释放空闲节点到空闲链表的的时候也是把空闲节点加到空闲链表头指针的后面第一个的位置
- 释放一个空闲节点到空闲链表
2:实例:求集合运算(A-B)U(B-A)的结果
加上一个打印的函数
加上一个main函数
加上一个main函数
0:实现静态链表的方法
定义一个较大的结构数组作为备用结点空间
(
即存储池
)
。当申请结点时,每个结点应含有两个域:
data
域和
cursor
域。
data
域用来存放结点的数据信息,此时的
cursor
域不在是指针而是游标指示器,游标指示器指示其后继结点在结构数组中的相对位置
(
即数组下标
)
。
数组的第
0
个分量可以设计成表的头结点,头结点的
next
域指示了表中第一个结点的位置。表中当前最后一个结点的域为
0
,表示静态单链表的结束。我们把这种用游标指示器实现的单链表叫做静态单链表,
static linked list
。
静态单链表同样可以借助一维数组来描述。
有趣的是:程序自始至终用的都是同一个数组,那怎么来区分呢?解决方案是:把这个数组
逻辑
分成两个部分(在下面的代码中你可以看到),一部分叫做空闲节点区域,另一部分叫非空闲节点区域(笔者这么叫,你也可以叫别的名字,但是你要想象把这个数组分成两个部分就ok了),前面说了是“逻辑”分隔,那怎么维护这个数组呢?答案是靠cursor域链接下一个节点来维护的。比如看下图(图真难画啊……),那么怎么标注非空闲链表呢?答案是自己定义一个下标来记住非空闲链表头节点下标就ok了。
你的头脑中要有一个场景:一个数组逻辑分成两部分,他们都是通过指针来连接的,空闲链表由空闲头结点来链接起来,非空闲链表由非空闲头结点连接起来,空闲头结点就是数组下标为0的节点,由于每次申请都是从空闲头结点下一个位置申请空闲节点,所以导致非空闲头结点是数组下标为1的节点(这个你在下图或者程序中能够体会到)并且把这个下标记录下来,然后下面的工作就是维护这两个链表了
1:静态链表的实现
- 数据结构 数据结构很好理解,不在赘述。
- 初始化
- 申请分配一个空闲节点 注意:这里每次申请空闲节点都是把空闲链表的第一个节点(非头节点)返回,同理在释放空闲节点到空闲链表的的时候也是把空闲节点加到空闲链表头指针的后面第一个的位置
- 释放一个空闲节点到空闲链表
2:实例:求集合运算(A-B)U(B-A)的结果
加上一个打印的函数
加上一个main函数
加上一个main函数