游标链表
不用指针和malloc()、free()函数构建链表。
核心的内容是:
- 数据储存在一组结构体中。每一个结构体包含有数据及指向下一个结构体的指针。
- 一个新的结构体可以通过调用malloc而从系统的全局内存得到,并可通过调用free而被释放。
#define Space 10
typedef int PtroNode;
typedef PtroNode List;
typedef PtroNode Position;
struct Node
{
int num;
Position Next;
};
struct Node CursorSpace[Space];
//malloc函数的实现
static Position CursorAlloc(void)
{
Position P;
P = CursorSpace[0].Next;
CursorSpace[0].Next = CursorSpace[P].Next;
return P;
}
//free函数的实现
static void CursorFree(Position P)
{
CursorSpace[P].Next = CursorSpace[0].Next;
CursorSpace[0].Next = P;
}
浮标链表使用前一定要初始化
void initializeCursorSpace(void)
{
int i;
for(i = 0; i < Space; i++)
{
CursorSpace[i].num = 0;
CursorSpace[i].Next = i + 1;
}
CursorSpace[Space-1].Next = 0;
}
//生成一个表头
List MakeEmpty(int X)
{
List P = CursorAlloc();
CursorSpace[P].Next = 0;
CursorSpace[P].num = X;
return P;
}
//判断一个链表是否为空,或者是链表的末尾
int IsEmpty(List P)
{
return (CursorSpace[P].Next == 0);
}
//延长链表
Position Insert(int X, List P)
{
List TmpCell = CursorAlloc();
CursorSpace[TmpCell].num = X;
CursorSpace[TmpCell].Next = CursorSpace[P].Next;
CursorSpace[P].Next = TmpCell;
return TmpCell;
}
//找到指定的元素
Position Find(int X, List P)
{
List TmpCell = CursorSpace[P].Next;
while((CursorSpace[TmpCell].num != X) && (TmpCell != 0))
{
P = CursorSpace[P].Next;
}
return P;
}
//找前驱
Position FindPrevious(int X, List P)
{
List TmpCell = CursorSpace[P].Next;
while((TmpCell != 0) && (CursorSpace[CursorSpace[TmpCell].Next].num != X))
{
TmpCell = CursorSpace[TmpCell].Next;
}
return TmpCell;
}
//删除链表指定元素
void Delete(int X, List P)
{
List TmpCell = FindPrevious(X, P), DeadCell;
DeadCell = CursorSpace[TmpCell].Next;
if(!IsEmpty(TmpCell))
{
CursorSpace[TmpCell].Next = CursorSpace[DeadCell].Next;
CursorFree(DeadCell);
}
}
//删除链表
void DeleteList(List P)
{
List TmpCell;
while(P != 0)
{
TmpCell = P;
P = CursorSpace[P].Next;
CursorFree(TmpCell);
}
}
函数的属性
static Position
CursorAlloc(void)__attribute__((unused));
static void
CursorFree(Position P)__attribute__((unused));
__ attribute__((unused))这个是为了告诉编译器这个函数定义了之后如果没使用不用发出警告。类似的属性还有很多,以后慢慢学习。