静态链表:

也是一种线性存储结构,它结合了顺序表和链表的优点,既能快速访问元素,又能快速增加或删除数据元素。使用静态链表存储数据,数据全部存储在数组中(和顺序表一样),但存储位置是随机的,数据之间"一对一"的逻辑关系通过一个整形变量(称为"游标",和指针功能类似)维持(和链表类似)。

创建静态链表实例:

存储数据:{1,2,3}

在内存中开辟一块大小为6的空间,

再给数组中分配数据和游标:

在上图中,从 a[1] 存储的数据元素 1 开始,通过存储的游标变量 3,就可以在 a[3] 中找到元素 1 的直接后继元素 2;同样,通过元素 a[3] 存储的游标变量 5,可以在 a[5] 中找到元素 2 的直接后继元素 3,这样的循环过程直到某元素的游标变量为 0 截止(因为 a[0] 默认不存储数据元素)。

在静态链表的结点中分成数据域和游标两部分,根据游标可以找到下一个结点在数组中的存储位置。通常,静态链表会将第一个数据元素放到数组下标为 1 的位置(a[1])中。

静态链表的节点:

静态链表存储数据元素也需要自定义数据类型,至少需要包含以下 2 部分信息:

数据域:用于存储数据元素的值;

游标:其实就是数组下标,表示直接后继元素所在数组中的位置;

typedef struct {int data;//数据域int cur;//游标
}component;

备用链表:

静态链表中,除了数据本身通过游标组成的链表外,还需要有一条连接各个空闲位置的链表,称为备用链表。
备用链表的作用是回收数组中未使用或之前使用过(目前未使用)的存储空间,留待后期使用。也就是说,静态链表使用数组申请的物理空间中,存有两个链表,一条连接数据,另一条连接数组中未使用的空间。

通常,备用链表的表头位于数组下标为 0(a[0]) 的位置,而数据链表的表头位于数组下标为 1(a[1])的位置。

静态链表中设置备用链表的好处是,可以清楚地知道数组中是否有空闲位置,以便数据链表添加新数据时使用。比如,若静态链表中数组下标为 0 的位置上存有数据,则证明数组已满。

上图中,备用链表上连接的依次是 a[0]、a[2] 和 a[4],而数据链表上连接的依次是 a[1]、a[3] 和 a[5]。

创建静态链表:

(1)在数据链表未初始化之前,数组中所有位置都处于空闲状态,因此都应被链接在备用链表上,

当向静态链表中添加数据时,需提前从备用链表中摘除节点,以供新数据使用。

插入数据:

完整代码:

#include<stdio.h>
#define maxSize 6
//定义静态链表结点
typedef struct{int data;int cur;
}component;//创建备用链表
void reserveArr(component*array){for(int i=0;i<maxSize;i++){array[i].cur=i+1;array[i].data=-1;}array[maxSize-1].cur=0;//链表最后一个结点游标为0
}//提取分配空间
int mallocArr(component* array){//若备用链表非空则返回分配的结点的下标,否则返回0 (当分配最后一个结点时,该结点的游标值为 0)int i=array[0].cur;if(array[0].cur){array[0].cur=array[i].cur;}return i;
} //初始化静态链表
int initArr(component*array){reserveArr(array);int body=mallocArr(array);//声明一个变量,把它当指针使,指向链表的最后的一个结点,因为链表为空,所以和头结点重合int tempBody=body;for (int i=1; i<4; i++) {int j=mallocArr(array);//从备用链表中拿出空闲的分量array[tempBody].cur=j;//将申请的空闲分量链接在链表的最后一个结点后面array[j].data=i;//给新申请的分量的数据域初始化tempBody=j;//将指向链表最后一个结点的指针后移}array[tempBody].cur=0;//新的链表最后一个结点的指针设置为0return body;
} void displayArr(component * array,int body){int tempBody=body;//tempBody准备做遍历使用while (array[tempBody].cur) {printf("%d,%d ",array[tempBody].data,array[tempBody].cur);tempBody=array[tempBody].cur;}printf("%d,%d\n",array[tempBody].data,array[tempBody].cur);
}int main(){component array[maxSize];int body=initArr(array); printf("静态链表为:\n");displayArr(array, body);return 0;return 0;
}

输出结果:

数据结构-静态链表创建相关推荐

  1. 数据结构之链表创建一元多项式,求一元多项式之和

    数据结构之链表创建一元多项式,求一元多项式之和 前言 对于一元多项式,我们完全可以利用线性表P(a0,a1,a2,-,an)表示,这样的线性表在求两个多项式相加等操作时确实简单,但是多于如下的多项式: ...

  2. Scratch 与C语言实现数据结构静态链表的建立及操作

    Scratch 实现数据结构静态链表的建立及操作 scratch操作 Scratch 实现数据结构静态链表的建立及操作 数据结构 初始化静态链表 添加数据代码 删除数据 回收空闲节点操作代码 计算静态 ...

  3. 【数据结构--静态链表】

    文章目录 前言 一.静态链表的定义 结构描述 代码描述 二.静态链表的基本操作 初始化 打印链表 静态链表的插入 静态链表的删除 三.完整代码及运行截图 完整代码如下: 运行截图 四.闵版(略改) 前 ...

  4. 【C语言X数据结构】用静态链表实现的多项式计算器,加减乘除求导求值,输入输出样样在行!(完整代码+注释)

    目录 实验要求 完整代码 逻辑设计 哈喽各位好,我是李博轩,一个刚转到计算机的大二学生.这个标题是随手打上去的,感觉还蛮顺口,就这样了. 这个学期在学[数据结构与算法],而这是我面对的第一个实验题.因 ...

  5. C语言实现STL静态链表,先进后出的数据结构-栈 一

    1. 栈的概念 在开始前,请牢记这句话:栈是一种先进后出的数据结构. 栈(stack)是限定仅在表的一端进行操作的数据结构,请联系我们前文所学的,设想一个单链表我们只能够对其链表的表尾结点进行操作,而 ...

  6. 数据结构与算法(2-2)线性表之链式存储(单链表、静态链表、循环链表、双向循环链表)

    目录 一.单链表 1.存储方式 2.插入 3.删除 总代码: 二.静态链表 1.存储方式 2.插入 3.删除 4.遍历 总代码: 三.循环链表 总代码: 四.双向循环链表 1.存储方式: 2.插入和删 ...

  7. c语言 静态链表插入排序,数据结构C语言版 表插入排序

    西门豹治邺奇计 数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./* 数据结构C语言版 表插入排序 算法10.3 P267-P2 ...

  8. java静态链表_数据结构笔记:静态链表(C语言)

    void CreateList(StaticLinkList *P)//创建一个静态链表 { int i; for(i=0;i此时并没有已占用空间,所以第一个节点中的指针(cur)的值为1,也就是说空 ...

  9. 从C语言的角度重构数据结构系列(四)-静态链表动态链表

    前言 是否存在一种存储结构,可以融合顺序表和链表各自的优点,从而既能快速访问元素,又能快速增加或删除数据元素. 在这里给自己打个广告,需要的小伙伴请自行订阅. python快速学习实战应用系列课程 h ...

最新文章

  1. Java开发微信公众号(四)---微信服务器post消息体的接收及消息的处理
  2. 花30分钟,用Jenkins部署码云上的SpringBoot项目
  3. 手工做迷宫_好玩易上手的自然探索实验,春天必备,宅家就能带孩子做起来!...
  4. zynq无法识别sd卡_百度米尔携手推出FZ3深度学习计算卡!
  5. DataNode 运行状况
  6. Android修改Eclipse 中的Default debug keystore路径,以及修改android的AVD默认路径
  7. 6. memcache 机制的了解
  8. java课时,java学习笔记_课时一
  9. SpringBoot自动装配原理,这一篇就够了!
  10. C#提取字模[复制即用]
  11. 《淘宝技术这十年》之LAMP架构的网站
  12. Unity UI层级管理框架
  13. java读写excel,解决poi包中没有org.apache.poi.ss.usermodel.CellType的问题
  14. cad没有命令输入框_cad怎么调出命令栏(cad下面的命令行没有了,如何调出来?)...
  15. 和风天气更新数据失败原因分析
  16. 啊哈添柴挑战Java1611. 反向输出练习(难)
  17. 信息安全初学者容易犯的三个毛病
  18. 档案管理学川大972 | 专门档案专题
  19. Pta——谷歌的招聘
  20. 长尾分布,重尾分布(Heavy-tailed Distribution)

热门文章

  1. [渝粤教育] 四川工程职业技术学院 焊条电弧焊技术与操作 参考 资料
  2. 从指南针到动手搭建自己的第一台计算机
  3. 计算机未来想从事的职业作文,未来职业作文6篇
  4. 微信小程序做类似vue的级联选择功能,使用picker-view-column+checkbox-group完成
  5. cisco STP协议介绍
  6. 分布式共识算法——Paxos算法(图解)
  7. 【C语言冒泡排序、选择排序和快速排序】
  8. 把iphonebenchmark获取的数据存入MySQL数据库
  9. QT如何生成Release版本(得到exe运行DLL)
  10. 计算机发展趋势是容量越来越小,五个原因告诉您为什么c盘空间越来越小