zoukankan      html  css  js  c++  java
  • 单向静态链表

    单项静态链表的实现


    辅助空间本身就是一个链表,只是他链接的都是尚未使用的元素,通过实现的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);
    }
    
  • 相关阅读:
    touchesBegan: withEvent: <--- with UIScrollView / UIImageView
    #ifdef,#else,#endif,#if 拾忆
    内联函数 inline 漫谈
    WebKit框架 浅析
    在iOS中获取UIView的所有层级结构 相关
    initWithFrame、initWithCoder、awakeFromNib的区别和调用次序 & UIViewController生命周期 查缺补漏
    iOS 常用代码块
    NSObject Class 浅析
    Alamofire 框架浅析
    ReactiveX--响应式编程の相关概念 浅析
  • 原文地址:https://www.cnblogs.com/wjundong/p/11619841.html
Copyright © 2011-2022 走看看