/**
* author: bbird_gl
* date: 2019/7/17
* description: 链表的游标实现头文件
*/
#ifndef _CURSOR_H_
#define _CURSOR_H_
#define SPACESIZE 100
typedef int ElementType;
typedef int PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;
void InitializeCursorSpace(void);
int IsEmpty(const List L);
int IsLast(const Position, const List L);
Position Find(ElementType X, const List L);
void Delete(ElementType X, List L);
Position FindPrevious(ElementType X, const List L);
void Insert(ElementType X, List L, Position P);
#endif
/**
* author: bbird_gl
* date: 2019/7/17
* description: 链表的游标实现源文件
*/
#include <stdio.h>
#include "cursor.h"
struct Node
{
ElementType Element;
Position Next;
};
struct Node CursorSpace[SPACESIZE];
static Position CursorAlloc(void)
{
Position P;
P = CursorSpace[0].Next;
CursorSpace[0].Next = CursorSpace[P].Next;
return P;
}
static void CursorFree(Position P)
{
CursorSpace[P].Next = CursorSpace[0].Next;
CursorSpace[0].Next = P;
}
//初始化没有使用链表空间
void InitializeCursorSpace(void)
{
for (int i = 0; i < SPACESIZE; i++)
CursorSpace[i].Next = i + 1;
CursorSpace[SPACESIZE - 1].Next = 0;
}
//判断带有头结点的链表是否为空
int IsEmpty(const List L)
{
return CursorSpace[L].Next == 0;
}
int IsLast(const Position P, const List L)
{
return (!IsEmpty(L) && CursorSpace[P].Next == 0);
}
Position Find(ElementType X, const List L)
{
Position P;
P = CursorSpace[L].Next;
while(P && CursorSpace[P].Element != X)
P = CursorSpace[P].Next;
return P;
}
void Delete(ElementType X, List L)
{
Position P, Temp;
P = FindPrevious(X, L);
if (!IsLast(P, L))
{
Temp = CursorSpace[P].Next;
CursorSpace[P].Next = CursorSpace[Temp].Next;
CursorFree(Temp);
}
}
Position FindPrevious(ElementType X, const List L)
{
Position P;
while (CursorSpace[P].Next && CursorSpace[CursorSpace[P].Next].Element != X)
P = CursorSpace[P].Next;
return P;
}
//在位置P后插入结点
void Insert(ElementType X, List L, Position P)
{
Position T = CursorAlloc();
if (T == 0)
{
printf("CurrsorAlloc error\n");
return;
}
CursorSpace[T].Element = X;
CursorSpace[T].Next = CursorSpace[P].Next;
CursorSpace[P].Next = T;
}