小猪的数据结构学习笔记(四)

小猪的数据结构学习笔记(四)

线性表之静态链表

——转载请注明出处:coder-pig

本章引言:

在二,三中中我们分别学习了顺序表中的线性表与单链表,线性表有点类似于

我们前面所学的数组,而单链表使用的最多的是指针,这里问个简单的问题,

如果是在以前没有指针的话,前辈先人们怎么实现单链表呢?大家思考下!

没有指针,那么用什么来代替呢?前辈先人们非常机智,想出了使用下标+游标的方式

来实现单链表的效果!也就是今天要讲的——静态链表!

当然你也可以直接跳过本章,因为有了单链表就没有必要用静态链表了!

我们学习的是一些思维方式,当条件限制了你的时候,不允许你使用这种方式;

那么你如何用另一种方式去解决同样的问题呢?学多点东西没什么坏处的!

开始本章的讲解吧!

本章学习路线图:

正文:

什么是静态链表?

所谓的静态链表其实就是使用三个属性来表示一个节点,

数组下标:区分每个节点的标志

数据:存放该节点的数据

游标:类似于链表中的指针,指向下一个元素的下标

初始化静态链表:

流程:

step 1:使用for循环,为数组中的每个元素进行赋值

step 2:将最后一个节点的游标设置为0

step 3:返回ok即可

代码示例如下:

//初始化静态链表,和数组的初始化类似
Status InitList(StaticLinkList space)
{
	int i;
	for(i = 0;i < MAXSIZE - 1;i++)
	{
	//每个的游标指向下一个下标,第0个游标指向第1个下标节点
		space[i].cursor = i + 1;
	//最后一个节点需要节点的游标设置为0
		space[MAXSIZE - 1].cursor = 0;
		return OK;
	}
}

插入元素到静态链表

简单例子:

比如有一静态链表S,存储的数据依次为:{a,b,c,d,e,f},MAXSIZE = 20,现在想在第三个元素后面插入

一个元素,流程如下:

①定义一个方法获得一个备用结点,即开辟第七个结点,返回结点下标return 7;

②为该节点赋值S[7].cursor = e;

③接着修改第三个元素的游标,s[9].cursor = s[3].cursor;s[3].cursor = 9;

代码示例如下:

//获得备用链表的结点下标
int Get_Free(StaticLinkList space)
{
	int i = space[0].cursor;
	//设置下一个结点为备用结点
	if(space[0].cursor)space[0] = space[i].cursor;
	//返回新建结点的下标
	return i;
}	
//往静态链表的第i个位置插入数据元素
Status List_Insert(StaticLinkList L,int i,ElemType e)
{
	int j,k,l;
	k = MAXSIZE - 1;  //数组的最后一个元素
	//判断插入位置是否合法
	if(i < 1 || i > ListLength(L) + 1)
	{
		return ERROR;
	}

	//获取一个空白结点下标
	j = Get_Free(L);
	if(j)
	{
	//把e放到空白结点的数据域
		L[j].data = e;
		for(l = 1;l <= i - 1;l++)
		{
		//得到第i-1个元素的下标
		//不直接用K = L[K - 1].cursor是因为元素可能不是相邻的!
			k = L[k].cursor;
		}
		L[j].cursor = L[k].cursor;
		L[k].cursor = j;

		return OK;
	}
	return ERROR;
}	

删除静态链表中的元素:

删除的逻辑就稍微简单点了,

比如我们删除的是第5个元素,我们只需要S[4].curosr = S[5].cursor

让后将空闲结点释放掉,即

代码示例如下:

//删除某个节点
Status List_delete(StaticLinkList   L ,  int   i )
{
	//判断删除位置是否合法
    if(i < 1 || i > ListLength(L))return ERROR ;
    //获取最后一个节点,因为它的cursor指向第一个有效结点
	int k = MAX_SIZE - 1 ;
    for(int j = 1 ; j < i ; ++j)
    {
	    //获取第i - 1个元素的下标
		k = L[k].cursor   ;
	}

	 //得到第i个元素的下标
    j = L[K].cur ;
	//将删除节点的cursor赋值给前一个结点
    L[k].cur = L[j].cur ;
    //释放到第i个元素,下标为j
	Free_Node(L,j);
    return OK;
}
/*将下标为k的空闲结点回收到备用结点*/
void Free_Node(StaticLinkList space,int k)
{
	//将之前的备用链表的第一个结点下标存放到L[k]的cursor中
	space[k].cursor = space[0].cur;
	//下标为k的元素称为第一个空闲结点
	space[0].cursor = k;
}

获得静态链表的元素个数:

这个就是遍历一次表而已,当获取到的值为0时,说明已经到达空闲结点,此时返回长度!

代码示例如下:

/*获得L中数据元素的个数*/
int List_length(StaticLinkList L)
{
	int  j = 0;
	int i = L[MAX - 1].cursor;
	while(i)
	{
		i = L[i].cursor;
		j++;
	}
	return j;
}

静态链表特点总结:

从名字上就知道这是链表啦,肯定是有和单链表类似的特性的,比如插入删除不需要移动元素

只需修改游标;同时也失去了顺序存储结构的随机存取的特性,而且没有解决数组带来的表长

难以确定的问题!说到底就是给没有指针的编程语言提供一种链表功能的实现而已,有指针的

话肯定是直接用的单链表,不过这种方式十分巧妙,值得我们借鉴!

时间: 2024-12-27 12:47:34

小猪的数据结构学习笔记(四)的相关文章

小猪的数据结构学习笔记(二)

小猪的数据结构学习笔记(二) 线性表中的顺序表 本节引言: 在上个章节中,我们对数据结构与算法的相关概念进行了了解,知道数据结构的 逻辑结构与物理结构的区别,算法的特性以及设计要求;还学了如何去衡量一个算法 的好坏,以及时间复杂度的计算!在本节中我们将接触第一个数据结构--线性表; 而线性表有两种表现形式,分别是顺序表和链表;学好这一章很重要,是学习后面的基石; 这一节我们会重点学习下顺序表,在这里给大家一个忠告,学编程切忌眼高手低,看懂不代表自己 写得出来,给出的实现代码,自己要理解思路,自己

小猪的数据结构学习笔记(五)

小猪的数据结构学习笔记(五) 线性表之--循环链表                           --转载请注明出处:coder-pig 循环链表知识点归纳: 相关代码实现: ①判断是否为空表: ②单循环链表的存储结构 其实和单链表的结构是一样的! /*定义循环链表的存储结构*/ typedef struct Cir_List { int data; struct Cir_List *next; }Lnode; ③初始化循环单链表 代码如下: //1.循环链表的初始化 //表示一个元素,如

小猪的数据结构学习笔记(三)

小猪的数据结构学习笔记(三) 线性表之单链表 本章引言: 上一节中我们见识了第一个数据结构--线性表中的顺序表; 当你把操作的代码自己写几遍就会有点感觉了,如果现在让你写顺序表的 插入算法,你能够想出大概的代码么?如果可以,那么你就可以进入新的章节了; 否则,还是回头看看吧!在本节,我们将迎来线性表的链式表示--单链表 单链表和顺序表有什么优势和劣势呢?单链表的头插法和尾插法有什么不同呢? 请大家跟随笔者的脚步来解析线性表中的单链表把! 本节学习路线图 路线图解析: ①先要理解顺序表和单链表各自

NLTK学习笔记(四):自然语言处理的一些算法研究

自然语言处理中算法设计有两大部分:分而治之 和 转化 思想.一个是将大问题简化为小问题,另一个是将问题抽象化,向向已知转化.前者的例子:归并排序:后者的例子:判断相邻元素是否相同(与排序). 这次总结的自然语言中常用的一些基本算法,算是入个门了. 递归 使用递归速度上会受影响,但是便于理解算法深层嵌套对象.而一些函数式编程语言会将尾递归优化为迭代. 如果要计算n个词有多少种组合方式?按照阶乘定义:n! = n*(n-1)*...*1 def func(wordlist): length = le

Linux System Programming 学习笔记(四) 高级I/O

1. Scatter/Gather I/O a single system call  to  read or write data between single data stream and multiple buffers This type of I/O is so named because the data is scattered into or gathered from the given vector of buffers Scatter/Gather I/O 相比于 C标准

数据结构学习笔记(1)-数据结构与算法

基本概念和术语 1.数据  数据元素  数据对象   数据结构 数据:在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称. 数据元素:是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理. 数据对象:是性质相同的数据元素的集合.是数据的一个子集. 数据结构:是相互之间存在一种或多种特定关系的数据元素的集合. 2.数据结构 数据结构分为逻辑结构和物理结构 2.1逻辑结构 逻辑结构表示数据之间的相互关系.通常有四种基本结构: 集合:结构中的数据元素除了同属于一种类型外,别

Caliburn.Micro学习笔记(四)----IHandle&lt;T&gt;实现多语言功能

Caliburn.Micro学习笔记(四)----IHandle<T>实现多语言功能 说一下IHandle<T>实现多语言功能 因为Caliburn.Micro是基于MvvM的UI与codebehind分离, binding可以是双向的所以我们想动态的实现多语言切换很是方便今天我做一个小demo给大家提供一个思路 先看一下效果 点击英文  变成英文状态点chinese就会变成中文                          源码的下载地址在文章的最下边 多语言用的是资源文件建

代码管理工具 --- git的学习笔记四《重新整理git(1)》

1.创建版本库 mkdir  创建目录 cd  地址,到该地址下 pwd 显示当前目录 1.创建目录 $ mkdir startGit $ cd startGit $ pwd 显示当前目录 或者cd到桌面,然后再创建目录 2.初始化版本库 $ git init 初始化仓库 提示信息:Initialized empty Git repository in /Users/xingzai/Desktop/startGit/.git/ 建立一个空的git仓库在/Users/xingzai/Desktop

Linux学习笔记四:Linux的文件搜索命令

1.文件搜索命令  which 语法:which [命令名称] 范例:$which ls  列出ls命令所在目录 [[email protected] ~]$ which ls alias ls='ls --color=auto' /bin/ls 另外一个命令:whereis [名称名称],也可以列出命令所在目录. [[email protected] ~]$ whereis ls ls: /bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/ma