数据结构(二) -- 数组和链表 (2)

数组的内存结构是线性的,通过这个例子的实现也更加容易理解。数组是一种常用的也是固定内存排序线性结构。然而在很多情况下是数据在内存中并不会这样线性的去排布。

虽说C语言是面向过程的语言,事实上这只是一种表象,学了数据结构其实我们可以发现我们完全可以用 C语言 实现面向对象语言的特性。事实上几乎所有的操作系统内核、机器语言底层、编译器层面都是使用 C语言 来实现的。

链表

链表是一种元素内存空间离散排列的线性数据结构。它的内存存储示意图大致如下:

数据结构(二) -- 数组和链表

 

链表是整个数据结构的一个基础,后面的线性结构几乎都需用到链表的知识,下面就从这几个方面来介绍链表。

定义

分类

算法

优缺点

【链表定义/特点】
n个节点离散分配
彼此通过指针相连
每个节点只有一个前驱节点,每个节点只有一个后续节点
首节点没有前驱节点,尾节点没有后续节点

首节点:
第一个有效节点

尾节点:
最后一个有效节点

头结点:
第一个有效节点前面的那个节点,头结点并不存放有效数据,加头结点的目的主要是为了方便对链表的操作,头结点的数据类型和首节点一样

头指针:
指向头结点的指针变量

尾指针:
指向尾节点的指针变量

确定一个链表需要的最少的参数有哪些?
根据链表的示意图可以简单推出来所有该链表的信息。
实际上只需要一个关键信息:头指针
因为我们通过头指针就可以推算出链表的其他所有信息。

【节点的表示】

数据结构(二) -- 数组和链表

 

// 代码的表示如下 typedef struct Node{ int data; //数据域 struct Node *pNext; // 指针域 - 指向相同类型的下一个节点 }*PNODE,NODE; // PNODE 等价于 struct Node * , NODE 等价于 struct Node 【只需要拿到 pNext 指针就能推算出整个链表】

【链表的分类】
链表可以分为如下类别:

单链表 -- 上面的实例

双链表 -- 每个节点有两个指针域,分别指向前后两个节点

数据结构(二) -- 数组和链表

 

循环链表 -- 能通过任何一个节点找到其他所有节点的链表,环形链表

非循环链表 -- 非环形普通列表

【关于链表的常见算法】

常见算法有:

创建链表

遍历

查找

清空

销毁

求长度

排序

删除节点

插入节点

·····

下面就逐步讲一下各个算法的思路,用为算法的方式来帮助理解

1 创建链表

创建链表,首先需要确定链表的长度 int length 然后根据长度创建对应个数的节点,并把新创建的节点挂到链表的最后。简单来说就是:

1 创建头结点
2 循环创建新节点挂到链表尾部

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpysgp.html