zoukankan      html  css  js  c++  java
  • 静态链表用C语言实现

    静态链表便于在不设指针类型的高级语言使用链表结构,静态链表用数组描述,数组的一个分量表示一个结点,同时用游标(指示器cur)代替指针来表示结点在数组中的相对位置。

    另外我们对数组第一个和最后一个元素作为特殊元素处理,不存数据。数组的第一个元素,即下标为0的元素的cur存放备用链表的第一个结点的下标,而数组 最后一个cur则存放第一个有效数值的下标,相当于单链表中有结点的作用。
    /*
        2016年10月11日10:47:23
        静态链表
    */
    #include<stdio.h>
    
    #define MAXSIZE 100
    
    typedef struct
    {
        int data;      //数据域
        int cur;       //游标,为0是表示无指向
    }component, SLinkList[MAXSIZE];
    
    //函数声明
    void InitSpace_SL(SLinkList space);
    int Malloc_SL(SLinkList space);
    void Free_SL(SLinkList space, int k);
    void ListTraverse_SL(SLinkList space);
    int Listlength_SL(SLinkList space);
    bool ListInsert_SL(SLinkList space, int pos, int val);
    bool ListDelete_SL(SLinkList space, int pos, int *val);
    
    int main(void)
    {
        int val;
        SLinkList space;
        InitSpace_SL(space);     
    
    /*     ListInsert_SL(space, 1, 99);
        ListInsert_SL(space, 2, 100);
        ListInsert_SL(space, 3, 101);
        ListInsert_SL(space, 4, 102); */
    
        ListTraverse_SL(space);
    
        ListDelete_SL(space, 2, &val);
        ListTraverse_SL(space);
    
        return 0;
    }
    
    void InitSpace_SL(SLinkList space)     //不需要用指针,因为通过改变函数形参数组的值会使实参数组的值改变
    {
        int i;
        int len;  //用来存储结点的个数
        int val;  //用来存储结点的数值
    
        for(i = 0; i < MAXSIZE-1; ++i)
        {
            space[i].cur = i+1;
        }
        space[MAXSIZE-1].cur = 0;        //目前静态链表为空,最后一个元素cur为0
    
        printf("请输入静态链表结点的个数:
    ");
        printf("len = ");
        scanf("%d",&len);
    
        for(i = 1; i <= len; ++i)
        {
            printf("请输入第%d个结点的值:",i);
            scanf("%d",&val);
            space[i].data = val;
        }
    
        space[0].cur = len + 1;     //第一个数组元素的cur用来存放备用链表的第一个结点下标
        space[len].cur = 0;         
        space[MAXSIZE-1].cur = 1;   //最后一个数组元素存放第一个有效结点的下标
    
        return;
    }
    
    int Malloc_SL(SLinkList space)    //若备用空间链表非空,则返回分配的结点下标,否则返回0
    {
        int i;
    
        i = space[0].cur;            //因为数组第一个结点存放的就是第一个备用链表的下标
        if(0 != space[0].cur)
        {
            space[0].cur = space[i].cur;    //更新为备用链表的下一个结点
        }
    
        return i;
    }
    
    void Free_SL(SLinkList space, int k)   //将下标为k的空闲结点回收到备用链表
    { 
        space[k].cur = space[0].cur;    //使第k个结点指向原本备用链表的首结点
        space[0].cur = k;               //将第k个结点作为新的备用链表首结点
    
        return;
    }
    
    void ListTraverse_SL(SLinkList space)   //遍历输出
    {
        int i = space[MAXSIZE-1].cur;
    
        while( 0 != i)
        {
            printf("%d
    ", space[i].data);
            i = space[i].cur;
        }
    
        return;
    }
    
    int LocateElem_SL(SLinkList space, int e)    //在静态链表L中查找第一个值为e的元素,若找到则返回它在L中的位序,否则返回0
    {
        int i = space[MAXSIZE-1].cur;
    
        while( (e != space[i].data) && (0 != i) )
        {
            i = space[i].cur;
        }
    
        return i;
    }
    
    int Listlength_SL(SLinkList space)   //返回静态链表space中有效数值的个数
    {
        int len = 0;
        int i = space[MAXSIZE-1].cur;
    
        while(i)
        {
            len++;
            i = space[i].cur;
        }
    
        return len;
    }
    
    bool ListInsert_SL(SLinkList space, int pos, int val)     //在静态链表L中第pos个位置插入新的元素val,pos从1开始
    {
        int i,j,k;
    
        if((pos < 1) || (pos > Listlength_SL(space)+1))   //不考虑满的情况
            return false;
    
        i = Malloc_SL(space);      //或得空闲元素的下标
        j = MAXSIZE-1; 
    
        if( 0 != i)
        {
            space[i].data = val;
            for(k = 0; k < pos-1; ++k)
            {
                j = space[j].cur;    //找到第pos个元素之前的位置
            }
            space[i].cur = space[j].cur;     
            space[j].cur = i;
    
            return true;
        }
    
        return false;
    }
    
    bool ListDelete_SL(SLinkList space, int pos, int *val)  //删除静态链表L中第pos个元素,并用val返回,pos从1开始
    {
        int i, j, k;
    
        if((pos < 1) || (pos > Listlength_SL(space)))   
        return false;
    
        k = MAXSIZE-1;
        for(i = 0; i < pos-1; ++i)       
        {
            k = space[k].cur;    //找到第pos个元素之前的位置
        }
        j = space[k].cur;        //待删除的元素
    
        *val = space[j].data;
    
        space[k].cur = space[j].cur;
        Free_SL(space, j);
    
        return true;
    }
    
  • 相关阅读:
    文件查找和比较命令 来自: http://man.linuxde.net/find
    Docker学习计划
    Mybatis各种模糊查询
    linux下vi命令大全
    mac下的环境变量
    slf4j输出变量
    使用lombok中的log
    idea中的java web项目(添加jar包介绍)和java maven web项目目录结构
    slf4j+logback&logback.xml
    日志框架
  • 原文地址:https://www.cnblogs.com/yzy-blogs/p/6011712.html
Copyright © 2011-2022 走看看