程序员“修炼成神”的必经之路——数据结构(第2章 线性表)

Posted 猿力满满

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序员“修炼成神”的必经之路——数据结构(第2章 线性表)相关的知识,希望对你有一定的参考价值。

目录


前言

       今天我们来学习数据结构的第2章——线性表。线性表是最简单和最常用的一种数据结构,所以这一章是数据结构当中的重点内容,小伙伴们一定要熟练掌握!本文主要介绍基本概念,算法和代码实现不过多赘述。


一、线性表的定义和基本运算

1.线性表的逻辑定义

    1)线性表的定义

        线性表是由  个数据元素(结点) 组成的有限序列。其中,数据元素的个数  为表的长度。当  为零时称为空表。

    2)线性表的逻辑特征

        对于一个非空的线性表

        ① 有且仅有一个称为开始元素的 ,它没有前趋,仅有一个直接后继 

        ② 有且仅有一个称为终端元素的 ,它没有后继,仅有一个直接前趋;

        ③ 其余元素 称为内部元素,它们都有且仅有一个直接前趋  和一个直接后继 

2.线性表的基本运算

(1)置空表 InitList(L),构造一个空的线性表 L。

(2)求表长 ListLength(L),返回线性表 L 中元素个数,即表长。

(3)取表中第  个元素 GetNode(L,i),若1ListLength(L),则返回第  个元素 

(4)按值查找 LocateNode(L,x),在表 L 中查找第一个值为  的元素,并返回该元素在表 L 中的位置,若表中没有元素的值为 ,则返回 0 值。

(5)插入InsertList(L,i,x),在表 L 的第  个元素之前插入一个值为  的新元素,表 L 的长度加1。

(6)删除DeleteList(L,i),删除表 L 的第  个元素,表 L 的长度减1。


二、线性表的顺序存储和基本运算

1.线性表的顺序存储

       线性表的顺序存储指的是将线性表的数据元素按其逻辑次序依次存入一组地址连续的存储单元里,用这种方法存储的线性表称为顺序表。顺序表是一种随机存取结构。

2.顺序表上的基本运算

    1)插入运算

        线性表的插入运算是指在线性表的第 -1 个元素和第  个元素之间插入一个新元素 ,使长度为  的线性表:

()

        变为长度为 +1 的线性表:

()

        插入是向后移动元素。

    2)删除运算

       线性表的删除运算是指将表中第  个元素删除,使长度为  的线性表

()

变为长度为 -1 的线性表:

()

        删除是向前移动元素。


三、线性表的链式存储结构

1.单链表(线性链表)

       链式存储结构除了存储  本身的信息之外,还需要一个存储指示其后继元素  存储位置的指针,由这两个部分组成元素  的存储映像通常称为结点。它包括两个域:存储数据元素的域称为数据域,存储直接后继存储地址的域称为指针域。用这种方法存储的线性表称为链表

        个结点链成一个链表,即为线性表()的链式存储结构。由于这种链表的每个结点只包含一个指针域,因此又称为单链表

2.单链表上的基本运算

    1)建立单链表

       建立单链表的常用方法有两种:头插法尾插法

       ① 头插法建表

       头插法建表是从一个空表开始,重复读入数据,生成新结点,将读入的数据存放到新结点的数据域中,然后将新结点插入到当前链表的表头上,直到读入结束标志为止。

       ② 尾插法建表

       尾插法是将新结点插入在当前链表的表尾上,因此需要增设一个尾指针 rear,使其始终指向链表的尾结点。

    2)查找运算(带头结点)

       ① 按结点序号查找

       在单链表中要查找第  个结点,就必须从链表的第1个结点(开始结点,序号为1)开始,序号为 0 的是头结点,p 指向当前结点,j 为计数器,其初始值为1,当 p 扫描下一个结点时,计数器加1。当 j= 时,指针 p 所指向的结点就是要找的结点。

       ② 按结点值查找

       在单链表中按值查找结点,就是从链表的开始结点出发,顺链逐个将结点的值和给定值 k 进行比较,若遇到相等的值,则返回该结点的存储位置,否则返回 NULL。

    3)插入运算

       链表插入时不需要移动结点,但需要用移动指针来进行位置查找。

    4)删除运算 

       链表删除和插入同理,不需要移动结点,但需要移动指针。

3.循环链表

       循环链表的特点是单链表中最后一个结点(终端结点)的指针域不为空,而是指向链表的头结点,使整个链表构成一个环。

4.双向链表

       双向链表的特点是在单链表的结点类型中增加一个指向其直接前趋的指针域。这样形成的链表中就有两条不同方向的链。因此称之为双向链表。


四、顺序表和链表的比较

       顺序表可以随机存取表中任一元素,插入和删除操作时需移动大量元素。链表插入和删除不用大量移动元素,但失去了随机访问的特点。

1.时间性能

       顺序表查询快,增删慢;链表查询慢,增删快。

       在实际问题中,若经常对线性表进行查找操作,则以顺序表存储为宜。若经常对线性表进行插入和删除操作,则以链表存储为宜。

2.空间性能

       顺序表的存储空间是静态分配的,设置过大将产生空间浪费,设置过小会使空间溢出,因此顺序存储结构适合对数据量大小能事先知道的应用问题

       而链表的存储空间是动态分配的,只要内存有空闲空间,就不会产生溢出,因此链式存储结构适合数据量变化较大的动态问题


ps:博主创作不易,如果喜欢就点个赞吧!ღ( ´・ᴗ・` )比心

以上是关于程序员“修炼成神”的必经之路——数据结构(第2章 线性表)的主要内容,如果未能解决你的问题,请参考以下文章

程序员“修炼成神”的必经之路——数据结构(第2章 线性表)

程序员“修炼成神”的必经之路——数据结构(第4章 多维数组和广义表)

[架构之路-24]:目标系统 - 系统软件 - C语言的结构与程序的工作原理 - 程序控制函数调用栈函数调用性能优化

[架构之路-21]:目标系统 - 系统软件 - 计算机系统架构计算机指令系统结构化程序与分层编程。

[架构之路-23]:目标系统 - 系统软件 - C语言的结构与程序的工作原理 - 数据类型与数据定义(待续)

[架构之路-45]:目标系统 - 系统软件 - Linux OS硬件设备驱动-网络驱动程序模型网络数据包的收发流程