静态链表的实现

这里写图片描述

定义:用数组描述的链表叫做静态链表。
我们对数组的第一个和最后一个位置做了特殊处理,不存数据

未被使用的数组元素成为备用链表。

下标为0的元素的cur存放备用链表的第一个节点的下标。

数组最后一个元素的cur存放第一个有数值的元素的下标

注意链表的形成是用cur连到一起的

#include "string.h"
#include "ctype.h"

#include "stdio.h"
#include "stdlib.h"
#include "io.h"
#include "math.h"
#include "time.h"

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

#define MAXSIZE 1000 /* 存储空间初始分配量 */

typedef int Status;           /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef char ElemType;        /* ElemType类型根据实际情况而定,这里假设为char */


typedef struct
{
    ElemType data;
    int cur;
}Component,StaticLinkList[MAXSIZE];

//以节点的下标作为指针

Status InitList(StaticLinkList space){
    int i;
    for(i=0;i<MAXSIZE-2;i++){
        space[i].cur=i+1;   //数组的第一个位置用来记录未被使用的第一个位置的下标
    }
    space[MAXSIZE-2].cur = 0;
    space[MAXSIZE-1].cur = 0;//数组的最后一个位置用来记录已经被使用的第一个位置的下标
    return OK;

}

Status ListLength(StaticLinkList L){
    int k;
    k = MAXSIZE-1;
    int i,count=0;
    while(L[k].cur!=0){
        count++;
        k=L[k].cur;
    }
    return count;
}


//若备用的链表非空,返回的是分配的节点下标
int Malloc_SLL(StaticLinkList space){
    int i = space[0].cur; //获取到第一个元素位置的下标

    if(space[0].cur){//如果还有备用位置
        space[0].cur = space[i].cur;//使用下一个位置作为第一个备用位置
    }

    return i;
}

Status ListInsert(StaticLinkList L , int i, ElemType e){
    int j,k,l;
    k = MAXSIZE -1;
    if(i<1||i>ListLength(L)+1)
        return ERROR;
    j = Malloc_SLL(L);
   // printf("j=%d\n",j);
    if(j){//如果有空位置
        L[j].data = e;
        for(l=1;l<=i-1;l++){ //找到第i-1个位置
            k = L[k].cur;
        }
        L[j].cur = L[k].cur; //把第i-1个位置指向的下标赋值给新的存储位置。
        L[k].cur = j;       //新分配的节点下标
         return OK;
    }

    return ERROR;

}



void Free_SSL(StaticLinkList space , int k){ //删除第k个位置的元素
    space[k].cur = space[0].cur ;//把原空闲的位置赋值给释放的位置k
    space[0].cur = k;             //使k成为第一个备用的位置

}

Status ListDelete(StaticLinkList L ,int i){//注意第i的位置的下标是第i-1位置的cur,不一定是i
    int j,k;
    if(i<1||i>ListLength(L)){
    return ERROR;
    }
    k=MAXSIZE-1;
    for(j=1;j<=i-1;i++){
        k = L[k].cur;

    }
    j = L[k].cur;//第i位置的下标
    L[k].cur = L[j].cur;//第i-1位置的下标
    Free_SSL(L,j);
    return OK;
}
Status ListTraverse(StaticLinkList L)
{
    int j=0;
    int i=L[MAXSIZE-1].cur;
    while(i)
    {
            printf("%c ",L[i].data);
            i=L[i].cur;
            j++;
    }
    return j;
    printf("\n");
    return OK;
}


int main(){
    StaticLinkList L;
    Status i;
    i=InitList(L);
    printf("初始化L后:L.length=%d\n",ListLength(L));

    i=ListInsert(L,1,'F');
    i=ListInsert(L,2,'E');
    i=ListInsert(L,1,'D');
    i=ListInsert(L,1,'B');
    i=ListInsert(L,1,'A');

    printf("\n在L的表头依次插入FEDBA后:\nL.data=");
    ListTraverse(L);

    i=ListInsert(L,3,'C');
    printf("\n在L的“B”与“D”之间插入“C”后:\nL.data=");
    ListTraverse(L);

    i=ListDelete(L,1);
    printf("\n在L的删除“A”后:\nL.data=");
    ListTraverse(L);

    printf("\n");

    return 0;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值