静态链表 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   

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

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

posted @ 2016-05-15 00:44  MrPat  阅读(251)  评论(0编辑  收藏  举报