- 1、本文档共40页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
本文档是精心选出来的精华文档,对您的生活和学习将有所帮助!
计算机软件技术基础
第4讲 基本数据结构及其运算
II 线性链表
本讲主要内容
第2章 基本数据结构及其运算
2.3 线性链表及其运算
2.3 线性链表及其运算
2.3.1 线性链表的基本概念
2.3.2 线性链表的基本运算
回顾:线性表在顺序存储下的插入运算
2.3.1 线性链表的基本概念
逻辑上有次序排列之数据结构称为线性表(List),如一年四季,数字0~9。
线性表的顺序存储结构的优点和缺点:
优点:简单、运算方便,适用于规模不大的、长度固定的、较少进行插入、删除运算的线性表。
缺点:
插入删除运算需要移动大量数据元素
存储空间不便于扩充( “上溢出”)
存储空间不便于动态分配
对于元素变动频繁的大线性表,采用链式存储结构更为适宜。
基本概念:链式存储结构
线性链表:链式存储结构的线性表称为线性链表。
在链式存储结构中,每个数据结点由两部分组成:
数据域:存放数据元素值
指针域:存放指向前件或后件的指针。
链式存储的线性表各元素在内存之位置是不连续、随机(Random)的。它是由动态内存分配节点(Node)串接而成。 (相形之下,数组是一种顺序存放的结构)。
链式存储结构的特点
存储空间可以不连续
存储顺序与逻辑顺序可以不一致
逻辑关系由指针域来确定
既可用于表示线性结构,也可用于表示非线性结构
线性链表的实现
在程序设计语言中,线性链表的存储空间可以用两个同样大小、数据类型不同的一维数组表示,一个表示 数据域,一个表示指针域。
也可以采用一个结构体类型的一维数组来表示。
struct 结构体名 {
数据成员表;
struct 结构体名 *指针
}
在线性链表中,有一个专门的指针HEAD指向线性链表的第一个元素结点,称为头指针。
线性链表的最后一个元素没有后件,指针域为空(用NULL或0表示)。
当HEAD=NULL(或0)时称为空表。
线性链表各结点值的访问
对于线性链表,可以从头指针开始,沿着各结点的指针扫描到链表的所有结点。
线性链表不能按照下标访问数据元素,只能使用顺序查找
链表结点结构的定义
struct 结构体名
{
数据成员表;
struct 结构体名 *指针
}
struct node
{
//数据域
char name[10];
char sex;
//指针域
struct node *next;
}
存储空间的动态分配
main()
{
struct node *p;//定义指针变量p
//申请分配结点存储空间
p=(struct node *)malloc(sizeof(struct node));
…
…
free(p);//释放结点存储空间
}
C程序演示:线性表的建立
建立一个线性链表
从键盘输入各元素的值(正整数,以输入非正整数为结束标志)
然后依次输出线性链表中的各个元素的值。
C程序演示:线性表的建立
#include stdlib.h
#include stdio.h
struct node { //定义结点类型
int d;
struct node *next;
};
int main()
{ int x;
struct node *head, *s, *r;
head=NULL; //置链表空
s=NULL;
scanf(%d, x);//输入正整数
while(x0) { //若输入值大于
s=(struct node *)malloc(sizeof(struct node));//申请内存
s-d=x;
s-next=NULL; //置当前结点的数据域和指针域
if(head==NULL)
head=s;//若链表空,则将头指针指向当前结点s
else
r-next=s;//将当前结点链接在最后
r=s;//链表最后结点置为当前结点s
scanf(%d, x);
}
s=head; //从链表第一个结点开始
while(s!=NULL){
printf(%d, s-d); //打印当前结点中的数据
s=s-next;
}
printf(\n);
return 0;
}
2.3.2 线性链表的基本运算
在线性链表中包含指定元素的结点之前,插入一个新元素。
在线性链表中删除包含指定元素的结点。
将两个线性链表按要求合并成一个线性链表。
将一个线性链表按要求进行分解。
逆转线性链表。
复制线性链表。
线性链表的排序。
线性链表的查找。
1.在线性链表中查找
文档评论(0)