- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
考题:假定采用带头节点的单链表保存单词,当两个单词有相同的后缀时,则可共享相同的后缀存储空间,例如,“loading”和“being”,如下图所示。设str1和str2分别指向两个单词所在单链表的头节点,链表节点结构为:datanext请设计一个时间上尽可能高效的算法,找出由str1和str2所指向两个链表共同后缀的起始位置(如图中字符i所在节点的位置p)。要求:(1)给出算法的基本设计思想。(2)根据设计思想,采用C或C++或JAVA语言描述算法,关键为之处给出注释。(3)说明你所设计算法的时间复杂度。注:本题为2012年全国考研题。解:(1)算法的基本设计思想如下:分别求出str1和str2所指的两个链表的长度m和n。将两个链表以表尾对齐:令指针p、q分别指向str1和str2的头节点,若m≥n,则使p指向链表中的第m-n+1个节点;若mn,则使q向链表中的第n-m+1个节点,即使指针p、q所指的节点到表尾的长度相符。反复将指针p、q同步后移,并判断它们是否指向同一节点。若p、q指向同一节点,则该节点即为所求的共同后缀的起始位置。(2)算法实现如下:typedefstructNode{chardata;structNode*next;}SNODE;SNODE*Findlist(SNODE*str1,SNODE*str2){intm,n;SNODE*p,*q;m=Listlen(str1); //求单链表str1的长度mn=Listlen(str2); //求单链表str2的长度nfor(p=str1;mn;m--) //若m大,则str1后移m-n+1个节点 p=p-next;for(q=str2;mn;n--) //若n大,则str1后移n-m+1个节点 q=q-next;while(p-next!=NULLp-next!=q-next){ p=p-next; //p、q两步后移找第一个指针值相等的节点 q=q-next;}returnp-next;}intListlen(SNODE*head) //求单链表的长度{intlen=0;while(head-next!=NUL){ len++; head=head-next;}returnlen;}(3)算法的时间复杂度为O(m+n)或O(MAX(m,n)),其中m、n分别为两个链表的长度。例2.6设计一个算法,删除一个单链表L中元素值最大的节点。L∧……maxpmaxprevoiddelmaxnode(LinkList*L){LinkList*p=L-next,*pre=L,*maxp=p,*maxpre=pre;while(p!=NULL) //用p扫描整个单链表,pre始终指向其前驱节点{ if(maxp-datap-data) //若找到一个更大的节点 {maxp=p; //更改maxp maxpre=pre; //更改maxpre } pre=p; //p、pre同步后移一个节点 p=p-next;}maxpre-next=maxp-next; //删除*maxp节点free(maxp); //释放*maxp节点}例2.7有一个带头节点的单链表L(至少有一个数据节点),设计一个算法使其元素递增有序排列。L∧∧p……pre…voidsort(LinkList*L){LinkList*p,*pre,*q;p=L-next-next;//p指向L的第2个数据节点,即当前需要插入的结点L-next-next=NULL; //构造只含一个数据节点的有序表while(p!=NULL){ q=p-next; //q保存*p节点后继节点的指针 pre=L;//从有序表开头进行比较,pre指向插入*p的前驱节点 while(pre-next!=NULLpre-next-datap-data) pre=pre-next; //在有序表中找插入*p的前驱节点*pre p-next=pre-next;//将*pre之后插入*p pre-next=p; p=q; //扫描原
您可能关注的文档
最近下载
- 江西省森林经营主要乔木树种特征表、公益林及天然林主要森林经营作业法.docx VIP
- 成都 初三一诊数学试卷.docx VIP
- 1325编号斯波索宾和声学教程课后作业答案.pdf VIP
- 任务3-2 畜禽杂交利用《畜禽繁殖与改良技术》教学课件.ppt VIP
- 2023年欧洲肝病学会临床实践指南:慢加急性肝衰竭(完整版).pdf VIP
- 石油建设安装工程预算定额计算规则.pdf VIP
- 河北金融学院《大学英语》2025-2026学年期末试卷.pdf VIP
- 2025年青海省安全员B证考试模拟题附答案【精品】.docx VIP
- 巴蜀文化智慧树知到期末考试答案2024年.docx VIP
- 斯波索宾和声学教程课后作业答案.pdf VIP
原创力文档


文档评论(0)