数据结构复习笔记(二)—— 线性表的链式存储结构之静态链表

静态链表

对于没有指针的语言,通过数组表示链表,数组每个元素由data和cur组成。data保存数组元素数据,cur相当于next,用于保存下一个数组元素下标。


静态链表

静态链表结构的代码表示

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

静态链表的初始化

void InitLinkList (StaticLinkList space) {
    int i;
    for(int i = 0; i < MAX_SIZE; i++){
        space[i].cur = i + 1;
    }
    space[i - 1].cur = 0;//0表示无指向

}

静态链表的插入

需要模拟动态分配内存。
因此还需要准备一个备用链表,用于存放空的和已经删除的位置,每次需要插入时则选取备用列表的第一个位置所记录的位置进行插入。

模拟动态分配内存

int malloc_SLL(StaticLinkList space) {
    int i = space[0].cur;//第一个元素的备用空闲的下标
    if (space[0].cur)
    {
        space[0].cur = space[i].cur;//拿出她的下一个cur作为备用
    }
    return i;
}

插入

int ListLength(StaticLinkList array)
{
    int i = array[MAX_SIZE - 1].cur;
    int j = 0;
    while (i)
    {
        i = array[i].cur;
        ++j;
    }
    return j;
}

void ListInsert(StaticLinkList L, int i, ElemType e){
    int j, k, l;
    k = MAX_SIZE - 1;
    if (i<1 || i > ListLength(L) + 1)
        exit(0);
    j = malloc_SLL(L);
    if (j) {
        L[j].data = e;
        for (l = 1; 1 <= i - 1; l++) {
            k = L[k].cur;
        }
        L[j].cur = L[k].cur;
        L[k].cur = j;
    }
    else
    {
        exit(0);
    }
}

静态链表的删除

void ListDelete(StaticLinkList L, int i) {
    int j, k;
    if (i < 1 || i > ListLength(L))
    {
        exit(0);
    }
    k = MAX_SIZE - 1;
    for (j = 1; j <- i-1; j++)
    {
        k = L[k].cur;
    }
    j = L[k].cur = L[j].cur;
    Free_SSL(L, j);

}

void Free_SSL(StaticLinkList space, int k) {
    space[k].cur = space[0].cur;
    space[0].cur = k;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容