单链表

单链表头文件 Link_list.h

#pragma once

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>


struct Node
{
    int     Element;
    struct Node*  Next;
};

typedef struct Node* List;
typedef struct Node* Position;


int IsEmpty(List L);   /* 判断链表L是否为空, 如果为空返回true */
int IsLast(Position P, List L);    /* 判断P指针是否指向链表L的最后一个位置 */
Position Find(const int X, List L);   /* 在链表L中查找值为X的元素,如果找到返回指向它的指针 */
void Delete(const int X, List L);    /* 删除元素X, 只删除第一次出现的X, 如果不在链表中什么也不做 */
Position FindPrevious(const int X, List L);   /* 获得元素X的前区指针, 如果X不在链表中,返回** */
void Insert(int X, List L, Position P); /* 位置P之后插入元素X */
void DeleteList(List L);    /* 删除链表 */
Position Header(List L);    /* 获得链表的头结点 */
Position First(List L); /* 获得链表的第一个元素的指针 */


单链表的实现 Link_list.c

#include "Link_list.h"

/* 判断链表L是否为空, 如果为空返回true */
int IsEmpty(List L)
{
    return (NULL == L->Next);
}

/* 判断P指针是否指向链表L的最后一个位置 */
int IsLast(Position P, List L)
{
    return (NULL == P->Next);
}

/* 在链表L中查找值为X的元素,如果找到返回指向它的指针 */
Position Find(const int X, List L)
{
    if (IsEmpty(L))
        return NULL;

    Position p = L->Next;
    while (NULL != p && p->Element != X)
        p = p->Next;

    return p;
}

/* 删除元素X, 只删除第一次出现的X, 如果不在链表中什么也不做 */
void Delete(const int X, List L)
{
    Position now_X = Find(X, L);
    Position prev_X = FindPrevious(X, L);

    if (NULL != now_X && NULL != prev_X)
        prev_X->Next = now_X->Next;

}

/* 获得元素X的前区指针, 如果X不在链表中,返回NULL */
Position FindPrevious(const int X, List L)
{
    if (IsEmpty(L))
        return NULL;

    Position pX      =   Find(X, L);
    Position prev_pX =   NULL;

    if (pX != NULL)
        for (prev_pX = L->Next; prev_pX->Next != pX; prev_pX = prev_pX->Next)
            ;

    return prev_pX;
}

/* 位置P之后插入元素X */
void Insert(int X, List L, Position P)
{
    if (NULL == P)
        return ;

    List newElmt     =  (List)malloc(sizeof(List));
    newElmt->Element =  X;

    if (IsLast(P, L)) {
        newElmt->Next    =  P->Next;
        P->Next          =  newElmt;
    }

    newElmt->Next   =   P->Next;
    P->Next         =   newElmt;
}

/* 删除链表 */
void DeleteList(List L)
{
    if (IsEmpty(L))
        return ;

    Position p  = L->Next;

    while (NULL != p){
        Position p1 = p->Next;
        free(p);
        p = p1;
    }

}

/* 获得链表的头结点 */
Position Header(List L)
{
    return L;
}

/* 获得链表的第一个元素的指针 */
Position First(List L)
{
    if (IsEmpty(L))
        return NULL;
    return L->Next;
}





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值