单链表C++实现

单链表操作函数C++实现 最近在学习数据结构的链表,包括链表的创建、查询、删除等各种操作,刚开始接触,肯定有某些没发现的错误,欢迎大家指出来。 好了,不说废话了,直接上代码 首先是单链表的.H文件 #pragma once typedef int DataType; #define Node ElemType //定义节点 class Node { public: int value; Node* nex... 阅读详情

SingleLinkList.h

#pragma once
#ifndef SINGLELINKLIST_H
#define SINGLELINKLIST_H
//单链表
#include<iostream>
using std::cout;
using std::endl;
typedef int ElemType;

class Node {
public:
	ElemType data;
	Node* next;//看看可不可以删除struct声明
};

class singleLinkList
{
public:
	singleLinkList();
	~singleLinkList();
	bool Empty();//查看是否为空表
	void ClearList();//清空列表元素
	void GetElem(int nPos, ElemType& elem);//获得第nPos位置的元素值,并返回给elem
	bool FindElem(int elem);//查找列表中是否有elem值得元素
	void Insert(ElemType elem);//默认在列表尾部插入elem元素
	void Insert(int nPos, ElemType elem);//在第nPos位置前插入值为elem的元素
	void Delete(int nPos, ElemType& elem);//删除第nPos位置的元素,并将其值返回给elem元素
	void Delete();//默认删除尾部的元素
	int Length();//返回列表长度
	void merge(singleLinkList& L);//将所有L中不在原列表的元素插入到原列表中
	void print();//打印列表
private:
	Node* head;//头结点
};


#endif // !SINGLELINKLIST_H

 SingleLinkList.cpp

#include"SingleLinkList.h"

//构造函数
singleLinkList::singleLinkList() {
	head = new Node;//生成下一个有关联的节点
	head->next = nullptr;
}

//析构函数
singleLinkList::~singleLinkList() {
	Node* p = head;
	Node* q = nullptr;//辅助结点
	while (p->next != nullptr)
	{
		q = p;
		p = p->next;
		delete q;
	}
	if (p == head)//判断p是否移动过
	{
		delete q;
	}
	delete p;
	//delete head;//head已经被q删除了
}

//查看是否为空表
bool singleLinkList::Empty() {
	if (head->next == nullptr)
		return true;
	return false;
}

//清空列表元素,除头结点外
void singleLinkList::ClearList() {
	if (!Empty())
	{
		Node* p = head->next;
		Node* q = nullptr;//辅助结点
		while (p->next != nullptr)
		{
			q = p;
			p = p->next;
			delete q;
		}
		if (p == head->next)//判断p是否移动过
		{
			delete q;
		}
		delete p;
		head->next = nullptr;//一定要加这一句,否则head->next就是未知的,析构时会报错
	}
}


//在第nPos位置前插入值为elem的元素
void singleLinkList::Insert(int nPos, ElemType elem) {
	Node* p = head;//第一个移动的节点
	Node* q, * s;//q存放前一个结点的信息,s是新加入的节点
	int i = 0;//定义节点下标从1开始
	while (p->next != nullptr && i < nPos)//考虑刚好p是nullptr且插入位置就在这里
	{
		q = p;
		p = p->next;
		++i;
	}
	if (p->next == nullptr)
	{
		if (i == (nPos - 1))//如果此时恰好p为尾结点,且nPos是尾结点后一位的下标
		{
			s = (Node*)new Node[1];
			s->data = elem;
			s->next = nullptr;
			p->next = s;
			return;
		}
		cout << "The position is too large!" << endl;
		return;
	}
	else
	{
		s = (Node*)new Node[1];
		s->data = elem;
		s->next = p;
		q->next = s;
	}

}

//默认在列表尾部插入elem元素
void singleLinkList::Insert(ElemType elem) {
	Node* p = head, * s;
	while (p->next != nullptr)//寻找到最后一个结点
		p = p->next;
	s = (Node*)new Node[1];
	p->next = s;
	s->next = nullptr;
	s->data = elem;

}

//删除第nPos位置的元素,并将其值返回给elem元素
void singleLinkList::Delete(int nPos, ElemType& elem) {
	Node* p = head;//第一个移动的节点
	Node* q = nullptr;//q存放前一个结点的信息,s是新加入的节点
	int i = 0;
	while (p->next != nullptr && i < nPos)
	{
		q = p;
		p = p->next;
		++i;
	}
	if (p->next == nullptr)
	{
		if (i == nPos)//如果此时恰好p为尾结点,且nPos是尾结点的下标
		{
			elem = p->data;
			q->next = nullptr;
			delete p;
			return;
		}
		cout << "The position is too large!" << endl;
		return;
	}
	else
	{
		elem = p->data;
		q->next = p->next;
		delete p;
	}
}

//默认删除尾部的元素
void singleLinkList::Delete() {
	Node* p = head;
	Node* q = nullptr;
	while (p->next != nullptr) {
		q = p;
		p = p->next;
	}
	q->next = nullptr;
	delete p;
}

//打印列表
void singleLinkList::print() {
	cout << "列表元素是: ";
	if (!Empty())
	{
		Node* p = head->next;
		while (p != nullptr)
		{
			cout << p->data << " ";
			p = p->next;
		}
		cout << endl;
	}
	else
	{
		cout << "The list is empty!" << endl;
		return;
	}
}

//获得第nPos位置的元素值,并返回给elem
void singleLinkList::GetElem(int nPos, ElemType& elem) {
	if (!Empty())
	{
		Node* p = head->next;
		Node* q = nullptr;
		int i = 1;//与nPos保持同步
		while (p != nullptr && i <= nPos)
		{
			++i;
			q = p;
			p = p->next;
		}
		if (p==nullptr)
		{
			if (i == nPos+1)//如果nPos就是列表的尾部结点
				elem = q->data;
			else
			{
				cout<< "The position is too large!" << endl;
				return;
			}
		}
		else
		{
			elem = q->data;
		}
	}
	else
		cout << "The list is empty!" << endl;
}

//查找列表中是否有elem值的元素
bool singleLinkList::FindElem(int elem) {
	if (!Empty())
	{
		Node* p = head->next;
		while (p!=nullptr)
		{
			if(elem==p->data)
				return true;
			p = p->next;
		}
	}
	return false;
}

//返回列表长度
int singleLinkList::Length() {
	if (!Empty())
	{
		Node* p = head->next;
		int i = 0;
		while (p!=nullptr)
		{
			++i;
			p = p->next;
		}
		return i;
	}
	return 0;
}

main.cpp

#include"SingleLinkList.h"



int main()
{
	singleLinkList list;
	ElemType a,b;
	for (int i = 1; i < 10; i++)
	{
		list.Insert(i,i);
	}
	list.print();
	list.Insert(1, 10);
	list.print();
	list.Insert(13, 10);
	list.Delete();
	list.print();
	list.Delete(1,a);
	list.print();
	cout << a << endl;
	cout <<"--------------"<< endl << endl;
	list.GetElem(8, b);
	cout << b << endl;
	cout << list.FindElem(4) << "     " << list.FindElem(16) << endl;
	cout << list.Length() << endl;
	list.ClearList();//这一部分会报错,我也没懂为什么错了,感觉没错,ε=(´ο`*)))唉,可能是ClearList()与析构函数冲突了,但是我觉得没冲突
	//修改出来了,删除完其他元素后,头指针虽然没删除,但是头指针的next属性却是未知的,应该给其赋nullptr
	cout << list.Length() << endl;
	return 1;
}

 

C++实现单链表的基本操作 C++实现单链表的基本操作 包含了单链表的创建、插入、删除、排序、输出等功能。 //C++实现单链表的基本操作 #include&lt;iostream&gt; #include&lt;algorithm&gt; using namespace std; #define ERROR 1; typedef int ElemType; typedef int Status; //定义单链表中每个节点... 阅读详情

相关推荐

C++实现单链表反转

一.写在前面的话: 找工作必须是全方位重点突击,准备工作可以从两方面着手,第一是公司的笔试环节,应该注重刷题。第二是公司的面试环节,对自己写在简历上的东西一定要熟悉,主要以项目中所涉及到的C++编程技术为主。 二.今日份编程练习 《C++实现单链表的反转》 实现思路: 1.如果单链表为空或者只有一个元素,那么就直接返回。 2.设置两个前后相邻的指针p,q,将p指针所指向的节点作为q所指...

weixin_40260504的博客 8660

单链表(c++)

//main.cpp #include #include "singleLinkList.h" using namespace std; int main(int argc,char * argv[]) { SingleLink sl; int value; int i; cout<<"\t\t\t\t\t单链表\n"; while(1) {

小塔博客 1386

单链表的实现(cpp)

单链表的实现(cpp版本) ***链表节点的定义 *** template <class T> struct LinkNode //节点类 { T Data; //节点的数据 LinkNode *Next; //指向该节点的下一个节点的指针 LinkNode() : Next(NULL) { cout << "please enter data: "; cin >> Data; }

in_va的博客 748

数据结构--单链表single linked list数据结构C++实现

2018年2月开始学习的 C++ Primer,到今天2019年3月已经整整一年了,非常感谢在一起交流的小伙伴,是你们的无私帮助和分享使得我能跨越很多技术的坑,感谢你们!期待我们2019年一起拿下《数据结构与算法》以及Python入门。 我的github代码链接https://github.com/hitskyer/course/tree/master/dataAlgorithm/chenmi...

Michael是个半路程序员 1764

C++模版类实现单链表

单链表是一种基本的数据结构,它由一系列节点组成,每个节点都包含存储数据的值和一个指向列表中下一个节点的指针。如果当前节点是列表的最后一个节点,则该指针为null。单链表的实现原理;类的设计、封装;设计抽象类list并让单链表继承自list,是为了和顺序表、双链表配合,利用(纯)虚函数实现多态。通过使用C++模板,我们创建了一个灵活且类型无关的单链表数据结构。这样的实现使得单链表能够适应不同类型的数据存储需求,极大地增强了代码的复用性和扩展性。

程序猿老樊的博客 1326

单链表的基本操作(c++实现)

(1)编程实现单链表的基本操作:建立单链表,查找单链表,插入单链表,删除单链表; (2)采用单链表结构编程实现:两个有序单链表的归并运算。 /* (1) */ #include <iostream> typedef struct LNode{ int data; struct LNode *next; }LNode,*LinkList; bool InitList(...

路漫漫小菜狗的博客 4855

C++实现单链表实现以及链表反转

C++实现单链表以及链表反转 链表反转思路:将链表的第一个元素从链表中脱离,作为反转后的最后一个元素,也是新链表刚开始的一个元素,之后依次将其余元素依次头插入第一个元素。主要需要3个Node临时变量。一个为空,作为第一个元素的下一个元素;一个临时存储原来链表被截取之后的首个地址;一个作为循环条件,依次将从原链表中取下元素赋值给该元素,进行循环判断。 //linklist.h #ifndef LINKLIST_H #define LINKLIST_H typedef int DataType; stru

weixin_45492457的博客 788

SPI模式下的SD卡读写,为什么你的数据总出错?详解时序与状态机避坑指南

本文深入探讨SPI模式下SD卡读写数据出错的根本原因,提供时序优化与状态机设计的实战指南。针对时钟周期计数、状态机跳转和忙检测等核心问题,详解命令时序细节、状态机同步策略及高级避坑技巧,帮助开发者提升SD卡在SPI模式下的稳定性和性能。

weixin_30514745的博客 261

C++实现单链表基本操作

C++实现单链表基本操作 本博客按照上篇博客线性表单链表的基本操作而写出的完整代码,详情请看单链表基础概念 #include<iostream> using namespace std; //函数结果状态代码 #define OK 1 #define ERROR 0 typedef int Status; // Status 相当于 int typedef ...

diviner_s的博客 5758

Seedance 2.5本地部署指南:AI生图与视频生成的完整实践

最近在AI生成内容领域,本地部署方案越来越受到开发者关注。特别是Seedance 2.5的发布,让很多原本依赖云端服务的用户开始转向本地化解决方案。本文将从实际使用角度出发,完整介绍Seedance 2.5的本地部署流程、功能特性对比以及实际应用技巧。 1. Seedance 2.5核心特性解析 1.1 什么是Seedance 2.5 Seedance 2.5是一款开源的AI生图和视频生成工具,支持在本地环境运行,无需联网即可实现高质量的图像和视频生成。相比之前的2.0版本,2.5在生成质量、运行效率和功能

weixin_42566121的博客 1656

agent-browser OpenClaw 的最佳搭档

agent-browser 是专为 AI Agent 设计的浏览器自动化工具,目前被公认为 OpenClaw 的最佳配套方案。这份技术文档完整记录了其架构、协议、性能调优与常见问题处理,非常适合想让OpenClaw 真正“上手”互联网的开发者与老用户。

liu_zhiyi的博客 1779

C++实现单链表

C++实现单链表单链表单链表的实现定义一个结点类定义一个LinkList类1.单链表的初始化和销毁 单链表 线性表的链式存储结构成为链表。 在链表中每个结点中包含后继结点的地址信息,这称为指针域,这样可以通过一个结点的指针域找到后继结点的位置。如果每个结点只设置一个指针域,用于指向其后继结点,这样构成的链表称为线性单向连接表,简称单链表。 单链表的实现 单链表的初始化和销毁 采用尾插法建立单链表 输出单链表 求单链表的长度 判断单链表是否为空 求单链表某个位置的元素值 查找元素 插入元素 删除元素 定义

bobi1024的博客 1万+

PX4无人机PID调参实战:从零到稳定飞行的关键步骤

本文详细介绍了PX4无人机PID调参的实战步骤,从理解双环控制结构到实战调参三部曲,帮助飞手解决飞行抖动、电机发热等常见问题。通过分析飞行日志、调整速率环P值、引入积分I和微调角度环与微分D,实现从零到稳定飞行的关键跨越,是无人机飞控调试的必修课。

weixin_29269441的博客 526

栈的C++单链表实现

使用C风格的实现,栈的内部使用单链表结构实现。实现接口为:创建表头、入栈、出栈、反转、打印、清空 代码结构如下: SingleList.h:数据结构的声明和定义 main.cpp:测试数据结构: SingleList.h: #pragma once #include<iostream> #include<string.h> using namespace st...

m0_38084180的博客 883

【毕设全程指导】基于YOLOv8的包装商品检测与可视化系统(SKU110K实战)

本文介绍了一个基于YOLOv8的包装商品检测与可视化系统毕业设计方案。项目采用SKU110K数据集,通过CSV转TXT格式转换适配YOLO模型训练,包含详细的环境搭建、模型配置和训练流程。系统实现了包装商品的自动化检测,并开发了Tkinter可视化界面进行交互式检测展示。该方案结合产业应用需求与技术深度,既具备实用价值,又能充分展示学生的技术能力,适合作为计算机视觉相关专业的毕业设计选题。整个项目从数据准备到界面开发完整覆盖,帮助学生系统掌握目标检测项目的完整实现流程。

LXY_LOVE36的博客 145

华为OD机试 - 跳房子I(Java 双机位A卷 100分)

可行的两步组合有 [1, 2] (索引和 0+3=3)、[1, 2] (索引和 0+4=4)、[4, 2] (索引和 1+3=4)、[4, 2] (索引和 1+4=5)、[5, 2] (索引和 2+3=5)、[5, 2] (索引和 2+4=6)。此样例有多种组合满足两回合跳到最后,譬如[-1,9], [2,6],其中[-1,9]的索引和为0+3=3, [2,6]的索引和为1+4=5, 所以索引和最小的步数组合为[-1,9].[3, 2] 和 [1, 4] 都满足和等于 5,且索引和均为 3。

学Java,找哪吒 4508

单链表的c++实现

title: 单链表的c++实现 date: 2018-03-21 15:33:14 categories: leetcode与算法 tags: - 链表 - 单链表 这个一篇单链表的c++实现小练习 #include<iostream> using namespace std; /** * 单链表的c++实现 */ struct node { ...

Pop_Rain的博客 341

Transformer 面试题及详细答案120道(1-10)-- 基础概念

本文总结了Transformer模型的10个常见面试问题及答案,涵盖了其核心结构、创新点、工作机制等关键知识点。主要内容包括:Transformer的自注意力机制和多头注意力机制创新点,相比RNN/CNN的优势,模型在《Attention Is All You Need》论文中的提出背景,以及Encoder-Decoder协同工作流程等。重点解析了位置编码的作用、长距离依赖处理能力、与传统注意力机制的区别等核心问题。每个问题都给出了简明扼要的专业解答,适合作为Transformer相关面试准备的参考资料。

大剑师兰特的GIS世界 849

单链表的C++实现

数据结构之单链表(C++实现) 单链表每个结点分为数据域和指针域,数据域用于存放数据,指针域用于存放指向下一个结点的指针,即存放下一个结点的地址 定义结点 //typedef int Elemtype; typedef struct node { Elemtype data; //数据域 用于存放数据 struct node *next; //指针域 用于存放指向下一个结点地址的指...

cxiaobaia的博客 352

YOLOv5改进 | 多尺度特征提取 | 结合多样分支块及融合的高级设计(CVPR2021)

YOLOv5改进 | 多尺度特征提取 | 结合多样分支块及融合的高级设计(CVPR2021)

qq_44224801的博客 2067

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

数据结构——单链表的C++实现

数据结构——单链表的C++实现 \qquad单链表的创建、求长度、查找、插入和删除的C++实现。 #include<iostream> using namespace std; //1.定义 struct Node { int num; Node* next; }; typedef Node* List; void input(int* a) { cin >> *a; } //2.创建链表 void CreateList(List* L, int n, void (*inp

zxr916的博客 535

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C++单链表的类实现

#include<iostream> using namespace std; template<class DataType> struct Node { DataType data; Node<DataType> *next; }; template<class DataType> class LinkList { publi...

qq_38236355的博客 909

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C++ 实现单链表

C++ 实现单链表 基本思路 首先创建一个结点类,在单链表中需要有头结点、尾结点、当前结点、结点数目,此处将head头结点定义为一个不带值的结点,同时将其下标设置为0,这样就做到了插入的是第几个元素,则该元素下标就是多少,curr指当前节点的前一个结点,这样方便结点的插入。 代码实现 #include <iostream> using namespace std; template <typename T> class Node { public: T value;

Slatter的博客 411
上一篇: 顺序表C++实现
下一篇: 双向链表C++实现
-Gentle-
博客等级 码龄8年 80粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值