【数据结构】线性表之静态链表

网易云课堂小甲鱼课程链接:数据结构与算法

一、什么是静态链表

C语言的伟大,在于指针的灵活性,使得它可以非常容易的操作内存中的地址和数据,这比其他高级语言更加灵活方便。(面向对象使用对象引用机制间接地实现了指针的某些功能)

但是在没有指针的时候,用数组代替指针来描述单链表。
定义:用数组描述的链表叫做静态链表,这种描述方法叫做游标实现法

静态链表

代码实现:

#include <stdio.h>

#define MAXSIZE 1000

typedef int  ElemType; /*  定义数据元素类型,类型名为ElemType,此处所定义的数据元素只包含一个int型的数据项*/
typedef struct {
    
    ElemType data; // 数据
    int cur;      // 游标(Cursor)
    
}Component, StaticLinkList[MAXSIZE];

特点

  • 静态链表中,每一个结点包含两个部分:data(数据)和cur(存储该元素下一个元素所在数组中对应的下标)
  • 下标为0的结点不包含任何数据:如图中,下标为0的结点它的cur存储的是备用链表(即没有存储数据的那些结点,图中下标5后面的结点)。
  • 数组的最后一个元素的cur存放第一个元素的下标:如图中最后一个元素的cur是1,存放的是静态链表的第一个结点的下标,注意此处的第一个结点,是指有实质意义的数据的结点,如图中的数据A存放在下标为1的结点,那么1就是第一个结点。
  • 链表的最后一个元素存cur存放0:链表的最后一个元素,并不一定是数组的最后一个元素(如图中下标为4的元素),它的cur一般是存放0,表示它后面的结点为空了。

对静态链表进行初始化

对静态链表进行初始化相当于初始化数组操作

// 1.对静态链表进行初始化  - 相当于初始化数组
Status InitList(StaticLinkList space){
    
    int i;
    
    for (i = 0; i < MAXSIZE-1; i++)
        
        space[i].cur = i+1;
    
    space[MAXSIZE-1].cur = 0;
    
    return OK;
}

获得链表的长度

// 获得链表的长度
int ListLength(StaticLinkList L){
    
    int j = 0;
    int i = L[MAXSIZE-1].cur;
    
    while (i) {
        i = L[i].cur;
        j++;
    }
    
    return j;
}

二、静态链表的插入操作

在动态链表中,结点的申请和释放分别借用C语言的malloc()free()函数来实现。
在静态链表中,操作的是数组,不存在动态链表的节点申请和释放的问题,所以需要自己实现这两个函数,才可以做到插入和删除操作。
为了辨明数组中哪些分量未被使用,解决办法是将所有未被使用的以及已被删除的分量用游标链成一个备用的链表。

在上图的A后面插入一个B的的方式如图:


代码实现:

// 2.静态链表的插入操作

// 2.1获取空闲分量的下标
int Malloc_SLL(StaticLinkList space){
    
    int i = space[0].cur;
    
    if (space[0].cur)
        
        space[0].cur = space[i].cur;
    
    return i;
}

// 2.2在静态链表L中第i个元素之前插入新的数据元素e
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); // 得到备用链表的第一个元素
    
    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个元素的cur设置为新加的这个结点的下标,将新加的这个结点的下标设置为之前第i-1个元素存储的cur值
        L[k].cur = j;
        
        return OK;
    }
    
    return ERROR;
    
}

静态链表的插入需要分两步,先是获取空闲的分量,在进行插入操作。

三、静态链表的删除操作

删除的元素要放到备用链表里面

代码实现:

// 3.静态链表的删除操作

// 3.1删除在L中的第i个元素
Status ListDelete(StaticLinkList L, int i){
    
    int j, k;
    
    if (i<1 || i>ListLength(L)) return ERROR;
    
    k = MAXSIZE-1;
    
    for (j = 1; j<= i-1; j++)
        
        k = L[k].cur;
    
    j = L[k].cur;
    L[k].cur = L[j].cur;
    
    Free_SLL(L, j);
    
    return OK;
    
}

// 3.2将下标为k的空闲结点回收到备用链表
void Free_SLL(StaticLinkList space, int k){
    
    space[k].cur = space[0].cur;
    space[0].cur = k;
}

静态链表的优缺点

优点:
  • 在插入和删除操作时,只需要修改游标,不需要移动元素,从而改进了在顺序存储结构中的插入和删除操作需要移动大量元素的缺点。
缺点:
  • 没有解决连续存储分配(数组)带来的表长难以确定的问题。
  • 失去了顺序存储结构随机存取的特性。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,290评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,107评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,872评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,415评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,453评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,784评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,927评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,691评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,137评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,472评论 2 326
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,622评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,289评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,887评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,316评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,490评论 2 348

推荐阅读更多精彩内容