ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:17.38KB ,
资源ID:3729467      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3729467.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(2双向链表表循环链表有序链表的常见操作.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

2双向链表表循环链表有序链表的常见操作.docx

1、2双向链表表循环链表有序链表的常见操作数据结构面试之二双向链表表、循环链表、有序链表的常见操作题注:面试宝典有相关习题,但思路相对不清晰,排版有错误,作者对此参考相关书籍和自己观点进行了重写,供大家参考。二、双向链表双向链表的建立是在单链表的基础上,多了一个指向前驱的指针back。其他的操作类似,注意点就是在双向链表的操作,尤其插入、删除操作中需要修改两个指针的指向,一个是back指针,一个是next指针。1.双向链表的构建【前面插入】构建双向链表注意点:1)修改first指针(头指针)的指向。2)修改back、next指针。/反向表头插入,从前面插入.templatenodeType*dou

2、blyLinkedList:buildListBackward() nodeType *newNode; int num; cout Enter a list of integer end with -999. num; while(num != -999) /.add newNode = new nodeType; newNode-info = num; newNode-next = NULL; newNode-back = NULL; if(first = NULL) first = newNode; else newNode-next = first; first-back = newN

3、ode; first = newNode; cin num; return first;2.双向链表的插入节点【此处考虑插入后保证有序,直接插入排序】节点的插入同单链表,依然需要考虑多种因素。分以下几类:1)双向链表为空,“提示信息”并返回。2)双向链表非空,待插入节点的元素值小于first节点,需要修改first指针。3)双向链表非空,待插入节点的元素值为链表中间的节点,需修改back、next指向。4)双向链表非空,待插入节点在最末尾节点以后,修改最末节点的指针。 /双向不循环链表templatevoiddoublyLinkedList:insertNode(const Type& ins

4、ertItem) /newnodeType *current;nodeType *trailCurrent;nodeType *newNode;bool found = false; newNode = new nodeType;newNode-info = insertItem;newNode-next = NULL;newNode-back = NULL; /case 1: 空表if(first = NULL) first = newNode;else current = first; while( current != NULL) if( current-info = insertIte

5、m ) found = true; break; else trailCurrent = current; current = current-next; /case 2: 第一个节点 if(current = first) current-next = newNode; newNode-back = current; else /case 3: 中间节点 if(current != NULL) newNode-next = trailCurrent-next; current-back = newNode; trailCurrent-next = newNode; newNode-back

6、= trailCurrent; else /case 4:最后一个节点前 trailCurrent-next = newNode; newNode-back = trailCurrent; /end case 4 3.双向链表的删除节点同样需要考虑以下几点:1)链表为空,“提示信息”并返回。2)链表非空,查找删除的元素在链表是否存在。是的话,found=true;否的话,found=false。3)如果没有找到包含查找元素的节点,“错误提示”并返回。4)如果找到,主要节点位置。如果是头节点或末尾节点主要修改first指针,及节点的back、next指向;如果不是头节点或者末尾节点就是中间节点,

7、主要back、next的指向,完成插入。templatevoid doublyLinkedList:deleteNode(constType& deleteItem) /new nodeType *current = new nodeType; nodeType *trailCurrent; bool found = false; /case 1: 空表 if(first = NULL) cout The List is NULL! info = deleteItem ) found = true; break; else trailCurrent = current; current = c

8、urrent-next; if(found) /case 2: 第一个节点 if(current = first) first = current-next; delete current; else /case 3: 中间节点 if(current != NULL) if(current-next != NULL) /case3.1:要删除的是中间节点. trailCurrent-next =current-next; current-next-back = trailCurrent; delete current; else trailCurrent-next = NULL;/case3.

9、2:要删除的为最后一个节点. delete current; / end else / end if else cout The elem deleteItem is not Exist in the List! link的指向。templatevoid cycleList:bulidCycListBackward() /前插构造循环链表. Type newItem; while(cin newItem, newItem != -999) nodeType* newNode = newnodeType; newNode-info = newItem; newNode-link = NULL;

10、if(first = NULL) first = newNode; last = newNode; first-link = first; last-link = first; else newNode-link = first; last-link = newNode; first = newNode; cout 输入完毕! link的指向。/只在last末尾插入templatevoidcycleList:insertCycList(const Type& newItem)nodeType *newNode = new nodeType;newNode-info = newItem;newN

11、ode-link = NULL; if(first = NULL) /链表为空. first = newNode; last = newNode; first-link = first; last-link = first;else /链表非空. last-link = newNode; newNode-link = first; last = newNode;cout newItem was inserted! endl;3.删除循环链表节点考虑到是否为空链表、删除元素在链表中不存在、及节点存在(节点的位置可能为共分头、中间、尾),所以分为以下5种情况分别处理。:/case1:链表为空。/c

12、ase2:链表非空,删除节点为头节点。/case3:链表非空,删除节点为尾节点。/case4:链表非空,删除节点为中间节点。/case5:链表非空,不存在=deleteItem的节点。templatevoidcycleList:delCycList(const Type& deleteItem)nodeType *current = new nodeType;nodeType *trailCurrent = new nodeType;nodeType *temp ;bool found = false; if( first = NULL ) cout The List is Empty! in

13、fo = deleteItem ) /case2 temp = new nodeType; temp = first; first = first-link; last-link = first; cout The node has deleteItem was deleted! link; while( !found & current != first) if( current-info = deleteItem ) found = true; break; else trailCurrent = current; current = current-link; / end while i

14、f(found) temp = new nodeType; if(current = last) /case3 temp = last; trailCurrent-link = last-link; /last-link = first last = trailCurrent; else temp = current; trailCurrent-link= current-link; cout The Elem : deleteItem was deleted! endl; delete temp; else cout The Elem : deleteItem was not Exist i

15、n the List! endl; /end else四、有序链表注意:此处有序链表无非是在之前的一、单链表的操作的基础上,在插入元素的时候,按顺序插入,考虑的排序。为了体现有序的特点,特通过递归实现了有序链表的逆序打印。关于有序链表或者链表的非递归实现,可以通过栈实现。下一节会分析并实现。1.有序链表的插入考虑以下三种情况:1)当前链表为空;2)当前链表非空,要插入的元素值小于头结点的元素值;3)当前链表非空,要插入的元素值大于头结点的元素值,可以考虑找到第一个大于其的元素则停止搜索,插入其前即可。templatevoid orderedLinkedListType:insertNode(c

16、onstType& newItem)nodeType* current;nodeType* trailCurrent;nodeType* newNode; bool found = false; newNode = new nodeType;newNode-info = newItem;newNode-link = NULL; if(first = NULL) /case1:链表为空. first = newNode; last = first;else current = first; while( !found & current != NULL) /循环查找 if(current-inf

17、o = newItem) found = true; break; else trailCurrent = current; current = current-link; /end while /first 特殊处理. if(current = first) /case2:新插入的元素小于first节点的元素值. newNode-link = first; first = newNode; else /其他. newNode-link = current; /case3:新插入的节点在非first位置 trailCurrent-link = newNode; /end else2.递归实现有序链表的逆序打印templatevoidorderedLinkedListType:printListReverse() const /逆序打印. reversePrint(first); cout endl; /递归实现单链表的逆序打印.templatevoidorderedLinkedListType:reversePrint(nodeType* current)const /逆序打印if(current != NULL) reversePrint(current-link); cout info t;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1