链表list(链式存储结构实现)_5 线性表的链式存储结构
系列文章参考资料为《大话数据结构》,源码为个人私有,未经允许不得转载
线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,可以使连续的,也可以不连续,也就意味这些元素可以存在内存未被占用的任意位置
链式结构中,除了要存储元素信息外(数据域),还要存储它的后继元素的存储地址(指针域),这两部分信息组成的数据元素称为结点(Node)
链表的每个结点只包含一个指针域叫做单链表,特点是每个结点的指针域将线性表的数据元素按其逻辑次序链接在一起
其中第一个结点位置叫做头指针,线性链表的最后一个结点指针为空(NULL)
为了方便对链表的操作,会在单链表的第一个结点前附设一个结点,称为头结点,头结点可以不存储任何信息,也可以存储线性表的长度等信息,头结点的指针域指向第一个结点的指针
更加方便的存储示意图表示单链表
单链表可以用结构指针描述
typedef struct Node
{ElemType data;struct Node *next;
}Node;
typedef struct Node *LinkList; /* 定义LinkList */
单链表的读取
获得链表第i个数据的算法思路
代码实现:(主要思想就是“工作指针后移”)
/* 初始条件:链式线性表L已存在,1≤i≤ListLength(L) */
/* 操作结果:用e返回L中第i个数据元素的值 */
Status GetElem(LinkList L,int i,ElemType *e)
{int j;LinkList p; /* 声明一结点p */p = L->next; /* 让p指向链表L的第一个结点 */j = 1; /* j为计数器 */while (p && j<i) /* p不为空或者计数器j还没有等于i时,循环继续 */{ p = p->next; /* 让p指向下一个结点 */++j;}if ( !p || j>i ) return ERROR; /* 第i个元素不存在 */*e = p->data; /* 取第i个元素的数据 */return OK;
}
上述步骤比单链表麻烦很多,不过有利有弊,下边看下插入和删除
单链表的插入
单链表的插入不需要惊动其他结点,只需要s->next=p->next , p->next=s,原理如下图
结果就是下边这样
插入的算法思想:
代码实现:
/* 初始条件:链式线性表L已存在,1≤i≤ListLength(L), */
/* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */
Status ListInsert(LinkList *L,int i,ElemType e)
{ int j;LinkList p,s;p = *L; j = 1;while (p && j < i) /* 寻找第i个结点 */{p = p->next;++j;} if (!p || j > i) return ERROR; /* 第i个元素不存在 */s = (LinkList)malloc(sizeof(Node)); /* 生成新结点(C语言标准函数) */s->data = e; s->next = p->next; /* 将p的后继结点赋值给s的后继 */p->next = s; /* 将s赋值给p的后继 */return OK;
}
单链表的删除
同插入类似,删除就是烧过删除的结点
算法思路
代码实现
/* 初始条件:链式线性表L已存在,1≤i≤ListLength(L) */
/* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */
Status ListDelete(LinkList *L,int i,ElemType *e)
{ int j;LinkList p,q;p = *L;j = 1;while (p->next && j < i) /* 遍历寻找第i个元素 */{p = p->next;++j;}if (!(p->next) || j > i) return ERROR; /* 第i个元素不存在 */q = p->next;p->next = q->next; /* 将q的后继赋值给p的后继 */*e = q->data; /* 将q结点中的数据给e */free(q); /* 让系统回收此结点,释放内存 */return OK;
}
结合插入和删除操作,对于频繁的操作,单链表的效率优势明显
--------------------------------------------------------END-----------------------------------------------------------
电子书及源码点击下载
链表list(链式存储结构实现)_5 线性表的链式存储结构相关推荐
- java建立线性表的链式结构,数据结构学习----线性表的链式表示(Java实现)
线性表接口LList: package com.clarck.datastructure.linked; /** * 线性表接口LList,描述线性表抽象数据类型,泛型参数T表示数据元素的数据类型 * ...
- 《数据结构》c语言版学习笔记——单链表结构(线性表的链式存储结构Part1)
线性表的链式存储结构 数据结构系列文章 第二章 单链表结构 文章目录 线性表的链式存储结构 前言 一.单链表的建立 代码 二.单链表的读取 代码 三.单链表的插入 代码 四.单链表的删除 代码 五.单 ...
- 五、【线性表】线性表的链式表示和实现
线性表的链式表示和实现 上节提到,由于顺序表的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素.然而,这也导致了顺序表在执行插入或删除操作时,需要移动大量元素.本节来讨论 ...
- 《数据结构》c语言版学习笔记——其他链表(线性表的链式存储结构Part2)
线性表的链式存储结构 数据结构系列文章 第三章 循环链表.双向链表 文章目录 线性表的链式存储结构 前言 一.循环链表 (一)定义 (二)尾指针 二.双向链表 (一)定义 (二)代码 总结 前言 提示 ...
- 线性表的链式存储结构以及单链表的插入和删除原理实现
线性表的链式存储结构 线性表中的每个元素最多只有一个前驱元素和一个后继元素(其逻辑结构),因此可以采用链式存储结构存储. 链表 线性表的链式存储结构称为链表.在链表中每个结点不仅包含有元素本身的信息( ...
- 线性表的链式存储结构及代码实现(单链表,双链表,循环链表)
在上一篇博文中介绍了线性表的顺序存储方式,它最大的缺点就是在插入和删除操作时会移动大量的元素,这显然会耗费很多时间.后来人们便想到了用链式存储方式来解决上面这一问题.链式存储线性表时,不需要使用地 ...
- 数据结构和算法:(3)3.2线性表的链式存储结构
线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素也就是说你这个可以放在A地点,这个可以放在E地点,A地点和E地点中间可以隔开一个C地点和D地点,这样是允许的),这组存储单元可以存在 ...
- 从零开始学数据结构和算法(二)线性表的链式存储结构
链表 链式存储结构 定义 线性表的链式存储结构的特点是用一组任意的存储单元的存储线性表的数据元素,这组存储单元是可以连续的,也可以是不连续的. 种类 结构图 单链表 应用:MessageQueue 插 ...
- 【数据结构】线性表的链式存储-单链表
单链表的定义 线性表的链式存储又称为单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素. 为了建立起数据元素之间的线性关系,对每个链表结点,除了存放元素自身的信息之外,还需要存放一个指向其后 ...
最新文章
- 《用广义CNOT门产生质数幂维的图态》
- Django在admin.py中设置date_hierarchy时报错
- Fiori GM4取metadata 从http自动重定向到https原因
- HDU 4035 Maze
- Spring Boot 入门 IDEA 版本 2小时学会springBoot 代码上传至gitee 或者github 事务没做出来
- 程序员笔试面试后上机_hcie面试有哪些要注意的事项?
- (转)Hibernate框架基础——映射普通属性
- 江苏大学c语言程序设计,江苏大学201级C语言课程设计要求及题目.doc
- mysql数据库电脑配置_教你怎样正确配置MySQL数据库SQL Mail -电脑资料
- IDES SAP SEM 4.0/SAP BW 3.50 笔记本安装手册
- 你可能不知道的 AS 小技巧之「Extract Resource」
- openwrt udp服务器_开启tftp服务器 tftp服务器的含义
- 两年后,中国CF又站在了世界之巅
- python开源怎么盈利_弄清楚Python最火的开源项目,你就掌握了商机
- 计算机为何会自动开机,电脑自动开机是怎么回事 电脑自动开机解决方法
- G - 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
- EasyExcel导出添加水印
- OFDM峰均比抑制matlab,一种降低OFDM峰均比的解决方法
- 兼容性测试 Testin 初体验
- c语言打印顺时针循环方阵,顺时针打印矩阵(C语言代码)
热门文章
- CVPR 2020 | 基于多智能体RL实现多轮连续交互,IteR-MRL使图像分割算法达到医用标准...
- 彻底理解 Cookie,Session,Token
- TensorFlow之张量
- 2021.5.13指导论文
- python爬虫执行scrapy crawl demo出现: import win32api ModuleNotFoundError: No module named 'win32api'错误
- 传统CV和深度学习方法的比较
- 【OpenCV 4开发详解】直方图应用
- 1、交换机ARP缓存表分析
- ijkplayer-丢帧策略深入分析
- JavaScript 复制对象与Object.assign方法无法实现深复制