- 1、本文档共50页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第二章 线 性 表 2.1 线性表的类型定义 2.2 线性表的顺序表示和实现 2.3 线性表的链式表示和实现 2.3.1 线性链表 2.3.2 循环链表 2.3.3 双向链表 2.4 一元多项式的表示及相加 例2、学生健康情况登记表如下: 例1、线性表:(bat,cat,eat,fat,hat,jat,lat,mat)的单链表示意图如下: 四、删除运算 删除运算是将表的第i个结点删去。必须首先找到ai-1的存储位 置p。然后令p–next指向ai的直接后继结点,即把ai从链上摘下。 2.3 线性表的链式表示和实现 p ai ai-1 ai+1 p ai ai-1 ai+1 q q = p-next 2.3 线性表的链式表示和实现 p ai ai-1 ai+1 q p-next = q-next p ai ai-1 ai+1 q free(q) p ai-1 ai+1 free(q)之后 void deletelist(linklist head, int i) { listnode * p, *q; p=getnode(head,i-1); if(p= =NULL || p–next= =NULL) return ERROR; q=p–next; p–next=q–next; free( q ) ; } 2.3 线性表的链式表示和实现 设单链表的长度为n,则删去第i个结点仅当1=i=n时是合法的。注意,当i=n+1时,虽然被删结点不存在,但其前趋结点却存在,它是终端结点。因此被删结点的直接前趋*p存在并不意味着被删结点就一定存在,仅当*p存在且*p不是终端结点(即p!=NULLp–next!=NULL)时,才能确定被删结点存在。 从上面的讨论可以看出,链表上实现插入和删除运算,无须移动结点,仅需修改指针。 演示 循环链表:在单链表中,将终端结点的指针域NULL改为指向表头结点的 或开始结点,就得到了单链形式的循环链表,并简单称为单循环链表。 为了使空表和非空表的处理一致,循环链表中也可设置一个头结 点。这样,空循环链表仅有一个自成循环的头结点表示。如下图所示: 2.3 线性表的链式表示和实现 2.3.2 循环链表 a1 a2 H H 由于循环链表中没有NULL指针,故涉及遍历操作时,其终止条件就不再像非循环链表那样判断p或p—next是否为空,而是判断它们是否等于某一指定指针,如头指针等。 an 2.3 线性表的链式表示和实现 例:求线性表中元素的个数。 int ListLength1(linklist head) //单链表 { int j; listnode *p; p=head; j=0; while(p-next!=NULL) { j++; p=p-next; } return(j); } int ListLength2(linklist head) //循环链表 { int j; listnode *p; p=head; j=0; while(p-next!=head) { j++; p=p-next; } return(j); } 双向链表(Double linked list):在单链表的每个结点里 再增加一个指向其直接前趋的 指针域prior。这样就形成的链 表中有两个方向不同的链,故 称为双向链表。 2.3 线性表的链式表示和实现 2.3.3 双向链表 typedef struct dlistnode{ datatype data; struc dlistnode *prior,*next; }dlistnode; typedef dlistnode * dlinklist; dlinklist head; a1 a2 H H an 和单链表类似,双链表一般也是由头指针唯一确定的,增加头 结点也能使双链表上的某些运算变得方便,将头结点和尾结点链接 起来也能构成循环链表,并称之为双向链表。 设指针p指向某一结点,则双向链表结构的对称性可用下式描述: p-prior-next = p = p-next-prior 即结点*p的存储位置既存放在其前趋结点*(p-prior)的直接 后继指针域中,也存放在它的后继结点*(p-next)的直接前趋指针 域中。 注意:与单链表的插入和删除操作不同的是,在双链表中插入 和删除必须同时修改两个方向上的指针。 2.3 线性表的链式表示和实现 * 张德海 Email: dhzhang@y
文档评论(0)