计算机软件技术编程基础 链表.ppt
《计算机软件技术编程基础 链表.ppt》由会员分享,可在线阅读,更多相关《计算机软件技术编程基础 链表.ppt(43页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、顺序表的 特点:运算:简单,时间复杂度好存储特性:静态规模,编译前确定问题:程序的通用性和空间利用率之间的矛盾期望:在实际运行过程中,根据实际问题的需要临时确定存储空间,涉及到动态变量动态变量:在程序运行的过程中产生和释放的变量。与之相反的是静态变量静态变量:在程序运行的过程中一直存在的变量。静态变量是出现在说明语句中的变量;动态变量由于是在运行中产生的,因而不会事先说明如何实现动态变量?通过指针来实现:指针变量的说明,动态变量的产生和释放。2.3 线性链表及其运算线性链表及其运算线性表的链式存储结构称为线性链表,即将表中元素用线性表的链式存储结构称为线性链表,即将表中元素用链地址连接起来。链
2、地址连接起来。head头指针结点对线性表中的每一个数据元素,都需用两部分来存储:一部分用对线性表中的每一个数据元素,都需用两部分来存储:一部分用于存放数据元素值,称为数据域;另一部分用于存放直接前驱或于存放数据元素值,称为数据域;另一部分用于存放直接前驱或直接后继结点的地址(指针),称为指针域,称这种存储单元为直接后继结点的地址(指针),称为指针域,称这种存储单元为结点。结点。链表的存储结构 链式存储结构是利用任意的存储单元来存放线性表中的元素,存链式存储结构是利用任意的存储单元来存放线性表中的元素,存储数据的单元在内存中可以连续,也可以零散分布。储数据的单元在内存中可以连续,也可以零散分布。
3、由于线性表中各元素间存在着线性关系,每一个元素有一个直接由于线性表中各元素间存在着线性关系,每一个元素有一个直接前驱和一个直接后继。为了表示元素间的这种线性关系,在这种结前驱和一个直接后继。为了表示元素间的这种线性关系,在这种结构中不仅要存储线性表中的元素,还要存储表示元素之间逻辑关系构中不仅要存储线性表中的元素,还要存储表示元素之间逻辑关系的信息。所以用链式存储结构表示线性表中的一个元素时至少需要的信息。所以用链式存储结构表示线性表中的一个元素时至少需要两部分信息,除了存储每一个数据元素值以外,还需存储其后继或两部分信息,除了存储每一个数据元素值以外,还需存储其后继或前驱元素所在内存的地址。
4、两部分信息一起构成链表中的一个结点。前驱元素所在内存的地址。两部分信息一起构成链表中的一个结点。结点的结构如下所示。结点的结构如下所示。链表结构示意图链表结构示意图 从图中可见,每个结点的存储地址存放在直接前驱的指针域中。从图中可见,每个结点的存储地址存放在直接前驱的指针域中。所以要访问链表中数据元素所以要访问链表中数据元素C,必须由头指针必须由头指针head得到第一个结点得到第一个结点(数据(数据A)的地址,由该结点的指针域得到第二个结点(数据的地址,由该结点的指针域得到第二个结点(数据B)的的地址,再由其指针域得到存储数据地址,再由其指针域得到存储数据C的结点地址,访问该结点的数据的结点地
5、址,访问该结点的数据域就可以处理数据域就可以处理数据C了。链表这种顺着指针链依次访问数据元素的特了。链表这种顺着指针链依次访问数据元素的特点,表明链表是一种点,表明链表是一种顺序存储结构顺序存储结构,只能顺序操作链表中元素。不能,只能顺序操作链表中元素。不能像顺序表(数组)那样可以按下标像顺序表(数组)那样可以按下标随机随机存取。存取。在链表存储结构中,不要求存储空间的连续性,数据元素之间在链表存储结构中,不要求存储空间的连续性,数据元素之间的逻辑关系由指针来确定。的逻辑关系由指针来确定。每个结点由两部分组成:data 数据域存放数据值next指针域存放后继结点的首地址链表通过每个指针域将n个
6、结点按逻辑次序链接成一个整体。&b&b&c&c&d&dHead&a&a头指针结点&b&b&c&c&a&a&datanext表头的地址由head指针提供,表尾结点没有直接后继,其指针域应为空指针,指针域为NULL单向链表单向链表 在图所示的链表中,每个结点只有一个指向后继的指针。在图所示的链表中,每个结点只有一个指向后继的指针。也就是说访问数据元素只能由链表头依次到链表尾,而不能做也就是说访问数据元素只能由链表头依次到链表尾,而不能做逆向访问。称这种链表为单向链表或线性链表。这是一种最简逆向访问。称这种链表为单向链表或线性链表。这是一种最简单的链表。单的链表。对于空链表,头结点的指针域为空。对于
7、空链表,头结点的指针域为空。图图2-8(a)为带头结点的空链为带头结点的空链 (b)为带头结点的单链表为带头结点的单链表定义链表结点结构的一般形式为Struct 结构体名 数据成员表;结构体名*指针变量名;struct studentint num;float score;student*next;struct ListNode ELEM data;ListNode*next;1672873 79486headtail/建立链表linklist*create()linklist*head,*p1,*p2;head=NULL;int x;cinx;struct linklistint num;f
8、loat score;linklist*next;p2=p1;/将新的结点作为尾结点p2-next=NULL;cinx;while(x0)p1=new(linklist);p1-num=x;cinp1-score;n=n+1;if(head=NULL)head=p1;else p2-next=p1;&p1p2p2p1p1如果是首结点呢?定义一个新结点p p2 2return head;建立链表的条件void print()coutnendl;/链表输出链表输出形参是什么?需要知道链表的头指针linklist*head如何查找链表?定义一个指针linklist*p1;p1=head;if(hea
9、d!=NULL)docoutnum score;coutnext;while(p1!=NULL);查找运算查找运算 的实现的实现 设设计计思思路路:设设置置一一个个跟跟踪踪链链表表结结点点的的指指针针p1,初初始始时时p1指指向向链链表表中中的的第第一一个个结结点点,然然后后顺顺着着next域域依依次次指指向向每每个个结结点点,每每指指向向一一个个结结点点就就判判断断其其值值是是否否等等于于i,若若是则返回该结点地址是则返回该结点地址,否则继续往后搜索否则继续往后搜索.要要访访问问单单链链表表中中第第i个个元元素素值值,必必须须从从头头指指针针开开始始遍遍历历链链表表,依依次次访访问问每每个个
10、结结点点,直直到到访访问问到到第第i个个结结点点为为止止。其其时时间间复杂度为复杂度为O(n)。linklist*getnode else coutinum!=i&p1-next!=NULL)p1=p1-next;j+;如果该结点不是要找的结点?if(p1-num=i)j+;coutthe node isjendl;return p1;如果该结点是要找的结点?linklist*del(linklist*head,int num)linklist*p1,*p2;if(head!=NULL)p1=head;else coutnextP1-next删除条件if(p1-num=num)if(p1=he
11、ad)head=p1-next;elsep2-next=p1-next;n=n-1;else coutnumnextP1-nextwhile(p1-num!=num&p1-next!=NULL)p2=p1;p1=p1-next;如果该结点不是要找的结点?找到该结点如何删除?线性链表的插入:在链式存储结构下的线性表中插入一个新结点线性链表的插入:在链式存储结构下的线性表中插入一个新结点在头指针head的线性链表中包含元素x的结点之前加入一个新结点void inslst(linklist*head,int x)linklist*p1,*p2;p1=new(linklist);cinp1-nump1
12、-score;if(head=NULL)head=p1;p1-next=NULL;p2=getnode(head,x);/寻找包含元素x的结点nextnextnextnextp1p1P2-nextP2-nextp2p2p1-next=p2-next;/将结点p1插入到结点p2后p2-next=p1;在插入和删除算法中,都是先查询确定操作位置,然在插入和删除算法中,都是先查询确定操作位置,然后再进行插入和删除操作。所以其时间复杂度均为后再进行插入和删除操作。所以其时间复杂度均为O(n)。另外在算法中实行插入和删除操作时没有移另外在算法中实行插入和删除操作时没有移动元素的位置,只是修改了指针的指向
13、,所以采用链动元素的位置,只是修改了指针的指向,所以采用链表存储方式要比顺序存储方式的效率高表存储方式要比顺序存储方式的效率高循环链表循环链表循环链表是单链表的另一种形式,是一个首尾相接的链表。特点:最后一个结点的指针域不空,而是指向头结点,整个链表连成环状,从表中任意结点出发均可到达其他结点。&b&b&c&c&d&d&b&b&c&cheadhead&b&b&c&c&d&dhead&b&b&c&cheadheadheadheadhead空循环链表判断表空的条件:head-next=head判断指针指向结点为表尾结点的条件:p-next=head 带带头头结结点点的的单单循循环环链链表表的的操操
14、作作算算法法和和带带头头结结点点的的单单链链表表的的操操作作算算法法很很相相似似,差差别别仅仅在在于于算算法法中中的的循循环环条条件件不不同同。在在循循环环单链表上实现上述基本运算的改动如下:单链表上实现上述基本运算的改动如下:1初始化链表初始化链表initlist(head)创建的头结点指针域创建的头结点指针域next不为空,而是指向自身不为空,而是指向自身head-next=head2线线性性表表查查找找运运算算*getnode(linklist*head,int i)函函数数、链链表表元元素素输输出出运运算算print(linklist*head)函函数数中中,循循环环遍遍历历是是否否进
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机软件技术编程基础 链表 计算机软件 技术 编程 基础
限制150内