2.3线行链表和其运算.ppt

  1. 1、本文档共98页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2.3线行链表和其运算

2.3线性表的链式存储及其运算 ;2.3.1线性表的链式存储 ; 链式存储结构,既可用来表示线性结构,也可用来表示非线性结构。线性表的链式存储结构,称为线性链表。 对线性链表而言,它不要求逻辑上相邻的元素在物理位置上也相邻。其存储单元既可以是连续的,也可以是不连续的,甚至可以零散分布在内存中的任何位置上。 ;; 用下面例子,来说明线性链表的存储结构。 设线性表为(a1,a2,a3,a4), 存储空间具有9个存储结点。 ;数据域 指针域 A2 9 A1 1 A4 0 A3 5 ;2.3.2线性链表的基本运算 ; 为了便于实现插入、删除结点的操作,通常在单链表的第一个结点之前增设一个表头结点。该结点的结构与表中其他结点的结构相同,其数据域可以不存储任何信息,也可以存储如线性表的表名、长度等附加信息;其指针域用来存放线性表中的第一个结点的地址。若线性表为空表,则表头结点的指针域为空,设H为单链表的头指针,指向头结点;存储单链表的第一个元素的结点称为开始结点(或称首结点),其指针域存放第二个结点的地址;称存储最后一个元素的结点称终端结点(或称尾结点),其指针域为空,如图3-5所示。 ;; 若用换行符‘\n’作为输入结束标志,用rear作为总是指向链表尾结点的尾指针,则建立带表头结点的先进先出单链表的算法如下: ; if(!H) { printf(\n 存储分配失败); exit(1); } H-next=NULL; /*表初值为空*/ rear=H; /*尾指针指向表头结点*/ while((ch=getchar())!=\n) { p=(LinkList)malloc(sizeof( ListNode)); /*生成新结点*/; if(!p) { printf(\n 存储分配失败); exit(1); } p-data=ch; p-next=p; /*新结点插入表尾*/ rear=p; /*尾指针指向新结点*/ } return(H); /*返回头指针*/ }; ② 后进先出表:在建立单连表时,将每次生成的新结点,总是插入到当前链表的表头结点之后作为当前链表的首结点。若用换行符‘\n’作为输入结束标志,则建立带表头结点的后进先出单链表的算法如下: ; if(!H) { printf(\n 存储分配失败); exit(1); } H-next=NULL; /*表初值为空*/ while((ch=getchar())!=\n) { p=(LinkList)malloc(sizeof( ListNode)); /*生成新结点*/; if(!p) { printf(\n 存储分配失败); exit(1); } p-data=ch; p-next=H-next; H-next=p;/*插入表头结点之后*/ } return(H); /*返回头指针*/ }; ③ 有序单链表:是指原表中结点的数据值,按从小到大(或从大到小)的顺序排列。为了建立一个有序单链表,每次生成的新结点,总是插入到当前链表的合适位置。在带表头结点的单链表中,所有位置上的插入操作都是一致的,不需要做特殊处理。 ;LinkList CreateList_or( ) { LinkList H,pre,cur; /*pre将指向当前结点的前件,cur将指向当前结点*/ char ch; H =(LinkList)malloc(sizeof( ListNode)); /*生成表头结点*/ if(!H) { printf(\n 存储分配失败); exit(1); };H-next=NULL;/*表初值为空*/ while((ch=getchar( ))!=’\n’) { pre=H;/*pre指向当前结点的前件*/ cur=H-next;/*cur指当前结点*/ while(curcur-datach) /*找出新结点在表中的合适位置*/ { pre=cur; cur=cur-next; };cur=(LinkList)malloc(sizeof( ListNode)); /*生成新结点*/ if(!cur) { printf(\n 存储分配失败); exit(1); } cur-data=ch; cur-next=pre-next; /*新结点插在pre所指结点的后面*/ ;pre-next=cur;/

文档评论(0)

wuyoujun92 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档