2024 王道考研-数据结构(线性表_2)

第二章 线性表算法题(线性表的链式存储)


二、综合应用题

1.设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点。

设f(L,x)的功能是删除以L为首结点指针的单链表中所有值等于x的结点,显然有f(L->next,x)的功能是删除以L->next为首结点指针的单链表中所有值等于x的结点。因此,可以推递归模型如下。

终止主体:f(L,x)=不做任何事情;        若L为空表

递归主体:f(L,x)=删除*L结点;f(L->next,x);        若L->data==x;

                  f(L,x)=f(L->next,x);                其他情况

void Del_X_3(LinkList &L,ELemtype x)
{LNode *p;//p指向待删除结点 if(L==NULL)//递归出口 return;if(L->data==x)//若L所指结点的值为x {p=L;//删除*L,并让L指向下一个结点 L=L->next;free(p);Del_X_3(L,x);//递归调用 }else//若L所指结点的值不为x {Del_X_3(L->next,x);//递归调用 }
}

2.在带头结点的单链表L中,删除所有值为x的结点,并释放其空间,假设值为x的结点不唯一,试编写算法以实现上述操作。

算法思想:用p从头至尾扫描单链表,pre指向*p结点的前驱。若p所指结点的值为x,则删除,并让p移向下一个结点,否则让pre、p指针同步后移一个结点。

void Del_X_1(LinkList &L,ElemType x)
{LNode *p=L->next,*pre=L,*q;//置p和pre的初始值 while(p!=NULL){if(p->data==x){q=p;//q指向被删结点 p=p->next;pre->next=p;//将*q结点从链表中断开 free(q);//释放*q结点的空间	}else//否则,pre和p同步后移 {pre=p;p=p->next;	}	}	
} 

3.设L为带头结点的单链表,编写算法实现从尾到头反向输出每个结点的值。

void R_Print(LinkList L)
{if(L->next!=NULL){R_Print(L->next);//递归 }if(L!=NULL)print(L->data);//输出函数 
}
void R_Ignore_Head(LinkList L)
{if(L->next!=NULL)R_Print(L->next);
}

4.试编写在头结点的单链表L中删除一个最小值结点的高效算法(假设最小值结点是唯一的)。

算法思想:用p从头至尾扫描单链表,pre指向*p结点的前驱,用minp保存值最小的结点指针(初值为p),minpre指向*minp结点的前驱(初值为pre)。一边扫描,一边比较,若p->data小于minp->data,则将p、pre分别赋值给minp、minpre。当p扫描完毕时,minp指向最小值结点,minpre指向最小值结点的前驱结点,再将minp所指结点删除即可。

LinkList Delete_Min(LinkList &L)
{LNode *pre=L,*p=pre->next;//p为工作指针,pre指向其前驱LNode *minpre=pre,*minp=p;//保存最小值结点及其前驱 while(p!=NULL){if(p->data<minp->data){minp=p;//找到比之前找到的最小值结点更小的结点 minpre=pre;	}pre=p;//继续扫描下一个结点 p=p->next;	}minpre->next=minp->next;//删除最小值结点 free(minp);return L;	
} 

5.试编写算法将带头结点的单链表就地逆置,所谓“就地”是指辅助空间复杂度为O(1)。

算法思想:将头结点摘下,然后从第一结点开始,依次插入到头结点的后面(头插法建立单链表),直到最后一个结点为止,这样就实现了链表的逆置。

LinkList Reverse(LinkList L)
{LNode *p,*r;//p为工作指针,r为p的后继,以防断链 p=L->next;//从第一个元素结点开始 L->next=NULL;//先将头结点L的next域值为NULL while(p!=NULL)//依次将元素结点摘下 {r=p->next;//暂存p的后继 p->next=L->next;//将p结点插入到头结点之后 L->next=p;p=r;}return L;	
}

6.有一个带头结点的单链表L,设计一个算法使其元素递增有序。

算法思想:采用直接插入排序算法的思想,先构成只含一个数据结点的有序单链表,然后依次扫描单链表中剩下的结点*p(直至p==NULL为止),在有序表中通过比较查找插入*p的前驱结点*pre,然后将*p插入到*pre之后。

void Sort(LinkList &L)
{LNode *p=L->next,*pre;//r保持*p后继结点指针,以保证不断链 LNode *r=p->next;//构造只含一个数据结点的有序表 p->next=NULL;p=r;while(p!=NULL){r=p->next;//保存*p的后继结点指针 pre=L;while(pre->next!=NULL&&pre->next->data<p->data)	pre=pre->next;//在有序表中查找插入*p的前驱结点*pre p->next=pre->next;//将*p插入到*pre之后 pre->next=p;p=r;//扫描原单链表中剩下的结点 } 
}

7.设在一个带表头结点的单链表中所有元素结点的数据值无序,试编写一个函数,删除表中所有介于给定的两个值(作为函数参数给出)之间的元素(若存在)。

算法思想:因为链表是无序的,所以只能逐个结点进行检查,执行删除。

void RangeDelete(LinkList &L,int min,int max)
{LNode *pr=L,*p=L->link;//p是检测指针,pr使其前驱 while(p!=NULL){if(p->data>min&&p->data<max)//寻找到被删结点,删除 {pr->link=p->link;free(p);p=pr->link;}else//否则继续寻找被删结点 {pr=p;p=p->link;}}
}

8.给定两个单链表,编写算法找出两个链表的公共结点。

LinkList Search_1st_Common(LinkList L1,LinkList L2)
{int dist;int len1=Length(L1),len2=Length(L2);//计算两个链表的表长LinkList longList,shortList;//分别指向表长较长和较短的链表if(len1>len2)//L1表长较长 {longList=L1->next;shortList=L2->next;dist=len1-len2;	//表长之差 } else//L2表长较长{longList=L2->next;shortList=L1->next;dist=len2-len1;	//表长之差 } while(dist--)//表长的链表先遍历到第dist个结点,然后同步 longList=longList->next;while(longList!=NULL)//同步寻找共同结点 {if(longList==shortList)//找到第一个公共结点 return longList;else//继续同步寻找 {longList=longList->next;shortList=shortList->next;}}return NULL;
}

9.给定一个带表头结点的单链表,设head为头指针,结点结构为(data,next),data为整型元素,next为指针,试写出算法:按递增次序输出单链表中各结点的数据元素,并释放结点所占的存储空间(要求:不允许使用数组作为辅助空间)。

算法思想:对链表进行遍历,在每次遍历中找出整个链表的最小值元素,输出并释放结点所占空间,再次查找次小值元素,输出并释放空间,如此下去,直至链表为空,最后释放头结点所占存储空间。

void Min_Delete(LinkList &head)
{while(head->next!=NULL)//循环到仅剩头结点 {LNode *pre=head;//pre为元素最小值结点的前驱结点的指针 LNode *p=pre->next;//p为工作指针 Lnode *u;//指向被删除结点 while(p->next!=NULL){if(p->next->data<pre->next->data)pre=p;//记住当前最小值结点的前驱 p=p->next;}print(pre->next->data);//输出元素最小值结点的数据 u=pre->next;//删除元素值最小的结点,释放结点空间 pre->next=u->next;free(u);}free(head);//释放头结点 
}

10.将一个带头结点的单链表A分解为两个带头结点的单链表A和B,使得A表中含有原表中序号为奇数的元素,而B表中含有原表中序号为偶数的元素,且保持其相对顺序不变。

算法思想:设置一个访问序号变量(初值为0),每访问一个结点序号自动加1,然后根据序号的奇偶性将结点插入到A表或B表中。重复以上操作直到表尾。

LinkList DisCreat_1(LinkList &A)
{int i=0;//i记录表A中结点的序号 LinkList B=(LinkList)malloc(sizeof(LNode));//创建B表表头 B->next=NULL;//B表的初始化 LNode *ra=A,*rb=B,*p;//ra和rb将分别指向将创建的A表和B表的尾结点 p=A->next;//p为链表工作指针,指向待分解的结点 A->next=NULL;//置空新的A表 while(p!=NULL){i++;//序号加1 if(i%2==0)//处理序号为偶数的链表结点 {rb->next=p;//在B表插入新结点 rb=p;//rb指向新的尾结点 }else//处理序号为奇数的链表结点 {ra->next=p;//在A表插入新结点ra=p;//ra指向新的尾结点 }p=p->next;//将p恢复为指向新的待处理结点 }ra->next=NULL;rb->next=NULL;return B;
}

11.设C={a1,b1,a2,b2,...,an,bn}为线性表,采用带头结点的单链表存放,设计一个就地算法,将其拆分为两个线性表,使得A={a1,a2,...,an},B={bn,...,b2,b1}。

算法思想:采用上题的思路,不设序号变量。二者的差别仅在于对B表建立不采用尾插法,而是采用头插法。

LinkList DisCreat_2(LinkList &A)
{LinkList B=(LinkList)malloc(sizeof(LNode));//创建B表表头 B->next=NULL;//B表的初始化 LNode *p=A->next,*q;//p为工作指针 LNode *ra=A;//ra始终指向A的尾结点 while(p!=NULL){ra->next=p;ra=p;//将*p链到A的表尾 p=p->next;if(p!=NULL){q=p->next;//头插后,*p将断链,因此用q记忆*p的后继 p->next=B->next;//将*p插入到B的前端 B->next=p;p=q;	}	} ra->next=NULL;//A表结点的next域置空 return B;
}

12.在一个递增有序的现行标准中,有数值相同的元素存在。若存储方式为单链表,设计算法去掉数值相同的元素,使表中不再有重复的元素,例如(7,10,10,21,30,42,42,42,51,70)将变为(7,10,21,30,42,51,70)。

算法思想:由于是有序表,所有相同值域的结点都是相邻的。用p扫描递增单链表L,若*p结点等于其后继结点的值域,则删除后者,否则p移向下一个结点。

void Del_Same(LinkList &L)
{LNode *p=L->next,*q;//p为扫描工作指针 if(p==NULL)return;while(p->next!=NULL){q=p->next;//q指向*p的后继结点 if(p->data==q->data)//找到重复值的结点 {p->next=q->next;//释放*q结点 free(q);//释放相同元素值的结点 }else{p=p->next;}}
}

13.假设有两个按元素值递增次序排列的线性表,均以单链表形式存储。请编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表。

算法思想:两个链表已经按元素值递增次序排序,将其合并时,均从第一个结点起进行比较,将小的结点链入链表中,同时后移工作指针。该问题要求结果链表按元素值递减次序排列,故新链表的建立应该采用头插法。比较结束后,可能会有一个链表为空,此时用头插法将剩下的结点依次插入到新链表中即可。

void MergeList(LinkList &La,LinkList &Lb)
{LNode *r,*pa=La->next,*pb=Lb->next;//分别是表La和Lb的工作指针 La->next=NULL;//La作为结果链表的头指针,先将结果链表初始化为空 while(pa&&pb)//当两链表均不为空时,循环 {if(pa->data<=pb->data){r=pa->next;//r暂存pa的后继结点指针 pa->next=La->next;La->next=pa;//将pa结点链于结果表中,同时逆置(头插法) pa=r;//恢复pa为当前待比较结点 }else{r=pb->next;//r暂存pb的后继结点指针pb->next=La->next;La->next=pb;//将pb结点链于结果表中,同时逆置(头插法)pb=r;//恢复pb为当前待比较结点 }	if(pa)pb=pa;//通常情况下会剩一个链表非空,处理剩下的部分 while(pb){//处理剩下的一个非空链表 r=pb->next;//依次插入到La中(头插法) pb->next=La->next;La->next=pb;pb=r; }free(Lb); }	
} 

14.设A和B是两个单链表(带头结点),其中元素递增有序。设计一个算法从A和B中的公共元素产生单链表C,要求不破坏A、B的结点。

算法思想:表A、B都有序,可从第一个元素起依次比较A、B两表的元素,若元素值不等,则值小的指针往后移,若元素值相等,则创建一个值等于两结点的元素值的新结点,使用尾插法插入到新的链表中,并将两个原表指针后移一位,直到其中一个链表遍历到表尾。

void Get_Common(LinkList A,LinkList B)
{LNode *p=A->next,*q=B->next,*r,*s;LinkList C=(LinkList)malloc(sizeof(LNode));//建立表Cr=C;//r始终指向C的尾结点 while(p!=NULL&&q!=NULL)//循环跳出条件 {if(p->data<q->data)p=p->next;//若A的当前元素较小,后移指针 else if(p->data>q->data)q=q->next;//若B的当前元素较小,后移指针else//找到公共元素结点 {s=(LNode *)malloc(sizeof(LNode));s->data=p->data;//复制产生结点*s r->next=s;//将*s链接到C上(尾插法) r=s;p=p->next;//表A和表B继续先后扫描 q=q->next;	} }r->next=NULL;//置C尾结点指针为空 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/119275.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Opencv-图像插值与LUT查找表

图像像素的比较 白色是255&#xff0c;黑色是0 min(InputArray src1,InputArray src2,OutputArray dst) max(InputArray src1,InputArray src2,OutpurArray dstsrc1:第一个图像矩阵&#xff0c;通道数任意src2&#xff1a;第二个图像矩阵&#xff0c;尺寸和通道数以及数据类型…

Real3D FlipBook jQuery Plugin 3.41 Crack

Real3D FlipBook 和 PDF 查看器 jQuery 插件 - CodeCanyon 待售物品 实时预览 截图 视频预览 Real3D Flipbook jQuery 插件 - 1 Real3D Flipbook jQuery 插件 - 2 Real3D Flipbook jQuery 插件 - 3 新功能 – REAL3D FLIPBOOK JQUERY 插件的 PDF 到图像转换器 一款用于将…

修炼k8s+flink+hdfs+dlink(六:学习namespace,service)

一&#xff1a;什么是namespace&#xff1f; 你可以认为namespaces是你kubernetes集群中的虚拟化集群。在一个Kubernetes集群中可以拥有多个命名空间&#xff0c;它们在逻辑上彼此隔离。 他们可以为您和您的团队提供组织&#xff0c;安全甚至性能方面的帮助&#xff01; 二&a…

[Python从零到壹] 七十二.图像识别及经典案例篇之OpenGL入门及绘制基本图形和3D图

十月太忙,还是写一篇吧!祝大家1024节日快乐O(∩_∩)O 欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希…

7.MySQL复合查询

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 复合查询 基本查询回顾 多表查询 自连接 子查询 单行子查询 多行子查询 多列子查询 在from子句中使用子查询 合并查询 union union all 实战OJ 复合查询 前面我们讲解的mysql表的查询都是对一张表进行查询…

低代码助力企业数字化升级

随着数字化转型的深入&#xff0c;越来越多的企业开始寻求低代码和无代码解决方案&#xff0c;以满足对应用程序的更快交付和高度定制自动化工作流的日益增长的需求。 根据Gartner的数据&#xff0c;全球低代码和无代码应用平台的市场规模预计在2023年将增长25%至100亿美元&…

IP地址在网络安全中的关键作用

IP地址&#xff08;Internet Protocol Address&#xff09;是互联网世界中的重要标识符&#xff0c;它在网络安全领域发挥着至关重要的作用。这些地址不仅帮助设备在网络上找到彼此&#xff0c;还在多个方面有助于维护网络的完整性、机密性和可用性。本文将探讨IP地址在网络安全…

Java后端开发——实现登录验证程序

一、实现一个简单登录验证程序 实现一个简单的用户登录验证程序&#xff0c;如果用户名是 abc &#xff0c;密码是 123&#xff0c;则显示欢迎用户的信息&#xff0c;否则显示“用户名或密码不正确”。 【分析】 该案例采用 JSP 页面只完成提交信息和验证结果的显示&#xff…

做外贸为何离不开WhatsApp?一文解封、养号、引流、促单全攻略!

WhatsApp在国际贸易中的地位无法忽视。它是一种即时通讯工具&#xff0c;也是外贸从业者的得力助手。但同时&#xff0c;使用WhatsApp也伴随着一些问题&#xff0c;如账号被封、如何养号、引流和促单。这篇文章将为你详细解答这些问题&#xff0c;让你更好地利用WhatsApp&#…

Go语言用Resty库编写的音频爬虫代码

以下是一个使用Resty库的Go语言下载器程序&#xff0c;用于从facebook下载音频。此程序使用了duoip/get_proxy的代码。 package mainimport ("fmt""github.com/john-nguyen09/resty""io/ioutil""net/http" )func main() {// 设置爬虫i…

跨境出口亚马逊美国和加拿大市场水基灭火器UL测试报告审核解析

水基灭火器&#xff08;Foam extinguisher&#xff09;&#xff0c;为绿色外观的灭火器&#xff0c;其灭火器机理为物理性灭火器原理&#xff0c;其主要成分包括碳氢表面活性剂、氟碳表面活性剂、阻燃剂和助剂等。水基灭火器出口需办理UL测试报告。 消防及其他安全用品 本政策…

vue中替换全局字体

一、背景 产品说项目要拿去展会展示&#xff0c;但现在项目字体是微软雅黑&#xff0c;不支持商用&#xff0c;需要全局替换思源字体。 二、下载字体 推荐一个网址&#xff0c;好用 字体天下&#xff0c;点击跳转 下载好的文件如下&#xff1a; 三、引入字体 1、在项目…

Maven学习

Maven介绍 Maven是Apache的一个开源项目&#xff0c;主要服务于基于Java平台的项目构建&#xff0c;依赖管理和项目信息管理。 Maven可以让团队能够更科学的构建项目&#xff0c;我们可以用配置文件的方式&#xff0c;对项目的名称、描述、项目版本号、项目依赖等信息进行描述…

如何在Postman中使用静态HTTP

首先&#xff0c;打开 Postman 软件。在 Postman 的菜单栏中&#xff0c;点击 “Preferences”&#xff08;偏好设置&#xff09;。 亲身经验&#xff1a;我自己尝试了这个方法&#xff0c;发现它非常适用于需要使用HTTP的场景。 数据和引证&#xff1a;根据 Postman 官方文档…

【tio-websocket】9、服务配置与维护—TioConfig

场景 我们在写 TCP Server 时,都会先选好一个端口以监听客户端连接,再创建N组线程池来执行相关的任务,譬如发送消息、解码数据包、处理数据包等任务,还要维护客户端连接的各种数据,为了和业务互动,还要把这些客户端连接和各种业务数据绑定起来,譬如把某个客户端绑定到一…

杀毒软件的原理

近几年杀毒软件泛滥&#xff0c;很多人不知道该如何选择合适的杀毒软件&#xff0c;也许杀毒软件并非是必需的&#xff0c;真心觉得杀毒软件没啥用&#xff0c;而且运行起来还严重影响系统性能&#xff0c;但是很多小白电脑都会用杀毒软件&#xff0c;他们怕&#xff0c;因为不…

系统升级数量超微软预期,Win10/11盗版激活被封杀

声明&#xff1a;本文提供的命令、工具来自第三方网站&#xff0c;仅供学习交流使用&#xff0c;下载后24小时内删除&#xff0c;一切非法使用责任由使用者自行承担。 上月底 Win11 迎来了 Moment 4 功能更新&#xff0c;任务栏取消合并居然真的回归了。 巨硬终于妥协&#x…

C#使用mysql-connector-net驱动连接mariadb报错

给树莓派用最新的官方OS重刷了一下&#xff0c;并且用apt install mariadb-server装上“mysql”作为我的测试服务器。然后神奇的事情发生了&#xff0c;之前用得好好的程序突然就报错了&#xff0c;经过排查&#xff0c;发现在连接数据库的Open阶段就报错了。写了个最单纯的Con…

xcode Simulator 手动安装

xcode Simulator 手动安装 参考文档 xcode又又又升级了&#xff0c;升级完成之后不下载最新的 iOS 17 Simulator就不能编译运行了&#xff0c;只能静静的等他下载。但是离谱的是这个居然没有断点续下&#xff0c;每次都要重新下载&#xff0c;眼睁睁的看着下载了4个G然后断掉…

数字取证对有效企业事件响应的重要性

数字取证对有效企业事件响应的重要性 事件响应功能的现代化已成为企业安全的关键焦点&#xff0c;数字取证调查的支持是事件响应的重要组成部分&#xff0c;并就如何优化交互提供了指导&#xff0c;尤其是在CISO 领导的团队选择商业平台和工具的情况下。 企业事件响应简介 现代…