没有合适的资源?快使用搜索试试~ 我知道了~
数据结构中链表及常见操作.docx
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 15 浏览量
2023-04-01
19:23:07
上传
评论
收藏 95KB DOCX 举报
温馨提示
试读
11页
。
资源推荐
资源详情
资源评论
链表
1 定义
链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺
序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。
由于不必须按顺序存储,链表在插入的时候可以达到 O(1)的复杂度,比另一种线性表顺
序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而顺序表相应
的时间复杂度分别是 O(logn)和 O(1)。
使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用
计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链
表由于增加了结点的指针域,空间开销比较大。
在计算机科学中,链表作为一种基础的数据结构可以用来生成其它类型的数据结构。链
表通常由一连串节点组成,每个节点包含任意的实例数据(data fields)和一或两个用来指向
明上一个或下一个节点的位置的链接("links")。
链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆
体或磁盘上顺序,数据的访问往往要在不同的排列顺序中转换。而链表是一种自我指示数据
类型,因为它包含指向另一个相同类型的数据的指针(链接)。链表允许插入和移除表上任
意位置上的节点,但是不允许随机存取。链表有很多种不同的类型:单向链表,双向链表以
及循环链表。
2 结构
2.1 单向链表
链表中最简单的一种是单向链表,它包含两个域,一个信息域和一个指针域。这个链接
指向列表中的下一个节点,而最后一个节点则指向一个空值。
一个单向链表的节点被分成两个部分。第一个部分保存或者显示关于节点的信息,第二
个部分存储下一个节点的地址。单向链表只可向一个方向遍历。
链表最基本的结构是在每个节点保存数据和到下一个节点的地址,在最后一个节点保存
一个特殊的结束标记,另外在一个固定的位置保存指向第一个节点的指针,有的时候也会同
时储存指向最后一个节点的指针。一般查找一个节点的时候需要从第一个节点开始每次访问
下一个节点,一直访问到需要的位置。
2.2 双向链表
每个节点有两个连接:一个指向前一个节点,(当此“连接”为第一个“连接”时,指
向空值或者空列表);而另一个指向下一个节点,(当此“连接”为最后一个“连接”时,指
向空值或者空列表)
双向链表可以从任何一个节点访问前一个节点,当然也可以访问后一个节点,以至整个
链表。一般是在需要大批量的另外储存数据在链表中的位置的时候用。
2.3 循环链表
在一个循环链表中, 首节点和末节点被连接在一起。这种方式在单向和双向链表中皆可
实现。要转换一个循环链表,你开始于任意一个节点然后沿着列表的任一方向直到返回开始
的节点。指向整个列表的指针可以被称作访问指针。
循环链表中第一个节点之前就是最后一个节点,反之亦然。
3 链表常见用途
常用于组织删除、检索较少,而添加、遍历较多的数据。
4 链表和数组的区别
○
1 数组在内存中是逐个存放的,也就是说倘若数组的第一个元素在地址A,则数组第二
个元素就在地址 A+1。而链表则不是,链表每个节点没有相对固定的位置关系。某个节点在
地址 A 其后的节点不一定是 A+1,而在内存的其他空闲区域,呈现一种随机的状态。
○
2 数组一旦显式的被申明后,其大小就固定了,不能动态进行扩充。而链表则可以,
可以动态生成节点并且添加到已有的链表中。
○
3 链表灵活,但是空间和时间额外耗费较大;数组大小固定,元素位置固定,但是操
作不灵活,且容易浪费空间,但是时间耗费较小,尤其是元素变化不大的时候效率很高。双
向链表比单向的更灵活,但是空间耗费也更大。
○
4 从内存存储来看,(静态)数组从栈中分配空间, 对于程序员方便快速,但是自由度小;
链表从堆中分配空间, 自由度大但是申请管理比较麻烦。
附录 :( )
链表的部分常见操作
1 单向链表
/*
线性表的单链表存储结构
*/
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
带有头结点的单链表的基本操作 个
(12 )*/
/*
void InitList(LinkList *L)
{ /* 操作结果:构造一个空的线性表L */
*L=(LinkList)malloc(sizeof(struct LNode)); /* 产生头结点,并
使 指向此头结点
L
*/
(*L)->next=NULL; /* 指针域为空 */
}
void DestroyList(LinkList *L)
{ /* 初始條件:线性表L 已存在。操作结果:销毁线性表L */
LinkList q;
while(*L)
{q=(*L)->next;
free(*L);
*L=q;
void ClearList(LinkList L) /* 不改变L */
{ /* 初始条件:线性表L 已存在。操作结果:将L 重置为空表 */
LinkList p,q;
p=L->next; /* p 指向第一个结点 */
while(p) /* 没到表尾 */
{q=p->next;
free(p);
p=q;
}
L->next=NULL; /* 头结点指针域为空 */
}
Status ListEmpty(LinkList L)
{ /* 初始条件:线性表L 已存在。操作结果:若L 为空表,则返回TRUE,否则
返回
FALSE */
return L->next == NULL;
剩余10页未读,继续阅读
资源评论
若♡
- 粉丝: 6124
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功