30.链表练习题(1)(王道2023数据结构2.3.7节1-8题)

news2024/11/19 1:32:16

【前面使用的所有链表的定义在第29节】

试题1:

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

首先来看非递归算法,暴力遍历:

int Del(LinkList &L,ElemType x){
//此函数实现删除链表中为x的元素
	LNode *p,*q;
	p = L;  //p指向头结点
	q = L->next;  //q指向首元结点
	while(q->next!=NULL){
		if(q->data == x){
			p->next = q->next;
			free(q);
			q = p->next;
		}
		else{
			p = p->next;
			q = q->next;
		}
	}
	return 0;
}

int main(){
	LinkList L;
	InitList(L);
	Create(L);
	PrintList(L);
	Del(L, 3);
	PrintList(L);
	return 0;
}

然后看递归算法:

int Del(LinkList &L,ElemType x){
//此函数实现递归删除链表中为x的元素
	LNode *p;
	if(L==NULL)
		return 0;
	if(L->data==x){
		p = L;
		L = L->next;
		free(p);
		Del(L, x);
	}
	else{
		Del(L->next, x);
	}
	return 0;
}

int main(){
	LinkList L;
	InitList(L);
	Create(L);
	PrintList(L);
	Del(L, 3);
	PrintList(L);
	return 0;
}

这里分析一下怎么递归的:从头开始,如果首元结点就是被删掉的x那很显然;如果不是,这时候执行Del(L->next, x),如果第2个是被删掉的元素,进入if(L->next->data==x)分支,此时p=L实际上执行p=L->next,p指向了第2个被删除的结点;第2行L = L->next执行的是L->next=L->next->next,把首元结点的next域修改为指向第3个结点;然后free(p)释放空间,最后继续执行Del(L,x)相当于Del(L->next, x),这时L->next是第3个结点,依次递归。

试题2:(与题1差不多)

试题3:L是带头结点的单链表,编写算法实现从尾到头反向输出每个结点的值

此题可以使用栈来解决,这里主要提书上的递归方法:

void AdversePrint(LinkList L){
//此函数实现反向打印链表L的元素
	if(L!=NULL){
		AdversePrint(L->next);  //递归
		printf("[%d] ", L->data);  //打印当前元素
	}
}

int main(){
	LinkList L;
	InitList(L);
	Create(L);
	PrintList(L);
	AdversePrint(L->next); //带头结点的链表,这里L->next指向首元结点
	return 0;
}

试题4:编写在带头结点的单链表L中删除一个最小值结点的高效算法。

(注意不要写野指针!)

void Deletexmin(LinkList &L){
//此函数实现删除链表最小值元素
	LNode *p, *q, *m, *n;
	int a;
	p = L;  //p指向头结点
	q = L->next;  //q指向首元结点
	a = q->data;  //首元结点元素赋给a
	m = p;
	n = q;
	while (q->next != NULL){
		q = q->next;  //指针后移
		p = p->next;  //指针后移
		if(q->data < a){
			a = q->data;  //更新a
			m = p;  //记录当前最小值的前驱结点
			n = q;  //记录当前最小值结点
		}
	}
	m->next = n->next;
	free(n);
}

int main(){
	LinkList L;
	InitList(L);
	Create(L);
	PrintList(L);
	Deletexmin(L);
	PrintList(L);
	return 0;
}

试题5:将单链表的元素就地逆置

利用头插法重新建立链表:

void ReverseL(LinkList &L){
//此函数实现逆置单链表所有元素
	LNode *p, *q;
	p = L;
	q = L->next;  //q指向首元结点
	p = q;
	q = q->next;  //q指向第二个结点
	p->next = NULL;
	if(q==NULL)
		return ;
	else{
		while (q!=NULL){
			p = q->next;  //p移向首元结点
			q->next = L->next; 
			L->next = q;  //修改头结点指针,头插法
			q = p;
		}	
	}
}

int main(){
	LinkList L;
	InitList(L);
	Create(L);
	PrintList(L);
	ReverseL(L);
	PrintList(L);
	return 0;
}

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

采用插入排序的思想:

void SortL(LinkList &L){
//此函数实现递增排序单链表所有元素
	LNode *p, *q, *r;
	p = L->next;  //p工作在排好序的链表
	q = p->next;  //q是待排序元素,即第二个结点,断开之后的第一个结点
	r = q->next;  //r在q之后
	p->next = NULL;  //断开
	while(q!=NULL){
		r = q->next;
		p = L;  
		while(q->data > p->next->data && p->next!=NULL){
			p = p->next;
		}
		q->next = p->next;
		p->next = q;
		q = r;
	}
}

int main(){
	LinkList L;
	InitList(L);
	Create(L);
	PrintList(L);
	SortL(L);
	PrintList(L);
	return 0;
}

输出:

请输入要输入元素的个数:5
请输入第1元素的值:5
请输入第2元素的值:3
请输入第3元素的值:1
请输入第4元素的值:2
请输入第5元素的值:4
当前单链表的所有元素:[5] [3] [1] [2] [4]
当前单链表的所有元素:[1] [2] [3] [4] [5]

试题7:(修改试题1的参数条件if(q->data == x)即可)

试题8:求两个链表的公共链表

如果有公共链表,一定是这样的Y型拓扑结构:

int LengthL(LinkList L){
//此函数实现求解链表长度
	LNode *p;
	p = L;
	int i = 0;
	while(p->next!=NULL){
		p = p->next;
		i++;
	}
	return i;
}

LinkList Search_1st_common(LinkList L1,LinkList L2){
//此函数实现查找两个链表的公共结点
	int L1length = LengthL(L1);
	int L2length = LengthL(L2);
	printf("%d", LengthL(L1));
	printf("%d", LengthL(L2));

	int delta = 0;  //记录长链表比短链表多多少
	LNode *longList, *shortList;

	if(L1length > L2length){
		longList = L1->next;  //L1更长,longList指向L1首元结点
		shortList = L2->next;
		delta = L1length - L2length;
	}
	else{
		longList = L2->next;  //L2更长,longList指向L2首元结点
		shortList = L1->next;
		delta = L2length - L1length;
	}
	printf("%d", longList->data);
	printf("%d", shortList->data);
	printf("%d", delta);

	for (int i = 0; i < delta;i++){ // 移动longList指针至delta位置
		longList = longList->next;
	}
	printf("%d", longList->data);

	//经过以上移动,此时longList指针与shortList指针指的剩余长度一样
	while (longList!=shortList && longList != NULL){
		longList = longList->next;
		shortList = shortList->next;
	}
	return longList;
}

void PrintResult(LinkList L){
	if(L == NULL)
		printf("公共结点不存在!");
	else
		PrintList(L);
}

int main(){
	LinkList L1,L2;
	InitList(L1);
	Create(L1);
	PrintList(L1);
	InitList(L2);
	Create(L2);
	PrintList(L2);
	PrintResult(Search_1st_common(L1, L2));
	return 0;
}

输出:

请输入要输入元素的个数:2
请输入第1元素的值:1
请输入第2元素的值:2
当前单链表的所有元素:[1] [2]
请输入要输入元素的个数:5
请输入第1元素的值:3
请输入第2元素的值:4
请输入第3元素的值:5
请输入第4元素的值:6
请输入第5元素的值:7
当前单链表的所有元素:[3] [4] [5] [6] [7]
253136公共结点不存在!

请输入要输入元素的个数:2
请输入第1元素的值:1
请输入第2元素的值:2
当前单链表的所有元素:[1] [2]
请输入要输入元素的个数:3
请输入第1元素的值:3
请输入第2元素的值:4
请输入第3元素的值:5
当前单链表的所有元素:[3] [4] [5]
233114公共结点不存在!

在写这段代码的时候踩了一个坑:大家观察下面两段代码:

void Search_1st_common(){
//此函数实现查找两个链表的公共结点
	int L1length = 3;
	int L2length = 5;
	int delta = 0;  //记录长链表比短链表多多少

	if(L1length > L2length){
		delta = L1length - L2length;
	}
	else{
		delta = L2length - L1length;
	}
	printf("%d", delta);
}

int main(){
	Search_1st_common();
	return 0;
}
void Search_1st_common(){
//此函数实现查找两个链表的公共结点
	int L1length = 3;
	int L2length = 5;
	int delta = 0;  //记录长链表比短链表多多少

	if(L1length > L2length){
		int delta = L1length - L2length;
	}
	else{
		int delta = L2length - L1length;
	}
	printf("%d", delta);
}

int main(){
	Search_1st_common();
	return 0;
}

打印delta的结果分别是2和0.后一段代码中if...else...结构体内相当于重新定义了一个delta,当结构体执行结束后又被释放掉了,所以delta的返回结果是0.

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

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

相关文章

oracle分组排序取第一条数据

row_number()over(partition by 分组字段 order by 排序字段) 例&#xff1a;select * from ( select id,dealer_name,row_number()over(partition by dealer_name order by create_time ) r from mr) where r1

欧盟对中反补贴引发恐慌 | 百能云芯

中德汽车产业链紧密交织&#xff0c;欧盟对中国电动汽车反补贴的调查可能对欧洲本土产业造成负面影响。欧盟计划到2035年停售非零碳排放汽车&#xff0c;这为中国电动汽车在欧洲市场寻求机会提供了契机&#xff0c;但中国电动车的快速崛起引发了国际社会的警惕。 欧盟委员会主席…

在比特币上使用可检索性证明支付存储费用

我们为用户开发了一种为云存储付费的新方法。 与亚马逊的 S3 等传统云存储相比&#xff0c;用户不必信任服务器。 我们使用比特币智能合约来确保支付取决于服务器的可检索性证明 (PoR)&#xff0c;该证明只能在数据仍然可用且需要时可以检索的情况下生成。 可检索性证明 (PoR)…

WireShark抓包分析TCP三次握手过程,TCP报文解析

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 使用WireShark工具抓取TCP协议三次握手的数据包&am…

06-数据库检索:如何使用B-树对海量磁盘数据建立索引?

06-数据库检索&#xff1a;如何使用B-树对海量磁盘数据建立索引&#xff1f; 你好&#xff0c;我是陈东。 在基础篇中&#xff0c;我们学习了许多和检索相关的数据结构和技术。但是在大规模的数据环境下&#xff0c;这些技术的应用往往会遇到一些问题&#xff0c;比如说&…

CGAL安装到验证到深入

1、安装CGAL Win10下VS配置CGAL-5.3.1&#xff08;下载、安装、VS属性表配置&#xff09; 测试代码_cgal下载_孙 悟 空的博客-CSDN博客 2、CGAL验证练习 #include <iostream> #include <CGAL/Simple_cartesian.h> typedef CGAL::Simple_cartesian<double> …

800多个看图猜电视剧的含图的ACCESS\EXCEL数据库

虽然说看图猜什么是去年流行的一种手机游戏&#xff0c;但是这种游戏放置在任何年代都算是一种趣味之一&#xff0c;而今天看到一个800多的电视载图猜电视剧的内容&#xff0c;因此就弄下来&#xff0c;毕竟这种数据是永不过期的。 其实&#xff0c;实现迷惑字很简单&#xff0…

柔和舒适的瑜伽垫,设计时尚两面可用

日常健身的时候&#xff0c;瑜伽垫是个很实用的工具&#xff0c;可以大大提升健身时的舒适性&#xff0c;不过在选择瑜伽垫的时候也要注意质量&#xff0c;特别是像厚度、弹力、异味之类的细节&#xff0c;对平时使用的影响都很大。 目前我用的是一款莫比 联名扭蛋兔瑜伽垫&…

2023年前端面试真题之CSS篇

人的一生&#xff0c;总是难免有浮沉。不会永远如旭日东升&#xff0c;也不会永远痛苦潦倒。反复地一浮一沉&#xff0c;对于一个人来说&#xff0c;正是磨练。因此&#xff0c;浮在上面的&#xff0c;不必骄傲&#xff1b;沉在底下的&#xff0c;更用不着悲观。必须以率直、谦…

Knife4jInsight 1.0.0 MVP 版本发布

Knife4jInsight 1.0.0 MVP 版本发布 前言系统用户平台特性主要功能后期计划的功能 平台管理OpenAPI数据源接口文档自动i18n,支持中英双语微服务OpenAPI规范数据源自动注册上报整合开源swagger-ui组件&#xff0c;平台中可进行OpenAPI规范接口设计打通开源注册中心(Nacos\Eureka…

暨南大学旅游管理《乡村振兴战略下传统村落文化旅游设计》许少辉校友——2023学生开学季辉少许

暨南大学旅游管理《乡村振兴战略下传统村落文化旅游设计》许少辉校友——2023学生开学季辉少许

SpringCloud Alibaba - Sentinel

接上文SpringCloud Alibaba - Nacos 1.Sentinel 流量防卫兵 1.1 安装与部署 和Nacos一样&#xff0c;它是独立安装和部署的&#xff0c;下载地址https://github.com/alibaba/Sentinel/releases 下载后的jar放到目录 然后配置 启动并访问,用户名密码都是 sentinel 此时就…

ISP技术概述

原本或许是为了对冲手机系统和APP设计无力感而诞生的拍照功能,现今却成为了众手机厂家除背部设计外为数不多可“卷”的地方,自拍、全景、夜景、小视频等旺盛的需求让这一技术的江湖地位迅速变化。对圈内人士而言,这一波变化带来的后摄、双摄、多摄、暗光、防抖、广角、长焦、…

软件定制开发具有以下特点|APP搭建|小程序

软件定制开发具有以下特点|APP定制|小程序 一、快速响应用户需求 软件定制开发的优势在于&#xff0c;它可以快速响应用户的需求&#xff0c;因为它是在现有软件的基础上进行功能定制、界面定制、服务定制等改造&#xff0c;而不是从零开始进行重新设计与开发&#xff0c;所以…

Spring MVC 请求参数绑定

文章目录 默认⽀持 Servlet API 作为⽅法参数绑定简单类型参数绑定Pojo类型参数绑定⽇期类型参数&#xff08;需要配置⾃定义类型转换器&#xff09;路径变量参数 Spring MVC 是一个用于构建 Web 应用程序的框架&#xff0c;它提供了一种方便的方式来处理 HTTP 请求和响应。在 …

【java】【SpringBoot】【三】开发实用篇 基于SpringBoot整合任意第三方技术

目录 一、热部署 1、手动启动热部署 2、自动启动热部署 3、热部署范围配置 4、关闭热部署 二、配置高级 1、ConfigurationProperties 2、宽松绑定/松散绑定 3、常用计量单位绑定 4、数据校验 三、测试 1、加载测试专用属性 2、加载测试专用配置 3、web环境模拟测…

Delft3D水动力与泥沙运动模拟教程

详情点击公众号链接&#xff1a;Delft3D水动力与泥沙运动模拟教程 前沿 1.Delft3D水动力&#xff0d;泥沙模型的基本原理&#xff1b; 2.Delft3D模型正价曲线网格和边界条件构建方法&#xff1b; 3.Delft3D模型水动力及泥沙模块使用方法&#xff1b; 4.Delft3D模型泥沙运动…

数据库----- 数据库高级

1.2 多表查询分类 将多个表的数据横向的联合起来。 1、 内连接 2、 外连接 a) 左外连接 b) 右外连接 3、 交叉连接 4、 自然连接 1.2.1 内连接【inner join】 语法一&#xff1a;select 列名 from 表1 inner join 表2 on 表1.公共字段表2.公共字段语法二&#xff1a;select …

PMP考试如何报名?麻烦吗?

还是比较麻烦的&#xff0c;PMP考试不是国内的考试&#xff0c;要报两次名&#xff0c;报名条件也很严格&#xff0c;PMP考试报名需要先在PMI网站进行英文报名&#xff0c;英文报名成功后才能在中国国际人才交流基金会网站进行中文报名&#xff0c;具体说明如下。 一、PMP考试…

求链表的倒数第k个节点

思路&#xff1a;利用快慢指针空间差 代码&#xff1a; struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {// write code herestruct ListNode* slow pListHead;struct ListNode* fast pListHead;while(k--){if(fastNULL){return NULL;}fastfast->…