静态链表



静态链表相当于是用一个数组来实现线性表的链式存储结构,大概结构图如下

                                    

在静态链表中,每一个结点包含两部分内容,一部分是data(即有意义的数据),另一部分是cur(存储该元素下一个元素所在数组对应的下标)。

有几个特殊的结点:

首先是下标为0的结点中不包含有意义的数据,它的cur存储的是备用链表(即没有存储的数据的那些结点)第一个结点的下标。如上图2所示,数组第一个元素的cur存放的是7。

其次是数组最后一个元素,数组最后一个元素的cur存放的是静态链表的第一个结点的下标(此处的第一个结点,是指有实质意义的数据的结点)。

最后就是链表的最后一个元素(并不一定是数组的最后一个元素),链表最后一个元素的cur一般存放0,表示它后面的结点为空了。

 

静态链表的结构:

#define MAX_SIZE = 1000 ;
typedef struct {
     ElemType data ;
     int cur ; 
} Component ,  StaticLinkList[MAX_SIZE];


静态链表的初始化:

Status InitList(StaticLinkList L) {
    for(int i = 0; i < MAX_SIZE - 1 ; ++i) {
        space[i].cur =  i+1 ;       
   }
   space[MAX_SIZE-1].cur = 0 ;
   return OK;
}

如果要插入新的结点到静态链表中,首先需要得到一个备用链表的位置来存放新的结点,malloc_ssl就是得到一个备用链表的下标,并且返回。

int Malloc_SSL(StaticLinkList L ) {
       int i = space[MAX_SIZE-1].cur ;               //得到第一个结点的下标
       if(space[0].cur){                             //如果存在备用链表
               i = space[0].cur ;                    //得到备用链表的第一个结点的下标
        }
      space[0].cur = space[i].cur ;                  //备用结点的第一个结点将被使用,于是备用结点小标往后一个结点移动
       return i ;
}

插入新结点操作:

Status InserList(StaticLinkList L ,  int  i ,   ElemType e) {
       int k = MAX_SIZE - 1;
       if( i < 1 || i > Length(L) + 1)
           return ERROR ;
       int j = Malloc_SSL(L);                 //得到备用链表的第一个元素
       if (j){                                //如果元素存在
                 L[j].data = e ;                 
                 for(int m = 1 ; m < i ; ++m) //得到第i-1个元素的下标
                     k = L[k].cur ;
                L[j].cur = L[k].cur ;         //将第i-1个元素的cur设置为新加的这个结点的下标,将新加的这个结点的下标设置为之前第i-1个元素存储的cur值
                L[k].cur = j ;
                return OK ;
       }
      return ERROR ;
}

删除静态链表中的元素:

Status DeleteLinkList(StaticLinkList   L ,  int   i ) {
        if(i < 1 || i > ListLength(L))
              return ERROR ;
        int k = MAX_SIZE - 1 ;
        for(int j = 1 ; j < i ; ++j) {              //找到第i-1个元素
                 k = L[k].cur   ;
        }
        j = L[K].cur ;                              //得到第i个元素的下标
        L[k].cur = L[j].cur ;                       //将第i个元素存储的cur值赋值给第i-1个元素的cur
        Free_SSL(L ,  j);                           //释放掉第i个元素,第i个元素的下标为j
        return OK;
}

其中Free_SSL就是将该下标的结点放到备用链表中去。 

void Free_SSL(StaticLinkList   L ,  int  i ) {
         L[i].cur  = space[0].cur ;             //将之前的备用链表的第一个结点的小标存入到L[i]的cur中
        space[0].cur = i ;                      //下标为i的元素成为备用链表的第一个结点
}

转自

http://blog.csdn.net/scu_daiwei/article/details/851106

9
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
静态链表是一种使用数组实现的链表结构,它通过数组中的元素来模拟链表中的节点,并使用一个特殊的指针(游标)来表示节点之间的逻辑关系。静态链表的优点是实现简单,不需要频繁地申请和释放内存空间,但缺点是插入和删除操作比较麻烦,需要手动维护游标指针。 以下是一个简单的Python静态链表的实现示例[^1]: ```python class StaticLinkedList: def __init__(self, size): self.data = [None] * size # 存储数据的数组 self.next = [i + 1 for i in range(size)] # 游标数组,用于维护节点之间的逻辑关系 self.next[-1] = -1 # 最后一个元素的游标为-1,表示链表的末尾 self.head = -1 # 头指针,指向链表的第一个节点 def is_empty(self): return self.head == -1 def is_full(self): return self.next == -1 def insert(self, value): if self.is_full(): print("StaticLinkedList is full") return new_node = self.next # 获取一个空闲节点 self.next = self.next[new_node] # 更新空闲节点的游标 self.data[new_node] = value # 在空闲节点中存储数据 if self.is_empty(): self.head = new_node self.next[new_node] = -1 else: current = self.head while self.next[current] != -1: current = self.next[current] self.next[current] = new_node self.next[new_node] = -1 def delete(self, value): if self.is_empty(): print("StaticLinkedList is empty") return prev = -1 current = self.head while current != -1: if self.data[current] == value: break prev = current current = self.next[current] if current == -1: print("Value not found") return if prev == -1: self.head = self.next[current] else: self.next[prev] = self.next[current] self.next[current] = self.next # 将删除的节点加入空闲节点链表 self.next = current def display(self): if self.is_empty(): print("StaticLinkedList is empty") return current = self.head while current != -1: print(self.data[current], end=" ") current = self.next[current] print() # 创建一个容量为5的静态链表 static_list = StaticLinkedList(5) # 插入数据 static_list.insert(1) static_list.insert(2) static_list.insert(3) # 删除数据 static_list.delete(2) # 显示链表中的数据 static_list.display() ``` 输出结果为: ``` 1 3 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值