• 静态链表 C语言描述


    静态链表
    1.下标为0的游标存放最后存放数据节点的游标,即是第一个没有存放元素(备用链表)的下标
    2.最后一个的节点存放第一个由数值得下标
    3.第一个和最后一个都不存放数据 即是备用链表的第一个的下标
    4.最后一个存储数据的节点的游标为0

    静态链表主要是根据游标来遍历,以前没有指针用的思想

    假如我要删除一个元素

    图不多描述,自己画画就明白,然后代码部分。都有注释,

      1 #include <stdio.h>
      2 #define ElemType int
      3 #define Status int
      4 #define MAXSIZE 1000
      5 typedef struct{
      6     ElemType data;//数据 
      7     int cur;  //游标 
      8 }Component,StaticLinkList[MAXSIZE];
      9 
     10 
     11 //初始化静态链表
     12 Status InitList (StaticLinkList space) //初始化静态链表等于初始化数组 
     13 {
     14     int i;
     15     for (i=0;i<MAXSIZE-1;i++)  
     16       space [i].cur=i+1;       //给所有节点的游标赋值 
     17       
     18       space[MAXSIZE-1].cur =0;  //最后节点的游标为第一个元素 
     19       return 0;
     20 }
     21 
     22 
     23 //获取备用链表的第一个元素下标 (插入操作)
     24 int Malloc_SLL(StaticLinkList space)
     25 {
     26     int i=space[0].cur;  //用i存储静态链 表第一个节点的游标
     27     if(space[0].cur)    //如果首个的游标不为零,则最后一个节点的游标赋值给首节点 
     28       space[0].cur=space[i].cur;   //把下一个作为备用链表的第一个元素 
     29       
     30       return i;         //要插入的下标 
     31  } 
     32  
     33  
     34  
     35  
     36  //获得链表的长度
     37  int ListLength(StaticLinkList L)
     38  {
     39      int j=0;      //用来计算 
     40      int i=L[MAXSIZE-1].cur; //最后一个元素的游标,即首个存数据的节点的下标 
     41      
     42      while (i)           //下标不为0执行循环 
     43      {
     44          i =L[i].cur;    //遍历知道最后一个存数据的节点的下标为0 
     45          j++;
     46     }
     47     return j; 
     48  }
     49   
     50  
     51  
     52  
     53  
     54  
     55  //在静态链表L中第i个元素之前插入新的数据元素e
     56  Status ListInsert(StaticLinkList L,int i,ElemType e)
     57  {
     58      int j,k,l;
     59      
     60      k=MAXSIZE -1; 
     61      if (i<1 || i>ListLength(L)+1)
     62        return -1;
     63      
     64      j=Malloc_SLL(L);   //获取备用链表的第一个元素下标 
     65      if (j)           //如果静态链表不为空 
     66      {
     67          L[j].data=e;    //把值插入备用链表的第一个元素 
     68          for (l=1;l<=i-1;l++)   //获取它之前元素的游标 
     69              k=L[k].cur;
     70              
     71              
     72              L[j].cur=L[k].cur;  //把获取的游标赋值给新插入的游标 
     73              L[k].cur=j;         //把新插入的节点的下标赋值给第i-1个节点的游标 
     74              return 0;
     75          
     76       } 
     77       return  -1;
     78  }
     79  
     80  
     81  
     82  
     83  
     84  //将下标为K的空闲节点回收到备用表中
     85 void Free_SLL(StaticLinkList space,int k) 
     86 {
     87     space[k].cur=space[0].cur;
     88     space[0].cur=k;
     89 }
     90  
     91  
     92  
     93  
     94  
     95  //删除在L中的第i个元素数据
     96  Status ListDelete(StaticLinkList L,int i)
     97  {
     98      int j,k;
     99      if (i<1  ||i>ListLength(L))  //超出长度,退出程序 
    100        return -1;
    101        
    102      k=MAXSIZE -1;             //首个存数据的游标 
    103          for(j=1;j<=i-1;j++)    //获取要删除元素的前一个游标
    104              k=L[k].cur;
    105              
    106     j=L[k].cur;             
    107     L[k].cur=L[j].cur;      
    108     
    109     Free_SLL(L,j);
    110     return 0;
    111   } 
    112   

    插入原理:主要找到要插入的位置的前一个节点游标,将其游标改为插入元素的下标,插入元素的游标记录下一个的下标。

    虽然静态链表被指针取代了,但是这思想要懂,以后开发的时候可以用到。

  • 相关阅读:
    Vue.js-项目目录结构解析
    Vue.js-创建Vue项目(Vue项目初始化)并不是用Webstrom创建,只是用Webstrom打开
    Node.js-npm安装包目录修改
    Node.js-Webstorm2018配置nodejs
    Node.js-ReferenceError: _filename is not defined
    cas系列-自定义异常提示(五)
    cas系列-cas登出(四)
    cas系列-cas REST协议(三)
    maven引入第三方jar包
    持续api管理翻译
  • 原文地址:https://www.cnblogs.com/biyongyao/p/5494258.html
Copyright © 2020-2023  润新知