静态链表结构:
我们对数组的第一个和最后一个元素做特殊处理,不存数据。第一个元素的cur存放备用链表的第一个结点的下标,最后一个元素存放含有值的第一个元素的下标,相当于头结点的作用。
当链表为空时,最后一个下标的cur为0
当链表满了时,第一个下标的cur为MAXSIZE-1,即指向最后一个单元的地址
- #define MAXSIZE 1000
- typedef struct{
- ElemType data;
- int cur;
- }Component,StaticLinkList[MAXSIZE];
静态链表的初始化:
- void initList(StaticLinkList space){
- int index;
- for(index=0;index<MAXSIZE-1;index++){
- space[index].cur = index+1;
- }
- space[MAXSIZE-1].cur = 0;
- }
静态链表的插入
- int mallocSLL(StaticLinkList space){
- int i;
- if(space[0].cur == MAXSIZE-1){//表满了,返回0
- i = 0;
- return i;
- }
- else{
- i = space[0].cur;//取出备用链表第一个元素
- space[0].cur = space[i].cur;//重新修改备用链表的第一个元素
- return i;
- }
- }
- bool StaticLinkListInsert(StaitcLinkList space,int i,ElemType e){
- int j;//新分配元素的下标
- int index;//计数器
- int k;//游标
- if(i<1 || i>listLength(L)+1)//如果i的取值范围不合适,插入到底i个元素的前面,i取值为[1,length+1]
- return false;
- j = mallocSLL(L);
- if(j){//不成功说明表满了
- k = MAXSIZE - 1;//让游标指向第一个数值位置的前一个位置
- for(index=1;index<=i-1;index++){
- k = space[k].cur;
- }
- space[j].data = e;//将新元素赋值
- space[j].cur = space[k].cur;//更改cur指向
- space[k].cur = j;//顺序不能错
- return true;
- }
- else{
- return false;
- }
- }
静态链表的删除
- bool StaticLinkListDelete(StaticLinkList space,int i){
- int index;//计数器
- int k;//游标
- int j;//指向被删除的元素
- k = MAXSIZE-1;//k指向被删除元素的上一个元素
- if(space[k].cur){//表空
- return false;
- }
- if(i<1 || i>listLength(L)){//删除位置必须要合理
- return false;
- }
- for(index=1;index<=i-1;index++){//找到删除的位置
- k = space[k].cur;
- }
- j = space[k].cur;//交换指针
- space[k].cur = space[j].cur; //修改被删除元素的上一个元素的cur值
- freeSLL(L,j);//修改备用链表
- return true;
- }
- void freeSLL(StaticLinkList space,int j){
- space[j].cur = space[0].cur;
- space[0].cur = j;
- }
静态链表的长度
- int listLength(StaticLinkList L){//如果下一个位置为空,则cur为0
- int count = 0;
- int i = L[MAXSIZE-1].cur;
- while(i){
- i = L[i].cur;
- count++;
- }
- return count;
- }
静态链表的特点
转载于:https://blog.51cto.com/fanaticssk/833360