北邮22信通:你是不是在looking for……那串代码?(2)第三章单链表

news2024/9/23 13:30:10

相信有了第二章顺序表的基础,小伙伴们学习第三章链表应该会轻松一点吧

目录

类模板下的单链表

1.1书上干净完整代码(无增改、适合自己动手实验)

1.2对书上代码的完善和对一些问题的验证和解释代码

1.补全一个函数:

2.this指针:

3.关于printlist函数的一点说明:(增改后代码第117行)

4.getlength函数最后一步为什么是--cnt(增改后代码第136行):

5.增改后代码:

6.增改后代码效果图:

 7.增改后代码运行效果:


类模板下的单链表

1.1书上干净完整代码(无增改、适合自己动手实验)

下面是书上单链表实现通信录的干净完整代码,基本一字不差~  有需要的友友可以拿走~

#include <iostream>
using namespace std;

class phonebook
{
private:
	int ID;
	string name;
	string phone;
	string group;
public:
	phonebook() {};
	phonebook(int ID, string name, string phone, string group)
	{
		this->ID = ID;
		this->name = name;
		this->phone = phone;
		this->group = group;
	}
	void print()
	{
		cout << this->ID << " " << this->name << " "
			<< this->phone << " " << this->group << endl;
	}
	bool operator==(phonebook& p)
	{
		return (p.ID == this->ID) ? true : false;
	}
};

template<class temp>
struct node
{
	temp data;
	node* next;
};

template <class temp>
class linklist
{
private:
	node<temp>* front;
public:
	linklist()
	{
		this->front = new node<temp>;
		this->front->next = nullptr;
	}
	linklist(temp a[], int n);
	~linklist();
	void printlist();
	int getlengh() {};
	node<temp>* get(int i);
	int locate(temp x);
	void insert(int i, temp x);
	temp del(int i);
};

//头插法
template<class temp>
linklist<temp>::linklist(temp a[], int n)
{
	this->front = new node<temp>;
	this->front->next = NULL;
	for (int i = n - 1; i >= 0; i--)
	{
		node<temp>* s = new node<temp>;
		s->data = a[i];
		s->next = this->front->next;
		this->front->next = s;
	}
}

//尾插法
/*
template<class temp>
linklist<temp>::linklist(temp a[], int n)
{
	this->front = new node<temp>;
	node<temp>* r = this->front();
	for (int i = 0; i < n; i++)
	{
		node<temp>* s = new node<temp>;
		s->data = a[i];
		r->next = s;
		r = s;
	}
	r->next = NULL;
}
*/

template<class temp>
linklist<temp>::~linklist()
{
	node<temp>* p = this->front;
	while (p != NULL)
	{
		this->front = p;
		p = p->next;
		delete front;
	}
}

template<class temp>
void linklist<temp>::printlist()
{
	node<temp>* p = this->front->next;
	while (p != NULL)
	{
		p->data.print();//数据域中的print方法(需要用户自定义)
		p = p->next;
	}
	cout << endl;
}

//按位置查找,返回地址
template<class temp>
node<temp>* linklist<temp>::get(int i)
{
	node<temp>* p = this->front->next;
	int j = 1;
	while (p != NULL && j != i)
	{
		p = p->next;
		j++;
	}
	return p;
}

//按值查找,返回位置
template<class temp>
int linklist<temp>::locate(temp x)
{
	node<temp>* p = this->front->next;
	int j = 1;
	while (p != NULL)
	{
		if (p->data == x)return j;
		p = p->next;
		j++;
	}
	return -1;//如果没有找到,返回无效值
}

template <class temp>
void linklist<temp>::insert(int i, temp x)
{
	node<temp>* p = this->front;
	if (i != 1)
		p = get(i - 1);//get(i - 1)表示要插入的位置的前一个结点地址
	if (p != NULL)
	{
		node<temp>* s = new node<temp>;
		s->data = x;
		s->next = p->next;
		p->next = s;
	}
	else
	{
		cout << "插入位置错误:" << endl;
		exit(0);
	}
}

template<class temp>
temp linklist<temp>::del(int i)
{
	node<temp>* p = this->front;
	if (i != 1)p = get(i - 1);
	node<temp>* q = p->next;
	p->next = q->next;
	temp x = q->data;
	delete q;
	return x;
}

int main()
{
	phonebook pbook[4] =
	{
		{20181208,"mary","13011221827","classmates"},
		{20181127,"tom","13934621123","family"},
		{20181156,"john","1324579880","classmates"},
		{20181133,"lisa","1378001822","teacher"}
	};
	phonebook record(20181209, "phoenix", "1590209020", "teacher");
	linklist<phonebook>list(pbook, 4);
	cout << "通信录内容列表:" << endl;
	list.printlist();

	list.insert(1, record);
	cout << "通信录内容列表:" << endl;
	list.printlist();

	phonebook x = list.del(3);
	cout << "删除元素:" << endl;
	x.print();

	cout << "通信录内容列表:" << endl;
	list.printlist();

	int p = list.locate(record);
	cout << "phoenix的位置是:" << p << endl;

	return 0;
}

代码效果图:

 

运行效果图:

1.2对书上代码的完善和对一些问题的验证和解释代码

(自己增改部分已经在代码中标明,有助于友友们对问题的理解)

1.补全一个函数:

        书上没有对getlength函数做定义,本代码已经补全;

2.this指针:

        “this->”,是个指针,p用没有,就是本人觉得写着顺手,看代码的时候直接忽略即可~

3.关于printlist函数的一点说明:(增改后代码第117行)

        为什么printlist函数是从this->front->next开始打印数据,而不是this->front呢?

        因为无论在显示构造函数还是隐式构造函数中,都没有对头结点的数据域赋值

        如果我们将this->front->next改成this->front:程序不会报错,但是会在头结点数据域输出的位置输出一串乱码。这代表头结点的存储地址。

        为了便于验证,我们在linklist中添加了getfront函数,用来输出头结点的数据域。

        (见增改后代码第51行函数声明)验证结果已在运行框中显示。

4.getlength函数最后一步为什么是--cnt(增改后代码第136行):

        其实有了说明3的解释,相信大家应该都能大概明白,这个顺序表的实际长度确实是cnt的,但是因为头结点默认不存放有效数据,所以考虑有效长度时不将其算在内。

5.增改后代码:

#include <iostream>
using namespace std;

class phonebook
{
private:
	int ID;
	string name;
	string phone;
	string group;
public:
	phonebook() {};
	phonebook(int ID, string name, string phone, string group)
	{
		this->ID = ID;
		this->name = name;
		this->phone = phone;
		this->group = group;
	}
	void print()
	{
		cout << this->ID << " " << this->name << " "
			<< this->phone << " " << this->group << endl;
	}
	bool operator==(phonebook& p)
	{
		return (p.ID == this->ID) ? true : false;
	}
};

template<class temp>
struct node
{
	temp data;
	node* next;
};

template <class temp>
class linklist
{
private:
	node<temp>* front;
public:
	linklist()
	{
		this->front = new node<temp>;
		this->front->next = nullptr;
	}
	linklist(temp a[], int n);
	~linklist();
	temp getfront();//自己增加部分 书上无
	void printlist();
	int getlengh();
	node<temp>* get(int i);
	int locate(temp x);
	void insert(int i, temp x);
	temp del(int i);
};

//头插法
template<class temp>
linklist<temp>::linklist(temp a[], int n)
{
	this->front = new node<temp>;
	this->front->next = NULL;
	for (int i = n - 1; i >= 0; i--)
	{
		node<temp>* s = new node<temp>;
		s->data = a[i];
		s->next = this->front->next;
		this->front->next = s;
	}
}

//尾插法
/*
template<class temp>
linklist<temp>::linklist(temp a[], int n)
{
	this->front = new node<temp>;
	node<temp>* r = this->front();
	for (int i = 0; i < n; i++)
	{
		node<temp>* s = new node<temp>;
		s->data = a[i];
		r->next = s;
		r = s;
	}
	r->next = NULL;
}
*/

template<class temp>
linklist<temp>::~linklist()
{
	node<temp>* p = this->front;
	while (p != NULL)
	{
		this->front = p;
		p = p->next;
		delete front;
	}
}

//自己增加部分 书上无
template<class temp>
temp linklist<temp>::getfront()
{
	node<temp>* p = front;
	temp x = p->data;
	return x;
}

template<class temp>
void linklist<temp>::printlist()
{
	node<temp>* p = this->front->next;//见说明3.
	while (p != NULL)
	{
		p->data.print();//数据域中的print方法(需要用户自定义)
		p = p->next;
	}
	cout << endl;
}

template<class temp>
int linklist<temp>::getlengh()
{
	node<temp>* p = this->front;
	int cnt = 0;
	while (p != NULL)
	{
		p = p->next;
		cnt++;
	}
	return --cnt;//见说明4
}

//按位置查找,返回地址
template<class temp>
node<temp>* linklist<temp>::get(int i)
{
	node<temp>* p = this->front->next;
	int j = 1;
	while (p != NULL && j != i)
	{
		p = p->next;
		j++;
	}
	return p;
}

//按值查找,返回位置
template<class temp>
int linklist<temp>::locate(temp x)
{
	node<temp>* p = this->front->next;
	int j = 1;
	while (p != NULL)
	{
		if (p->data == x)return j;
		p = p->next;
		j++;
	}
	return -1;//如果没有找到,返回无效值
}

template <class temp>
void linklist<temp>::insert(int i, temp x)
{
	node<temp>* p = this->front;
	if (i != 1)
		p = get(i - 1);//get(i - 1)表示要插入的位置的前一个结点地址
	if (p != NULL)
	{
		node<temp>* s = new node<temp>;
		s->data = x;
		s->next = p->next;
		p->next = s;
	}
	else
	{
		cout << "插入位置错误:" << endl;
		exit(0);
	}
}

template<class temp>
temp linklist<temp>::del(int i)
{
	node<temp>* p = this->front;
	if (i != 1)p = get(i - 1);
	node<temp>* q = p->next;
	p->next = q->next;
	temp x = q->data;
	delete q;
	return x;
}

int main()
{
	phonebook pbook[4] =
	{
		{20181208,"mary","13011221827","classmates"},
		{20181127,"tom","13934621123","family"},
		{20181156,"john","1324579880","classmates"},
		{20181133,"lisa","1378001822","teacher"}
	};
	phonebook record(20181209, "phoenix", "1590209020", "teacher");
	linklist<phonebook>list(pbook, 4);
	cout << "通信录内容列表:" << endl;
	list.printlist();

	//自己增加部分 书上无
	cout << "验证头结点数据无效:" << endl;
	phonebook y = list.getfront();
	cout << "头结点数据为:" << endl;
	y.print();
	cout << endl;

	list.insert(1, record);
	cout << "通信录内容列表:" << endl;
	list.printlist();

	phonebook x = list.del(3);
	cout << "删除元素:" << endl;
	x.print();

	cout << "通信录内容列表:" << endl;
	list.printlist();

	int p = list.locate(record);
	cout << "phoenix的位置是:" << p << endl;

	//自己增加部分 书上无
	cout << "通信录的长度为:" << endl;
	cout << list.getlengh();
	return 0;
}

6.增改后代码效果图:

 7.增改后代码运行效果:

上一篇文章:数据结构与算法  第二章 顺序表  请参考以下链接 ~

https://blog.csdn.net/bc202205/article/details/129311232?spm=1001.2014.3001.5501

写码不易,关注一下作者再走呗o(╥﹏╥)o

谢谢支持~

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

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

相关文章

荧光染料IR 825叠氮IR825 N3,IR-825 azide,IR-825叠氮 科研试剂

产品描述&#xff1a;IR-825 N3含有叠氮基团&#xff0c;IR-825是一种近红外染料&#xff08;NIR&#xff09;&#xff0c;IR-825在封装成纳米颗粒后&#xff0c;可能用于cancer光热和光动力 。叠氮化物基团可以参与铜催化的与炔部分的点击化学反应。西安凯新生物科技有限公司近…

基于多任务融合的圣女果采摘识别算法研究

基于多任务融合的圣女果采摘识别算法研究 1、简介 本文主要解决圣女果生产销售环节中&#xff0c;现有的流程是采摘成熟的圣女果&#xff0c;再对采摘下的果实进行单独的品质分级&#xff0c;不仅费时费力&#xff0c;而且多增加一个环节&#xff0c;也增加了对果实的二次伤害…

Oracle 19c之RPM安装

19c的RPM包下载链接&#xff0c; https://www.oracle.com/database/technologies/oracle19c-linux-downloads.html 可以看到&#xff0c;19c开始支持企业版本的RPM&#xff0c;容量是2.5GB&#xff0c; 使用手工方式&#xff0c;通过RPM安装19c数据库&#xff0c;只需要两步操…

汽车零部件行业MES解决方案,实现生产全过程监控

行业背景 汽车汽配行业是中国国民经济的支柱产业&#xff0c;涉及的工艺包括压铸、冲压、注塑、机加、焊接、电子、喷涂、电镀、热处理、检测、装配等。 公安部数据显示&#xff0c;平均每百户家庭拥有汽车达到60辆。广阔的市场为行业带来大量需求的同时也带来了激烈的市场竞…

【Linux】网络入门

&#x1f387;Linux&#xff1a; 博客主页&#xff1a;一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 看似不起波澜的日复一日&#xff0c;一定会在某一天让你看见坚持…

栈和队列详细讲解+算法动画

栈和队列 栈stack 栈也是一种线性结构相比数组&#xff0c;栈对应的操作数数组的子集只能从一端添加元素&#xff0c;也只能从一端取出元素这一端称为栈顶 栈是一种后进先出的数据结构Last in Firt out(LIFO)在计算机的世界里&#xff0c;栈拥有者不可思议的作用 栈的应用 …

设计UI - Adobe xd对象介绍

矩形工具 新建矩形 操作步骤&#xff1a;选择矩形工具&#xff0c;快捷键R&#xff0c;鼠标在画板上拖出矩形即可。 拖动定界框周围圆形手柄&#xff0c;可快速调整矩形大小&#xff0c;也可以输入宽和高的参数对矩形大小进行改变。 移动矩形 操作步骤&#xff1a;选择选择工具…

AWS-解析mysql binlog同步数据方案

虽然是公有云的鼻祖&#xff0c;AWS在某些产品的实现却太不给力&#xff1b;可能是习惯了阿里云喂到嘴边的感觉&#xff0c;AWS很多方案需要自己折腾&#xff0c;蛋疼&#xff01;比如这里要讲的mysql数据同步方案。阿里云产品DTS&#xff0c;点几下就OK了&#xff0c;AWS&…

06_01_Spark SQL

Spark SQL 课程目标 说出Spark Sql的相关概念说出DataFrame与RDD的联系独立实现Spark Sql对JSON数据的处理独立实现Spark Sql进行数据清洗 1、Spark SQL 概述 Spark SQL概念 Spark SQL is Apache Spark’s module for working with structured data. 它是spark中用于处理结…

百家号如何写文章赚钱,百家号写文章真的赚钱?

随着互联网的快速发展&#xff0c;越来越多的人开始关注到写文章赚钱这个领域。而在众多写作平台中&#xff0c;头条号无疑是最受欢迎的一个。那么&#xff0c;百家号写文章赚钱是真的吗&#xff1f;如何写文章赚钱呢&#xff1f;下面我们就来一一解答。 首先&#xff0c;百家号…

Javascript的ES6 class写法和ES5闭包写法性能对比

看到很多闭包写法的函数, 一直怀疑它对性能是否有影响. 还有就是备受推崇的React Hooks函数式写法中出现大量的闭包和临时函数, 我很担心这样会影响性能. 于是, 做了一个实验来做对比. 这个实验很简单, 用md5计算一百万次. 计算过程将结果再放回参数, 这样避免结果没被引用被…

Git 学习(三)—— 本地仓库 — 远程仓库的操作命令

为了可以让其他用户看到自己的成果&#xff0c;我们可以将自己本地仓库的内容上传到远程仓库&#xff1b;如果我们希望借鉴其他用户的成果&#xff0c;我们可以将远程仓库里的一些内容拉取或者克隆到本地仓库。 这里先暂不考虑 本地到远程 或者 远程到本地 的一些相关操作&…

避坑指南—GPL开源协议

0x00 前言 本文主要目的是为了了解一些基础的GPL注意事项&#xff0c;以及防止被一些一知半解的人蒙骗。本文不做任何内容的依据&#xff0c;仅为个人见解&#xff0c;仅供参考。 一些常见的开源协议 GPLBSDMITMozillaApacheLGPL 0x01 GPL GPL许可协议(GNU General Public …

知识点——域适应、域泛化、在线测试适应区别 DA、DG、TTA区别

文章目录1.Domain Adaptation( DA&#xff1a;域适应 )源域和目标域&#xff1a;DA研究问题&#xff1a;DA目标&#xff1a;DA主要思想&#xff1a;DA三种方法&#xff1a;2.Domain generalization( DG&#xff1a;域泛化 )DG研究问题&#xff1a;DG目标&#xff1a;DA和DG优点…

css——图片缩放,拉伸,变形的解决办法

你的图片即将变得超级丝滑图片为什么会拉伸变形&#xff1f;怎么解决&#xff1f;css的object-fit属性object-fit属性有什么用介绍一下object-position举个小栗子图片为什么会拉伸变形&#xff1f; 前端布局时&#xff0c;图片会出现拉伸、缩放和变形的原因可能有多种: 1.例如图…

2.3操作系统-存储管理:页式存储、逻辑地址、物理地址、物理地址逻辑地址之间的地址关系、页面大小与页内地址长度的关系、缺页中断、内存淘汰规则

2.3操作系统-存储管理&#xff1a;页式存储、逻辑地址、物理地址、物理地址逻辑地址之间的地址关系、页面大小与页内地址长度的关系、缺页中断、内存淘汰规则页式存储逻辑地址、物理地址如何判断物理地址和逻辑地址它们之间的地址关系&#xff1f;页面大小与页内地址长度的关系…

现货交易入门之垂死挣扎

本文讲解的也是挣扎形态&#xff0c;前面以已经讲过一个挣扎形态&#xff0c;但是本文这个形态的名字更让人能耳目一新&#xff0c;因为它叫“垂死挣扎线”&#xff0c;这并不是普通的挣扎线。是“垂死”的&#xff01; “垂死挣扎线”与“顶部挣扎线”很相似&#xff0c;都是出…

JavaApi操作ElasticSearch(强烈推荐)

ElasticSearch 高级 1 javaApi操作es环境搭建 在elasticsearch官网中提供了各种语言的客户端&#xff1a;https://www.elastic.co/guide/en/elasticsearch/client/index.html 而Java的客户端就有两个&#xff1a; 不过Java API这个客户端&#xff08;Transport Client&#…

element-ui日期选择器时间差

关于使用element-ui日期选择器时&#xff0c;发现时间差问题&#xff0c;特此记录下 #主要记录三个问题 日期选择器选择时获取到的格式相差八小时当日期格式为–拼接时&#xff0c;转成时间戳会相差八小时&#xff08;2023-03-09&#xff09;DatePicker设置区域范围和校验&…

TiDB数据库架构概述

文章目录TiDB体系架构TiDB ServerStorage Cluster(存储引擎)PD cluster题目TiDB体系架构 TiDB Server Sql语句最先到达 TiDB Server集群 它是无状态的&#xff0c;数据并不是存储在这里面&#xff0c;当一个会话连接到TiDB Server集群上&#xff0c;sql语句发过来&#xff0c…