《数据结构之链表篇》--单向链表的C++实现

单向链表的插入、删除(c++实现) 目录前言单向链表插入节点实现代码单向链表删除节点实现代码整个项目的完整代码运行截图总结 前言 本篇文章主要接着上文的c++实现单向链表进一步实现单向链表的插入、删除。 单向链表插入节点 在单向链表中插入新节点犹如给一列火车加入新的车厢,而根据新节点插入位置的不同,分为三种不同的插入处理方式具体分析如下: 1.当在链表头部插入节点,只需把新节点的指针指向链表原来的第一个节点,再把链表头指针指向新节点... 阅读详情

节点类Node的实现:

头文件:

#pragma once
#ifndef NODE_H_
#define NODE_H_

#include<iostream>
using namespace std;

class Node
{
public:
	int data;
	Node *next;
	void printNode();
};


#endif // !NODE_H_


--CPP文件:
#include "Node.h"

void Node::printNode()
{
	cout << data << endl;
}


--单向链表的实现:
--头文件:

#pragma once
#ifndef LIST_H_
#define LIST_H_

#include"Node.h"
#include<iostream>
using namespace std;

class List
{
public:
	List();
	~List();
	void ClearList();	//清空链表
	bool ListEmpty();	//判空链表
	int ListLength();	//链表长度
	bool GetElem(int i, Node *pNode);	//获得指定元素
	int LocateElem(Node *pNode);	//找寻指定节点
	bool PriorElem(Node *pCurrentNode, Node *pPreNode);	//获得指定节点的前一个节点
	bool NextElem(Node *pCurrentNode, Node *pNextNode);	//获得指定节点的后一个节点
	void ListTraverse();	//遍历链表
	bool ListInsert(int i, Node *pNode);	//在链表指定位置插入元素
	bool ListDelete(int i, Node *pNode);	//在链表指定位置删除元素
	bool ListInsertHead(Node *pNode);	//在链表头插入元素
	bool ListInsertTail(Node *pNode);	//在链表尾部插入元素
private:
	Node *m_pList;
	int m_iLength;
};


#endif // !LIST_H_

--CPP文件:

#include "List.h"

List::List()
{
	m_pList = new Node;
	m_pList->data = 0;
	m_pList->next = NULL;
	m_iLength = 0;
}

List::~List()
{
	ClearList();
	delete m_pList;
	m_pList = NULL;
}

void List::ClearList()
{
	Node *currentNode = m_pList->next;
	while (currentNode!=NULL)
	{
		Node*temp = currentNode->next;
		delete currentNode;
		currentNode = temp;
	}
	m_pList = NULL;
}

bool List::ListEmpty()
{
	return m_iLength == 0 ? true : false;
}

int List::ListLength()
{
	return m_iLength;
}

bool List::GetElem(int i, Node * pNode)
{
	if (i < 0 || i >= m_iLength)
	{
		return false;
	}

	//获取第i个节点
	Node *currentNode = m_pList;
	Node *currentNodeBefore = NULL;
	for (int k = 0; k <= i; k++)
	{
		currentNodeBefore = currentNode;
		currentNode = currentNode->next;
	}
	pNode->data = currentNode->data;
	return true;
}

int List::LocateElem(Node * pNode)
{
	Node *currentNode = m_pList;
	int count = 0;
	while (currentNode->next != NULL)
	{
		currentNode = currentNode->next;
		if (currentNode->data == pNode->data)
		{
			return count;
		}
		count++;
	}
	return -1;
}

bool List::PriorElem(Node * pCurrentNode, Node * pPreNode)
{
	Node *currentNode = m_pList;
	Node *tempNode = NULL;
	while (currentNode->next != NULL)
	{
		tempNode = currentNode;
		currentNode = currentNode->next;
		if (currentNode->data == pCurrentNode->data)
		{
			if (tempNode == m_pList)
			{
				return false;
			}
			pPreNode->data = tempNode->data;
		}
	}
	return false;
}

bool List::NextElem(Node * pCurrentNode, Node * pNextNode)
{
	Node *currentNode = m_pList;
	Node *tempNode = NULL;
	while (currentNode->next != NULL)
	{
		currentNode = currentNode->next;
		if (currentNode->data == pCurrentNode->data)
		{
			if (currentNode->next == NULL)
			{
				return false;
			}
			pNextNode->data = currentNode->next->data;
			return true;
		}
	}
	return false;
}

void List::ListTraverse()
{
	Node *currentNode = m_pList;
	while (currentNode->next != NULL)
	{
		currentNode = currentNode->next;
		currentNode->printNode();
	}
}

bool List::ListInsert(int i, Node * pNode)
{
	if (i<0 || i>m_iLength)
	{
		return false;
	}
	Node *currentNode = m_pList;
	for (int k = 0; k < i; k++)
	{
		currentNode = currentNode->next;
	}
	Node *newNode = new Node;
	if (newNode == NULL)
	{
		return false;
	}
	newNode->data = pNode->data;
	newNode->next = currentNode->next;
	currentNode->next = newNode;
	return true;
}

bool List::ListDelete(int i, Node * pNode)
{
	if (i < 0 || i >= m_iLength)
	{
		return false;
	}
	Node *currentNode = m_pList;
	Node *curentNodeBefore = NULL;
	for (int k = 0; k <= i; k++)
	{
		curentNodeBefore = currentNode;
		currentNode = currentNode->next;
	}
	curentNodeBefore->next = currentNode->next;
	pNode->data = currentNode->data;
	delete currentNode;
	currentNode = NULL;
	m_iLength--;
	return true;
}

bool List::ListInsertHead(Node * pNode)
{
	Node *temp = m_pList->next;
	Node *newNode = new Node;
	if (newNode == NULL)
	{
		return false;
	}
	newNode->data = pNode->data;
	m_pList->next = newNode; 
	newNode->next = temp;
	m_iLength++;
	return true;

}

bool List::ListInsertTail(Node * pNode)
{
	Node *currentNode = m_pList;
	while (currentNode->next != NULL)
	{
		currentNode = currentNode->next;
	}
	Node *newNode = new Node;
	if (newNode == NULL)
	{
		return false;
	}
	*newNode = *pNode;
	newNode->next = NULL;
	currentNode->next = newNode;
	m_iLength++;
	return true;
}



        
C++实现线性表 - 02 单向链表 数据结构与算法C++代码实现之线性表单向链表部分 阅读详情

相关推荐

C++实现单向链表,双向链表,单向环形链表,双向环形链表

本文讲解了链表的四种类型以及数据结构,同时给出了四种链表的C++代码实现。

ttug22的博客 1384

C++数据结构X篇_04_单向链表框架搭建、实现和测试(链表的定义,常用操作的实现等)

本文以C中struct的形式介绍单向链表,亦提及C++中的实现方法

分享学习成长历程,Winter is coming! 905

数据结构与算法--用单向链表实现栈(C++实现)

栈是基本的数据结构。其特点是添加和删除(访问)数据都在线性表的一端(头端)。数据访问遵循先进后出(FILO)的原则。栈一般用数组或者链表来实现。数组需要静态分配数据空间,占用空间比较大。链表则根据实际需要动态分配数据空间,占用空间相对小一些。本文用单向链表实现栈。程序用C++实现。

DeeperBlue的博客 9837

数据结构 链表(二)

链表 双向链表的C++实现 #pragma once typedef struct Node { int value; Node* prev; Node* next; }node; class DoubleLinklist { private: int size; node* head; node* tail; public: DoubleLinklist(); ~DoubleLinklist(); //获取链表大小 int GetSize(); //判断是否为空 bool IsE

杨杨 175

【华为OD机试真题】单向链表中间节点(寻找链表的中间结点)(C++&java&python)100%通过率 超详细代码注释 代码深度解读

已支持(C++&java&python)原题描述 100%通过率 超详细代码注释 代码深度解读

笑着的程序员的博客 883

superpowers-中文使用说明

《obra/superpowers:AI辅助开发的流程纪律工具集》 摘要:obra/superpowers是一套面向AI辅助软件开发的系统化流程规范,包含14个核心技能,强调"先理解后行动"的纪律性开发方法。该工具集定义了从头脑风暴到代码评审的完整工作流,要求严格遵循测试驱动开发、子代理隔离执行等原则。核心特色包括:1) 任何实现前必须完成设计和评审;2) 采用红-绿-重构的TDD循环;3) 复杂任务通过独立子代理串行处理;4) 所有产出需经过双重验证(规格合规+代码质量)。该工具集特别注重文档化和可验证性

qq_22786633的博客 766

严蔚敏版数据结构(C语言版)算法实现代码

严蔚敏版数据结构(C语言版)算法实现代码数据结构(C语言版)代码实现线性表顺序表 数据结构(C语言版)代码实现 部分采用C++的语法实现 线性表 顺序表与链表 顺序表 代码如下: #include <bits/stdc++.h> using namespace std; #define MaxSize 100 #define ElemType int #define Status int #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10

weixin_45741097的博客 1万+

IIR数字滤波器原理,设计方法及嵌入式应用

基于STM32的二阶直接II型巴特沃斯低通滤波器设计方法及应用

weixin_38342580的博客 1万+

数据结构--链表(学生信息管理系统)

双向链表的学生信息管理系统

梓川枫的博客 2635

Chroma向量数据库实战:用Python快速搭建本地知识库(附中文诗词检索案例)

本文详细介绍了如何使用Chroma向量数据库和Python快速搭建本地知识库,并附有中文诗词检索的实战案例。通过解析核心概念、数据准备、向量化及智能检索实现,展示了Chroma在处理中文语义搜索时的轻量级与易用性,为开发者构建AI应用原型提供了实用指南。

weixin_29221753的博客 480

WPS和Excel通用!省市区四级联动下拉菜单保姆级教程(附最新行政区划数据包)

本文详细介绍了在WPS和Excel中实现省市区四级联动下拉菜单的完整教程,包含2024年最新行政区划数据的获取与整理方法。通过名称管理器和INDIRECT函数的组合,以及WPS的特色功能,帮助用户高效准确地录入四级行政区划信息,提升数据录入效率并减少错误。

s1t2u3的博客 611

最详细的C++单向链表实现

链表是数据结构中常见的一种数据存储形式,其在物理存储单元上是非连续的存储结构,即其数据存储的空间并非连续的内存空间。这种存储方式的优点是可以动态分配内存空间,不会造成内存的浪费和溢出,同时链表对于执行插入、删除等操作十分简便,不需要移动大量元素,但是其相对于连续空间存储的数据相比,遍历速度较慢。 1、那么链表到底长啥样呢? 链表由多个node(节点)组成,每个节点中由两部分结构组成,data中存储需要存储的数据,next为一个指针,其指向下一个node的地址。 当...

qq_41696018的博客 1万+

QT自制TCP服务器

TCP服务器 网络调试助手

大脑曝光 3627

C++ 入门算法,新手必看之:单向“链表”(一)

俗话说得好,不懂链表的程序员,不配称为C/C++程序员。 为什么呢? 链表的存储主要依据指针来实现,而指针又是C/C++独有的特性,是其他语言没有的。 今天,你点进来看了这篇博客,说明你还是不懂C/C++当中链表的算法。 不懂没关系,看了这篇博客,只要是懂得指针的小伙伴,都会学会使用单向链表。 链表是什么? 链表是线性表的链式存储方式,逻辑上相邻的数据在计算机内的存储位置不必须相邻,那么,怎么表...

cpp_learner的博客 5076

什么是 SAP S/4HANA 的 VDM Layering Architecture 的 CDS Hierarchy View

当涉及SAP S/4HANA的CDS Hierarchy View时,我们正在谈论一种高级数据建模技术,用于构建层次结构化的数据视图,以支持树状和分层数据的处理和分析。CDS(Core Data Services)是SAP的一种数据建模和定义语言,而CDS Hierarchy View则是CDS的一个重要组成部分,用于处理层次数据,如组织结构、产品分类、地理区域等。首先,您可以使用CDS语言创建一个新的CDS Hierarchy View,定义产品分类的层次结构。您还可以定义其他与库存相关的属性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 392

与OpenClaw同类性质的AI智能体框架/工具汇总(小白友好)

OpenClaw的核心定位是「开源、本地优先、可执行真实任务的AI代理」,核心价值是让AI从“聊天”落地到“动手干活”(操控电脑/服务器、处理办公/系统任务)。结合这一核心,以下是同类性质的工具/框架,按「小白易上手程度」排序,每个产品重点说明和OpenClaw的异同、核心优势及适配场景,方便小白快速区分选择。

hy行者勇哥的博客 2108

单向链表的创建与遍历(c++实现)

目录前言单向链表单向链表的创建与遍历实现代码运行截图总结 前言 这是本人第一篇博客,旨在记录梳理自己学习数据结构的过程(c++实现),另一方面也能给有需要的小伙伴一些学习上的便利,大家一起互相学习! 单向链表 在动态分配内存空间时,最常使用的就是单向链表(single linked list)。一个单向链表由节点基本由两个元素组成,即数据字段和指针,而指针将会指向下一个元素的内存所在地址。 在单向...

qq_36472818的博客 4829

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

链表【C++数据结构】

本文系统讲解链表指针原理与实现,对比std::list和vector,并深入分析了其在频繁插入/删除场景(如LRU缓存)下的独特性能优势与应用价值。

不会C++、害怕嵌入式且不爱看动漫的小趴菜 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C++实现单向链表操作(实验3--作业)

单向链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据域和一个指向下一个节点的指针域。这段 C++代码实现了一个单向链表的多种操作,包括初始化、插入、删除、查找、排序、合并和逆置等功能。

ByteMaster_的博客 1993

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

数据结构-单向链表(C语言)

snode_t;为使链表具有通用性,在节点中只定义指针部分,数据部分通过自定义结构体的方式定义。char* name;node使得my_data_t可作为节点链接在链表中,my_data_t中数据可随实际情况改变。} slist_t;单向链表中定义head和tail分别指向链表的头和尾。

m0_49408252的博客 2207

c++数据结构—单向链表

由两部分组成:数据域和指针域,每个结点都有一个指针,每个节点指针的指向都是指向自身结点的下一个结点,最后一个结点的head指向为NULL,对单链表的操作只能从一端开始,如果需要查找链表中的某一个结点,则需要从头开始进行遍历。

qq_67972375的博客 2272

单向链表c++实现

单向链表的结构 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。 设置节点类如下: class Node{ int item; Node* next; }; 其中节点指针next指向节点类型变量,从而实现链表的连接 设置链表类如下,包含一节点指针head class...

weixin_42355349的博客 960

c++实现单向链表

简单记录链表知识点,详细实现单向链表及其尾插,删除,排序等功能

qq_43575504的博客 2760

数据结构篇——链表操作的实现(单向/双向链表,单向/双向循环链表)!

本文介绍了单向链表、双向链表、单向循环链表以及双向循环链表,并附有完整代码!

jjq20020211的博客 1427

C/C++数据结构之单向链表

单向链表是由一系列节点组成的线性集合,每个节点包含两个部分:一部分是存储数据的元素,另一部分是指向下一个节点的指针。与前面介绍的数组不同,单向链表中的元素并不是连续存储在内存中的,而是通过指针相互连接起来。 公司内部的报销审批流程,与单向链表比较类似。员工提交报销申请后,会先后由组长、部门主管审批,最后由财务审核。这是一个典型的单向流程链,每个环节只关心“下一步该交给谁”,而不关心“上一步是谁处理的”。

hope_wisdom的技术博客 1045
上一篇: 《数据结构之线性篇》-线性表的C++实现
下一篇: 《数据结构之链表篇》--简单通讯录的C++实现
wingWC
博客等级 码龄10年 46粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值