c 语言 链表 .h文件,【数据结构与算法分析(c语言)】 链表的游标实现 .h文件方法全实现...

标签:

最近在学习<>,实现了书上的链表的游标实现的代码,在这记录一下.

一、注意

使用前要因为代码使用ifndef 这个函数这个是为了防止头文件重返加载,他的标识是头文件名,命名规则为头文件名字首字母大写(我查资料也有说头文件名全大写),

前面加上"_"符号,在结尾处把“.”也要变成“_”,最后h大写。如我取的文件名是"cursor.h",写在ifndef后就要改成"_Cursor_H".

二、代码

代码都有注释。

.h文件

#ifndef _Cursor_H

#define SpaceSize 11

typedef int PtrToNode;

typedef PtrToNode List;//表示表头的下标号

typedef PtrToNode Position;

typedef char ElementType;

void InitializeCursorSpace();

List MakeEmpty(List L);

int IsEmpty(const List L);

int IsLast(const Position P,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);

void DeleteList(List L);

Position Header(const List L);

Position First(const List L);

Position Advance(const Position P);

ElementType Retrieve(const Position P);

#endif

struct Node

{

ElementType Element;

Position Next;

};

struct Node CursorSpace[SpaceSize];

.c文件

#include

#include

#include "cursor.h"

int main(int argc, char *argv[]) {

int i;

InitializeCursorSpace();

//创建列表L1

//为L1分配一个节点当头节点

List L1=CursorAlloc();

CursorSpace[L1].Element='h';

CursorSpace[L1].Next=0;

//为L1在头节点后面插入一个节点

Insert('a',L1,L1);

// 创建列表L2

//为列表L2分配一个节点当头节点

List L2=CursorAlloc();

CursorSpace[L2].Element='h';

CursorSpace[L2].Next=0;

//为列表L1再插入一个节点

Insert('b',L1,2);

//为列表L2头节点后插入一个节点

Insert('1',L2,L2);

//删除列表L1中值为'a'的节点

Delete('a',L1);

//为列表L2插入一个节点

Insert('2',L2,5);

//循环输出整个列表

for(i=0;i

printf("%d %c %d \n",i,CursorSpace[i].Element,CursorSpace[i].Next);

}

//通过列表L1和L2第一个节点的数值

ElementType X1= Retrieve(First(L1));

ElementType X2= Retrieve(First(L2));

printf("列表L1第一个节点的数值:%c\n列表L2第一个节点的数值:%c\n\n",X1,X2);

//删除列表L2

DeleteList(L2);

//使列表L1赋值为零

MakeEmpty(L1);

//循环输出整个列表

for(i=0;i

printf("%d %c %d \n",i,CursorSpace[i].Element,CursorSpace[i].Next);

}

return 0;

}

/*

初始化把节点全部加入freelist表

*/

void InitializeCursorSpace(){

int i;

for(i=0;i

if(i

CursorSpace[i].Next=i+1;

}else{

CursorSpace[i].Next=0;

}

CursorSpace[i].Element='-';

}

}

void FatalError(char * text){

printf("%s\n",text);

}

/*

类似malloc函数分配内存资源

*/

Position CursorAlloc(){

Position P;

P=CursorSpace[0].Next;

CursorSpace[0].Next=CursorSpace[P].Next;//把freelist的第一个下标为P的元素移除,表示被分配出使用中

return P;

}

/*

类似free函数回收内存资源

*/

void CursorFree(Position P){

CursorSpace[P].Element='-';

CursorSpace[P].Next = CursorSpace[0].Next;

CursorSpace[0].Next=P;//把下标为P的元素插入freelist标表第一个元素中,表示空闲未被分配

}

/*

如果列表L为空返回true

*/

int IsEmpty(List L){

return CursorSpace[L].Next ==0;

}

/*

如果位置P是列表L最后一位元素则返回true

*/

int IsLast(Position P,List L){

return CursorSpace[P].Next == 0;

}

/*

返回值X在列表L中的位置,如果返回0则是没有找到

*/

Position Find(ElementType X,List L){

Position P;

P=CursorSpace[L].Next;

while(P&&CursorSpace[P].Element!=X){

P=CursorSpace[P].Next;

}

return P;

}

/*

从列表中返回值为X的节点前一个节点的位置,如果没有找到返回0

*/

Position FindPrevious(ElementType X,const List L)

{

Position P,TmpCell;

P=Header(L);

while(P&&CursorSpace[P].Element!=X){

TmpCell=P;

P=CursorSpace[P].Next;

}

// printf("\nP=%d,TmpCell=%d\n",P,TmpCell);

if(P==0){//如果没有找则P=0

return P;

}else{//如果找到了返回p的前一位

return TmpCell;

}

}

/*

在列表L中删除第一次碰到的值为X的元素(可能存在多个)

*/

void Delete(ElementType X ,List L){

Position P,TmpCell;

P = FindPrevious(X,L);

if(!IsLast(P,L))//位置不在最后 AND 能找到

{

TmpCell=CursorSpace[P].Next;

CursorSpace[P].Next=CursorSpace[TmpCell].Next;

CursorFree(TmpCell);

}

}

/*

插入(位置P后面存在且合法)

位置P是已经存在列表L中合法位置 ,向位置P后插入节点

*/

void Insert(ElementType X,List L,Position P){

Position TmpCell;

TmpCell=CursorAlloc();

if(TmpCell==0){

FatalError("Out of space!!!");

}

CursorSpace[TmpCell].Element=X;

CursorSpace[TmpCell].Next=CursorSpace[P].Next;

CursorSpace[P].Next=TmpCell;

}

/*

删除整个列表L

*/

void DeleteList(List L){

Position P,TmpCell;

P=Header(L);//找到头节点

while(P){//位置循环到最后 (P=0)

TmpCell=P;

CursorSpace[P].Element='-';

P=CursorSpace[P].Next;

CursorFree(TmpCell);

}

}

/*

初始化一个列表的值,使其全部变成空

*/

List MakeEmpty(List L){

Position P;

P=First(L);

while(P){

CursorSpace[P].Element='0';

P=CursorSpace[P].Next;

}

return L;

}

/*

输入列表L,返回头节点的位置

*/

Position Header(const List L){

return L;//列表L就代表了头节点的位置

}

/*

输入列表返回第一节点的位置

*/

Position First(const List L){

Position P=Header(L);

return CursorSpace[P].Next;

}

/*

通过输入位置P返回值X

*/

ElementType Retrieve(const Position P){

return CursorSpace[P].Element;

}

标签:

来源: https://www.cnblogs.com/-1024/p/10164557.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值