静态链表

静态链表也是线性存储的一种,他兼顾了普通链表和顺序表的优点

静态链表存储数据使用数组存储,使用游标来标注下一个数据

静态链表 初始化:

有头结点的链表


代码:

#include <stdio.h>

#include <string.h>

#define MAXSIZE 11                        // 静态链表的长度

typedef char ElemType[8];        // 元素的类型,规定姓氏不超过7个字符

typedef struct

{

    ElemType data;                        // 节点中的数据

    int cur;                                // 下一个节点的下标(相当于指针)

} NodeType;                                      // 节点类型

NodeType space[MAXSIZE];        // 用来存储节点的数组,相当于一般链表中的内存,

// 只是那个内存是系统分配的,我们看不到

typedef struct

{

    int elem;                                // 静态链表存储空间基址(起始元素的下标)

    int length;                                // 静态链表中的元素数目

    int listSize;                        // 静态链表当前的长度,可容纳元素数目

} SLinkList;                                      // 静态链表类型的定义,和一般的链表类似

int LocateElem_SL(SLinkList& S, ElemType e)

{

    // 在静态单链线性表L中查找第1个值为e的元素。

    // 若找到,则返回它在L中的位序,否则返回0。

    int i;

    i = S.elem; // i指示表中第一个结点

    while (i && strcmp(space[i].data, e))

        i = space[i].cur; // 在表中顺链查找

    return i;

}

void InitSpace_SL()

{

    // 将一维数组space中各分量链成一个备用链表,space[0].cur为头指针,

    // "0"表示空指针

    memset(space, 0 ,sizeof(space));

    for (int i = 0; i < MAXSIZE - 1; ++i)

        space[i].cur = i + 1;

    space[MAXSIZE - 1].cur = 0;

}

int Malloc_SL()

{

    /* 若备用链表非空,则返回分配的结点下标(备用链表的第一个结点),否则返回0 */

    int i = space[0].cur;

    if (i) /* 备用链表非空 */

        space[0].cur = space[i].cur;/* 备用链表的头结点指向原备用链表的第二个结点 */

    return i;/* 返回新开辟结点的坐标 */

}

void Free_SL(int k)

{/* 将下标为k的空闲结点回收到备用链表(成为备用链表的第一个结点) */

    space[k].cur = space[0].cur;/* 回收结点的"游标"指向备用链表的第一个结点 */

    space[0].cur = k; /* 备用链表的头结点指向新回收的结点 */

}

void Insert_SL(SLinkList& S, int i, ElemType e)

{

    // 往静态链表S中的第 i 个位置前插入e

    int cur = S.elem;                // 指向静态链表中的第一个节点

    int j=0;

    int newNodeIndex;                // 存储新分配的节点下标

    while(j < i-1)                        // 寻找第 i-1 个节点

    {

        cur = space[cur].cur;

        ++j;

    }

    newNodeIndex = Malloc_SL();        // 分配新的节点

    strcpy(space[newNodeIndex].data,e);        // 在新的节点中存入数据

    space[newNodeIndex].cur = 0;                // 指针为空,这一点很重要

    space[newNodeIndex].cur = space[cur].cur;        // 插入静态链表中

    space[cur].cur = newNodeIndex;

    S.length++;                        // 插入后静态链表长度加1

}

void Delete_SL(SLinkList& S, int i)

{

    // 删除静态链表中的第 i 个节点

    int cur = S.elem;                // 指向静态链表中的第一个节点

    int j=0;

    int delCur;                                // 存储待删除节点的下标

    while(j < i-1)                        // 寻找第 i-1 个节点

    {

        cur = space[cur].cur;

        ++j;

    }

    delCur = space[cur].cur;                // 找到待删除节点的下标

    space[cur].cur = space[delCur].cur;        // 删除节点

    Free_SL(delCur);                        // 释放节点

    S.length--;                        // 删除后静态链表长度减1

}

void CreateList_SL(SLinkList& S)        // 创建静态链表

{

    S.elem = Malloc_SL();                        // 分配头结点的指针

    space[S.elem].cur = 0;

    S.length = 0;

    S.listSize = 9;

}

void Show_space()

{

    // 将静态链表中所有的节点显示出来

    int i;

    for(i=0; i<MAXSIZE; i++)

    {

        printf("%-8s%2d\n", space[i].data, space[i].cur);

    }

}

int main()

{

    SLinkList S;                // 定义静态链表

    char str[10];                // 用来获得指令

    int a;                                // 存储位置

    ElemType e;                        // 存储元素

    InitSpace_SL();                // 初始化备用链表

    CreateList_SL(S);        // 创建静态链表

    while(scanf("%s", str) != EOF)

    {

        if(strcmp(str, "insert") == 0)                        // 插入元素

        {

            scanf("%d%s", &a, e);

            Insert_SL(S, a, e);

        }

        else if(strcmp(str, "delete") == 0)          // 删除元素

        {

            scanf("%d", &a);

            Delete_SL(S, a);

        }

        else if(strcmp(str, "search") == 0)          // 搜索元素

        {

            scanf("%s", e);

            printf("%2d\n********************\n", LocateElem_SL(S, e));

        }

        else if(strcmp(str, "show") == 0)                  // 显示静态链表状态

        {

            Show_space();

            puts("********************");                                                // 注意空一行

        }

    }

    return 0;

}

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

推荐阅读更多精彩内容

  • 用数组描述的链表叫做静态链表 我们让数组的元素都是由两个数据域组成,data和cur。也就是说,数组的每个下标都对...
    unravelW阅读 621评论 0 0
  • 逻辑结构上相邻的数据元素,存储在指定的一块内存空间中,数据元素只允许在这块内存空间中随机存放,这样的存储结构生成的...
    飞扬code阅读 454评论 0 4
  • 静态链表:数据全部存储在数组中(和顺序表一样),但存储位置是随机的,数据之间"一对一"的逻辑关系通过一个整形变量(...
    hadoop_a9bb阅读 1,705评论 0 0
  • 它长了出来 有黑色 有黄色 有白色 有的短 有的长 甚至试图作为眼睛的装饰 我把它剪掉了 它的主人只眯眼看着我 差...
    云野圆子阅读 211评论 0 0
  • 我们的祖国生病了,我们不能出去,只能呆在家里。从动画片中我了解到,那是一种从蝙蝠身上,产生的病毒传染到了我们人类的...
    56e51f0ab6b5阅读 209评论 0 0