• 单向静态链表


    单项静态链表的实现


    辅助空间本身就是一个链表,只是他链接的都是尚未使用的元素,通过实现的Malloc_SL来返回未使用的元素,这时辅助空间链表把该元素从链表中删除,然后返回该元素。Free_SL后则把该元素重新回收到辅助空间。可以看到,其他链表和辅助空间是共享同一片连续内存空间的,但是它们各不相干扰。

    一些必要声明

    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAXSIZE 1000
    
    typedef int Status;
    typedef int ElemType;
    
    
    typedef struct
    {
        ElemType data;
        int cur;
    }component,SLinkList[MAXSIZE];
    
    

    找到e的位置

    静态链表为空时直接返回

    静态链表非空时且和e不等时一直找,直到结尾或找到

    /**
     * 找到静态链表中第一个为e的元素的位置,若找到则返回位置i,否则返回0
     */
    int LocateElem_SL(SLinkList Space, int S, ElemType e)
    {
        int i = Space[S].cur;   /* i指示表中第一个结点 */
        while(i && Space[i].data != e)
            i = Space[i].cur;
        return i;
    }
    

    初始化辅助链表空间

    /**
     * 将一维数组space中各个分量链接成一个链表,space[0].cur为头指针
     * 初始化时因为没有空间被使用过,所以头指针指向的第一个结点刚好1
     */
    void InitSpace_SL(SLinkList space)
    {
        for(int i=0; i<MAXSIZE-1;i++)
            space[i].cur = i+1;
        space[MAXSIZE-1].cur = 0; /* 令最后一个指向0,空指针*/
    }
    

    malloc的实现

    /**
     * 从备用空间中获取可以空间的索引,若备用空间非空,则返回结点下标,否则返回0
     */
    int Malloc_SL(SLinkList space)
    {   
        int i = space[0].cur;
        if(space[0].cur) /* 若备用空间非空,结点头指针指向下下一个结点 */
            space[0].cur = space[i].cur;
        return i;
    }
    

    free 的实现

    /**
     * 将下标为看的空闲空间结点回收到备用链表
     */
    void Free_SL(SLinkList space,int k)
    {
        if(k<1 || k>MAXSIZE-1) 
            return ;
        space[k].cur = space[0].cur;
        space[0].cur = k;
    }
    

    创建静态链表

    /**
     * 创建静态链表
     */
    void CreatList_SL(SLinkList Space, int *S, int n)
    {
        *S = Malloc_SL(Space);  /* 创建头结点 */
        Space[*S].cur = 0;
        Space[*S].data = 0;
        int t;
        for( ; n>0; n--) {
            t = Malloc_SL(Space);
            scanf("%d",&Space[t].data);
            Space[t].cur = Space[*S].cur; /* 先让新创建的结点指向同一个 */
            Space[*S].cur = t;            /* *S 指向新创建的结点 */
        }
    }
    

    插入到第i个位置,即第i-1的后面

    /**
     * 插入到第i个位置,即第i-1的后面
     */
    int SListInsert(SLinkList Space, int S, int i, ElemType e)
    {
        int r = S; /* 指向头结点 */
        int k=0;   
        while(r && k<i-1) {
            r = Space[r].cur;
            k++;
        }
        /* 退出循环后r应该指向i-1,若i-1位置为空,则说明插入的位置不对 */
        if(!r || k>i-1)
            return ERROR;
        int t = Malloc_SL(Space);
        Space[t].data = e;
        Space[t].cur = Space[r].cur;  /* 插入点指向i */
        Space[r].cur = t;             /* i-1指向插入点 */
        return OK;
    }
    

    删除静态链表中的第i个元素

    /**
     * 删除静态链表中的第i个元素
     */
    int ListDelete_SL(SLinkList Space, int S, int i,ElemType *e)
    {
        int p,q; 
        p = S;   /* 指向头结点 */
        int k=0; /* k从0开始 */
        while (Space[p].cur && k<i-1) {
            p = Space[p].cur;
            k++;
        }
        /* 循环退出后p应该指向i-1结点,Space[p].cur 指向i结点
         * 若Space[p].cur 为空,则要删除的i结点不存在 */
        if(!(Space[p].cur) || k>i-1)
            return ERROR;
        q = Space[p].cur;               /* q指向待删除的第i个结点 */
        Space[p].cur = Space[q].cur;    /* 原p直接跳过原i指向原i+1 */
        *e = Space[q].data;
        Free_SL(Space,q);
        return OK;
    }
    

    打印静态链表

    void printList(SLinkList Space, int S)
    {
        int k = Space[S].cur; /* 指向第一个结点 */
        while (k) {           /* 若当前结点不为空 */
            printf("%d ",Space[k].data);
            k = Space[k].cur; /* 指向下一个结点 */
        }
        printf("
    ");
    }
    

    测试主函数

    int main()
    {
        SLinkList Space;
        InitSpace_SL(Space);
        int S;
        CreatList_SL(Space,&S,5);
        ElemType e;
        SListInsert(Space, S, 1,250);
        SListInsert(Space, S, 1,350);
        ListDelete_SL(Space, S, 5,&e);
        printList(Space,S);
    
        int location_e_5 = LocateElem_SL(Space,S,5);
        printf("%d",Space[location_e_5].data);
    }
    
  • 相关阅读:
    黑马day16 jquery案例演示
    duilib各种布局的作用,相对布局与绝对布局的的意义与使用方法
    Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: “object”未包括“get_Range”的定义
    Android App 内存泄露之调试工具(1)
    手动安装huson插件的做法
    Linux管理日记(二)
    小强的HTML5移动开发之路(9)——坦克大战游戏3
    TextView中实现跑马灯的最简单方法
    Android中使用achartengine生成图表
    Android菜鸟的成长笔记(6)——剖析源码学自定义主题Theme
  • 原文地址:https://www.cnblogs.com/wjundong/p/11619841.html
Copyright © 2020-2023  润新知