链表的游标实现
有一些语言不支持指针如BASIC、FORTRAN等,如果需要链表而又不能使用指针,就需要使用另外的实现方法。其中之一就是游标实现法。
在链表的指针实现有两个重要的特点:
1.数据存储在一组结构体中,每一个结构体包含有数据以及指向下一个结构体的指针。
2.一个新的结构体可以通过调用malloc而从系统全局内存(global memory)得到,并可通过free而被释放。
所以游标法必须能够模仿实现这两条特性。满足条件1的方法是要有一个全局的结构体数组。对于该数组中的任何单元,其数组下标可以用来代表一个地址。
(来自《数据结构与算法分析----C语言描述》)
对链表游标实现的声明(模拟条件1):
typedef int ElemType;
typedef ElemType Position;
typedef ElemType List;
#define SpaceSize 500
struct Node//定义结构体
{
ElemType data;
Position next;//定义游标
};
struct Node CursorSpace[SpaceSize];//定义结构体全局数组
现在,需要模拟条件2,实现malloc
和free
的功能。
静态链表中malloc
的实现:
Position CursorAlloc()//实现malloc
{
Position p;
p=CursorSpace[0].next;
CursorSpace[0].next=CursorSpace[p].next;
return p;
}
静态链表中free
的实现:
void CursorFree(Position p)//实现free
{
CursorSpace[p].next=CursorSpace[0].next;
CursorSpace[0].next=p;
}
静态链表的初始化创建:
void InitializeCursorSpace()//初始化创建
{
for(i=0;i<SpaceSize-1;i++)
{
CursorSpace[i].next=i+1;
}
CursorSpace[SpaceSize-1].next=0;
}
判断静态链表是否为空:
int IsEmpty(List L)//判断是否为空
{
return(CursorSpace[L].next==0)
}
测试p
是否为静态链表的末尾
int IsLast(Position p,List L)//判断是否为最后一个元素
{
return(CursorSpace[p].next==0);
}
静态链表的查找
Position Find(ElemType x,List L)//查找位置
{
Position p;
p=CursorSpace[L].next;
while(p&&CursorSpace[p].data!=x)
{
p=CursorSpace[p].next;
}
return p;
}
静态链表的删除
void Delete(ElemType x,List L)//删除操作
{
Position p,temp;
p=Find(x,L);
if(!IsEmpty(p,L))
{
temp=CursorSpace[p].next;
CursorSpace[p].next;=CursorSpace[temp].next;
CursorFree(temp);
}
}
静态链表的插入操作
void Insert(ElemType x,List L,Position p)//插入操作
{
Position temp;
temp=CursorAlloc();
if(Temp==0)
{
printf("Out of space!");
}
CursorSpace[temp].data=x;
CursorSpace[temp].next=CursorSpace[p].next;
CursorSpace[p].next=temp;
}
文章资源来源是《数据结构与算法----C语言描述》,仅为本人的读书笔记,方便复习与查看,如有错误,请指出。