数据结构之表、栈和队列(二)

链表的 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;
}

下一篇博客我将介绍一个链表的具体例子,未完待续......

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值