zoukankan      html  css  js  c++  java
  • 单链表

    单链表头文件 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;
    }






  • 相关阅读:
    冲刺阶段个人博客9
    冲刺阶段个人博客8
    梦断代码阅读笔记02
    我关于搜狗输入法的用户体验描述
    冲刺阶段个人博客07
    冲刺阶段个人博客06
    冲刺阶段个人博客05
    冲刺阶段个人博客04
    BZOJ 2006 超级钢琴(堆+主席树)
    BZOJ 1924 所驼门王的宝藏(强连通分量缩点+DAG最长链)
  • 原文地址:https://www.cnblogs.com/averson/p/5096062.html
Copyright © 2011-2022 走看看