如果需要链表而又不能使用指针,那么可以用游标实现法。
链表的指针实现中有两个重要特点:
1.数组存储在一推结构体中,每一个包含数据及指向下一个结构体的指针。
2.一个新的结构体可以通过调用malloc而从系统全局内存(global memory)得到。并可以通过调用free而被释放。
游标法必须能够模仿实现这两条特性。
满足条件1的逻辑方法是要有一个全局的结构体数组。对于该数组中的任何单元,其数组下标可以用来代表一个地址。
typedef int PtrToNode; typdef PtrToNode List; typdef PtrToNode Position; struct Node { ElementType Element; Position Next; }: struct Node CursorSpace[ SpaceSize ]
为了模拟条件2,必须让CursorSpace数组中的单元代行malloc和free的功能。为此,可保留一个表(freelist)。这个表由不在任何表中的单元构成,且用单元0作为表头,对于Next,0的值等价于NULL指针。其初始配置如下:
Slot | Element | Next |
0 | 1 | |
1 | 2 | |
2 | 3 | |
3 | 4 | |
4 | 5 | |
5 | 6 | |
6 | 7 | |
7 | 8 | |
8 | 9 | |
9 | 10 | |
10 | 0 |
实现代码如下:
static Position CusorAlloc( void ) { Position P; P = CursorSpace[0].Next; CursorSpace[0].Next = CursorSpace[p].Next; return P; } static void CursorFree( Positon P ) { CursorSpace[P].next = CursorSpace[0].Next; CursorSpace[0].next = P; }