zoukankan      html  css  js  c++  java
  • 用数组代替指针实现静态链表

      在没有C语言之前还没有指针这个概念,但是那个时候就已经有和现在静态链表操作形式类似数据存储类型。静态链表的优势就在于,在对其中存储的信息进行插入删除操作的时候它的时间复杂度是 O(1) ,那么在没有指针的时候是使用什么来实现这种存储操作的那?

      那就是用数组来代替指针,静态链表在进行数据遍历的时候是依靠前一个结点存储的下一个结点的地址来进行遍历。并且可以将所有零散的空间利用起来,这样就更加的节省资源的(数组版本的静态链表在这一点上就做的不好,因为数组需要提前设置好它的大小,所以为了防止存储的数据超出范围就需要把数组定义的很大,这样就很浪费资源了)。每一个静态链表的结点都会有一个结构指针用来存储下一个结点的地址,那么同样指针版本的静态链表就需要两个部分一部分是,一部分是数据部分,还有一部分是游标,数组是有下标的游标就用来存储下一个结点的数组下标数,这样就可以直接通过下标访问到数据了。同时静态链表需要一个头指针来访问第一个结点,如果第一个结点都不知道在哪里的话那么后续的操作就不可能实现了,所以这里的数组就需要就需要有一个是特地用来存储第一个结点的下标的一个结构。当然这个位置没有什么特别的限制,如果你想用中间的一个结构来存储那也是可以实现的只是这样可能就会比较麻烦了,所以很多时候就用结构数组的最后一个结构用来存储头结点的下标,同时作为数组在进行插入的时候还存在一个问题,新插入的数据需要存储在什么地方,在使用指针的静态链表就不需要考虑这个问题,因为编译器会替你完成这个分配的任务,但当你使用数组的静态链表的时候插入操作需要你自己给它分配一个指定的数组位置,那么就需要有一个位置用来存储第一空数组的下标,所以这个数组最开始在使用之前是需要先初始化的,第一个和最后与一个结构的游标存储为0数据为空,其余的数组的游标存储的数值比它自己本身大1,数据为空。

     

    创建静态链表

    int staticListSetUp(staticList *space)
    {
        int i;
        space[MAXSIZE-1].cur=0;
        space[0].data=NUL;
        for(i=0;i<MAXSIZE;i++)
        {
            space[i].data=NUL;
            if(i==MAXSIZE-1)
            {
                space[i].cur=0;
            }
            else if(i==MAXSIZE-2)
            {
                space[i].cur=0;
            }
            else if( i==0 )
            {
                space[i].cur=0;
            }
            else
            {
                space[i].cur=i+1;
            }
            
        }
        return OK;
     }

    静态链表的遍历

    void staticListprint(staticList *space)
     {
         int i;
          i=space[MAXSIZE-1].cur;
         while(i !=0)
         {
             printf("%c",space[i].data);
             i=space[i].cur;
        }
         printf(" ");
      }

    静态链表的插入操作

    int staticListFreeNode(staticList *space)
    {
        int free=space[0].cur;
        if(space[0].cur)
        {
            space[0].cur=space[free].cur;
        }
        else
        {
            space[0].cur=2;
            free=1;
        }
        return free;
    }
    
    void staticListAdd(staticList *space,int place,char insertdata)
    {
        int j,number;
        int length=ListLength(space);
        int i=staticListFreeNode(space);
        space[i].data=insertdata;
        number=space[MAXSIZE-1].cur;
        if(place== length+1)
        {
            while(space[number].cur!=0)
            {
                if(number==0)
                {
                    number=1;
                    break;
                }
                number=space[number].cur;
            }
            space[number].cur=i;
        }
        number=space[MAXSIZE-1].cur;
        for(j=1;j<place-1;j++)
        {
            number=space[number].cur;
        }
        if( place== length+1 )
        {
            if(place==1)
            {
                space[MAXSIZE-1].cur=i;
            }
            else 
            {
                space[number].cur=i;
            }
            space[i].cur=0;
        }
        else if(place==1)
        {
            space[MAXSIZE-1].cur=i;
            space[i].cur=number;
        }
        else
        {
            j=space[number].cur;
            space[number].cur=i;
            space[i].cur=j;
        }
        
    }
  • 相关阅读:
    LR11
    安装Nginx+uWSGI+Django环境
    MYSQL 安装更新,使用,管理,备份和安全等
    oracle里要查看一条sql的执行情况,有没有走到索引,怎么看?索引不能提高效率?
    大神:python怎么爬取js的页面
    Sublime 编译出来的是 dos格式,不是unix格式
    前天搞了一天?昨天搞了一天?今天搞了半小时
    搞了一宿,弄完了一个POP3协议
    我竟然。。。傻了近一年
    跨进程信息交互真个费事。
  • 原文地址:https://www.cnblogs.com/foreverW/p/7237148.html
Copyright © 2011-2022 走看看