链表的 C 语言实现
我们首先介绍一下链表的实现细节,从我们之前讨论的定义来看,我们要实现链表的删除,我们必须确定所删除元素的前一个位置 (FindPrevious),如果删除的是第一个元素,那么链表的起始段就会被更改,这些都会造成一些不必要的麻烦,所以为了避免这些,我们可以通过引入一个表头的办法来实现。所谓表头就是一个没有具体数据的元素,它确定了链表的起始位置。
首先我们在一个 .h 文件中声明链表的结构和操作,操作的具体实现放在 .c 文件中。
#ifdef _List_H
struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode List; \\表头
typedef PtrTonode Postion;
List MakeEmpty(List L); \\清空链表
int IsEmpty(List L); \\判断链表是否为空
int IsLast(Postion P); \\ 判断当前位置是否为末尾
Postion Find(ElementType X, List L);\\查找 X
void Delete(ElementType X, List L); \\删除 X
Postion FindPrevious( ElementType X, List L); \\ 查找 X 前一个位置
void Insert(ElementType X, List L);\\插入
void DeleteList(List L);\\删除链表
Postion Header(List L);
Postion First(List L);
Postion Advance(Postion P);
ElementType Retrieve(Postion P);
#endif
struct Node
{
ElementType Element;
Postion Next;
}
判断链表是否为空以及当前位置是否为末尾
//测试链表是否为空
int IsEmpty(List L)
{
return L->Next == NULL;
}
//判断当前位置是否为末尾
int IsLast(Postion P)
{
return P->Next == NuLL;
}
链表的查找
/* 返回元素 X 的位置 P 如果没有就返回 NULL*/
Postion Find(ElementType X, List L)
{
Postion P;
P = L->Next;
while(P != NULL && P->Elenment !-X)
P = P->Next;
return P;
}
链表的删除
void Delete(ElementType X, List L)
{
Postion P, TmpCell;
P = FindPrevious(X,L);//找到X 前一个元素位置
if(!IsLast(P,L))
{
TempCell = P->Next;
P-Next = TmpCell-Next;
free(TmpCell)
}
}
Position FindPrevious(ElementType X, List L)
{
Postion P;
P = L;
while(P->Next != NULL && P->Next-Element != X)
P = P -> Next;
return P;
}
链表的插入,在插入时候一定要对指针变量 TmpCell 进行内存分配 (malloc) !!
void Insert(Element X, List L, Postion P)
{
Postion TmpCell;
TmpCell = malloc(sizeof(struct Node));
if(TmpCell == NULL)
FataError("Out of space!");
TmpCell -> Element = X;
TmpCell -Next = P->Next;
P -> Next = TmpCell;
}
链表的删除
void DeleteList(List L)
{
Postion P, Tmp;
P = L ->Next;
while(P != Null)
{
Tmp = P;
free(P);
P = Tmp;
}
L -> Next = NULL;
}
下一篇博客我将介绍一个链表的具体例子,未完待续......