java静态链表_数据结构笔记:静态链表(C语言)
void CreateList(StaticLinkList *P)//创建一个静态链表
{
int i;
for(i=0;i此时并没有已占用空间,所以第一个节点中的指针(cur)的值为1,也就是说空闲空间的起始位置为1(下标为的1也是数组的第二个元素);而最后一个节点的指针的值为0,因为此时并没有以占用的空间,最后一个节点类似于动态链表中的头结点,当链表为空的时候就指向NULL(在这里指向0),所以当头结点中的指针等于0时代表链表为空。
可以在最初的时候给链表赋值。
void InitList(StaticLinkList *P)
{
int n,i;
printf("请输入链表的长度:");
scanf("%d",&n);
for(i=1;i<=n;i++)//从下标1开始输入内容
{
printf("请输入数据:");
scanf("%d",&P[i].data);
P[0].cur = P[i].cur;//0位置记录下一个空闲位置下标
}
P[i-1].cur = 0;
P[MAXSIZE-1].cur = 1;//记录链表第一个元素的下标
}
最后一个存放数据的cur为0;
3.如何模拟申请空间,插入节点。
由于第一个节点中的指针用来保存空闲空间的起始地址,所以只要修改第一个元素的cur即可。
int Malloc_List(StaticLinkList *P)//模拟创建节点,返回的是节点的下标
{
int i;
i = P[0].cur;
P[0].cur = P[i].cur;
return i;
}
先将空闲空间的位置赋值给i,然后再将i中保存的下一个位置赋值给第一个元素。
例如图中:想要申请到位置7的空间,先修改第一个的数值,将其改为位置7中记录的数值(也就是8),那么位置7就相当于不在空闲空间中了,而且因为第一个节点中保存的是8,也就是说空闲空间的起始位置就是8了。
如果想将位置7插入到“乙”和“丁”之间的话,需要修改两个地方。1.由于“乙”中保存的是下一个元素的位置,那么需要将“乙”中下一个元素的位置修改为7,这样在“乙”结束后会找下一个元素时就会在位置7上面找。2.由于位置7中保存的是下一个元素的位置,那么需要将其修改为3(也就是“丁”的下标),这样在找完位置7之后就是位置3了。
插入的方式可以如下:
void ListInsert(StaticLinkList *P)//插入链表
{
int k,n,i,j;
printf("请输入插入的位置:");
scanf("%d",&n);
if(n<1 || n>P[0].cur)
{
printf("插入位置异常,插入失败!\n");
return ;
}
if(ListLength(P) == MAXSIZE-1)//如果链表满了
{
printf("静态链表已满,插入失败!\n");
return ;
}
k = MAXSIZE-1;
j = Malloc_List(P);
for(i=1;i
4.如何模拟释放空间,删除节点。
同理,既然第一个节点保存的是空闲空间的起始位置,那么修改第一个节点中的cur值即可。
void FreeList(StaticLinkList *P,int k)//模拟释放节点
{
P[k].cur = P[0].cur;
P[0].cur = k;
}
将需要释放的位置k传入进来,让空闲空间的起始位置为该释放的位置(也就是k),并且将k的下一个节点的值设置为刚才的起始位置,这样就将空闲空间的位置连接起来,并且需要修改相应位置上的cur,让其连接起来。
如下图要释放位置1上的空间。
修改前:
修改后:
例如上图,将位置1的空间释放,先让空闲空间的起始位置为1,并且让位置1的下一个位置为8,所以空闲空间也就连起来了,1——8——9——10..,....(原先是:8——9——10........);而且需要修改删除位置前的cur,使其能够找到下一个元素,在这里由于删除的是第一个元素,所以需要修改头结点(最后一个元素)的cur,原来是1,将其改为原先位置1中的cur(cur保存的是下一个节点的位置,1中原先保存的是2),那么查找顺序就会是2——7——3——...(原先是1——2——7——3——...)。
删除的方式可以如下:
void DeleteList(StaticLinkList *P)//删除节点
{
int n,i,k,j;
printf("请输入删除的位置:");
scanf("%d",&n);
if(n<1 || n>ListLength(P))
{
printf("删除的位置异常,删除失败!\n");
return ;
}
k = MAXSIZE-1;
for(i=1;i
5.如何遍历链表。
因为最后一个元素相当于头结点,并且其中保存的是链表第一个元素的位置,所以应该从头结点开始遍历,然后根据每个节点中的cur的值找到下一个节点的位置。
遍历代码可以如下:
void OutputList(const StaticLinkList *P)//输出链表
{
int i,k;
k = MAXSIZE-1;
for(i=1;i<=ListLength(P);i++)
{
k = P[k].cur;
printf("%d\n",P[k].data);
}
}
例:如遍历以下图中的数据的话。
k最先等于999;链表长度为6(甲乙丁戊己庚)。
依次遍历的话,i的值从1开始到6结束公六次循环。
k的值依次为;1 2 3 4 5 6.每次根据k的值将其数据输出即可。
整体代码可以如下:
#include
#define MAXSIZE 1000
typedef int Elem;
typedef struct
{
Elem data;
int cur;
}StaticLinkList;
void CreateList(StaticLinkList *P)//创建一个静态链表
{
int i;
for(i=0;iP[0].cur-1)
{
printf("查找位置异常,查找失败!\n");
return ;
}
k = P[MAXSIZE-1].cur;
for(i=1;iP[0].cur)
{
printf("插入位置异常,插入失败!\n");
return ;
}
if(ListLength(P) == MAXSIZE-1)//如果链表满了
{
printf("静态链表已满,插入失败!\n");
return ;
}
k = MAXSIZE-1;
j = Malloc_List(P);
for(i=1;iListLength(P))
{
printf("删除的位置异常,删除失败!\n");
return ;
}
k = MAXSIZE-1;
for(i=1;i
java静态链表_数据结构笔记:静态链表(C语言)相关推荐
- python中链表和数组_数据结构笔记(一):数组、链表|python基础教程|python入门|python教程...
https://www.xin3721.com/eschool/pythonxin3721/ (一)数组 数组(Array)是一种线性表数据结构.它用一组连续的内存空间,来存储一组具有相同类型的数据. ...
- python顺序表的实现_数据结构:队列 链表,顺序表和循环顺序表实现(python版)...
链表实现队列: 尾部 添加数据,效率为0(1) 头部 元素的删除和查看,效率也为0(1) 顺序表实现队列: 头部 添加数据,效率为0(n) 尾部 元素的删除和查看,效率也为0(1) 循环顺序表实现队列 ...
- php mysql 链表_浅谈PHP链表数据结构(单链表)
链表:是一个有序的列表,但是它在内存中是分散存储的,使用链表可以解决类似约瑟夫问题,排序问题,搜索问题,广义表 单向链表,双向链表,环形链表 PHP的底层是C,当一个程序运行时,内存分成五个区(堆区, ...
- java 跳表_数据结构跳表学习并用Java实现
前面学习很多类的源码过程中,底层基本都是数组和链表,今天学习第三种结构跳表(SkipList). 跳表解决的问题 一个有序的数组如果我们要判断一个数据是否存在可以通过二分查找法非常快速的判断出来,但是 ...
- python链表_使用python实现链表操作
一.概念梳理 链表是计算机科学里面应用应用最广泛的数据结构之一.它是最简单的数据结构之一,同时也是比较高阶的数据结构(例如棧.环形缓冲和队列) 简单的说,一个列表就是单数据通过索引集合在一起.在C里面 ...
- python数据结构之链表_Python数据结构之翻转链表
翻转一个链表 样例:给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null 一种比较简单的方法是用"摘除法".就是 ...
- 数据结构中单链表的存储c语言,单链表一 - 数据结构与算法教程 - C语言网
1. 单链表概念&设计 单链表是一种链式存取的数据结构,,链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指 ...
- python思想读后感_数据结构与算法:Python语言描述读后感1000字
<数据结构与算法:Python语言描述>是一本由裘宗燕著作,机械工业出版社出版的平装图书,本书定价:CNY 45.00,页数:343,特精心从网络上整理的一些读者的读后感,希望对大家能有帮 ...
- python中栈的描述是_数据结构与算法:Python语言描述 栈和队列.ppt
数据结构与算法:Python语言描述 栈和队列 迷宫问题 迷宫问题的特点: 存在一集可能位置,一些位置相互连通,一步可达 一个位置可能连通若干位置,出现向前探查的多种可能(有分支) 目标是找到一条路径 ...
最新文章
- pythongui界面实例带注释_python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例...
- ESXi6.7安装流程和bug处理
- 智能车竞赛云端比赛第三天:一场在家具建材广场中的智能车比赛
- sed 命令自己总结
- 友盟2015年Q2、Q3中国移动互联网趋势报告
- Linux CentOS服务启动
- GCD LCM UVA - 11388 (思维。。水题)
- Android官方开发文档Training系列课程中文版:打印内容之图像打印
- 解决idea的html代码中使用es6语法报错的问题
- 数据分析之pandas-profiling
- java类的生命周期
- docker学习系列:设置阿里云容器加速器
- 怎样在计算机查汉字,推荐一种集汉字识字、查字、计算机输入于一体的规范汉字字形输入法—郑码(之二)...
- 机器学习之手写字体(digits)识别——利用sklearn实现
- 什么?朋友圈出现了叠中叠?教你三招轻松应对朋友圈折叠
- 7-Zip压缩包如何删除密码
- 《灵飞经5·龙生九子》第二十三章 力压须眉(下)
- 数字电子技术实验作业(1)西科大
- google chrome设置音频录音功能
- 项目五 基于stc89c52系列单片机环境温湿度检测控制
热门文章
- R语言ggplot2可视化使用ggridges包可视化山脊图(Ridgeline Plots):山脊图(Ridgeline Plots)应用场景、受试者口服茶碱的之后观察茶碱的浓度变化的山脊图
- Python将classification_report的结论转化为字典(dict)形式并提取模型的灵敏度(sensitivity)、特异度(specificity)、PPV和NPV指标、混淆矩阵图
- 机器学习数据预处理之离群值/异常值:图像对比法
- python使用imbalanced-learn的CondensedNearestNeighbour方法进行下采样处理数据不平衡问题
- R回归模型输出结果详细解读:summary、call、residuals、Coefficients、Assessing Model Fit
- 使用KNN模型进行多输出分类实战(Multioutput Classification)
- Linux grep 命令
- html5 div 鼠标跟随,CSS实用:DIV+CSS打造跟随鼠标的层
- 基于多源信息的深度卷积神经网络预测CircRNA疾病关联的有效方法
- numpy 数组 维度 大小 形状