单链表之C++实现

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

        在实现单链表时要注意对单链表的逻辑存储、物理存储有清晰的概念。

如上图链表已经完成,其逻辑结构如上。当需要对其进行操作,比如插入、删除,通常需要引

入指针,如上的ptr1、ptr2。在编程时一定要注意通过ptr1、ptr2对链表结构的操作是正确的。

而不仅仅是你觉得正确的。

 

下面给大家看下我的单链表的实现,错误之处还请指正。

1、VC6实现,包括三个文件:sll.h、sll.c、main.c

 

2、sll.h单链表类、结点类的说明

#ifndef _SLL_H_
#define _SLL_H_

//加以下两句是为了使链表中包含的数据类型可以更灵活
#define dataType int
#define endOfData 0

//单链表的节点
class node
{
public:
	dataType data;
	node *next;
};

//单链表,其中保存的元素为整数
class sll
{
public:
	sll();				//构造函数
	~sll();				//析构函数
	void create();			//建立一个链表
	int getLength();			//获取链表长度
	void reverse();			//链表倒置
	bool insert(int pos,dataType num);  //插入某一位置的某一值.插入成功返回true;否则返回false.位置从0开始向上累加
	void del(dataType num);		//删除某一所有值
	node* getHead();			//获取链表头
	void print();                       //打印所有元素
	int find(dataType num);             //在链表中寻找num.若找到返回首次找到的下标,若找不到则返回-1
	dataType getNum(int pos);           //根据pos找到对应结点的data域的值,若找不到则返回endOfData

private:
	node *head;			//链表头指针
};

#endif

 

3、sll.c单链表类成员函数的实现

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

sll::sll()       //构造函数
{
	head = NULL;
}

sll::~sll()      //析构函数
{
	node *ptrNode = head;
	node *ptrNodeTmp = NULL;

	while(ptrNode != NULL)
	{
		ptrNodeTmp = ptrNode->next;
		delete ptrNode;
		ptrNode = ptrNodeTmp;
	}
}

void sll::create()
{
	node *ptrNode = new node;
	ptrNode->data = endOfData;
	head = ptrNode;              //保存头结点指针

	bool flag = true;            //flag=true继续建单链表,flag=false链表建立完成
	bool flagNumOne = true;      //flagNumOne表示是链表的第一个元素
	dataType data = endOfData;   //dataType和endOfData在sll.h中定义

	while(flag)
	{
		cout<<"输入节点数据: ";  //一个一个的输入结点
		cin>>data;

		if(data != endOfData)    
		{                        //没有输入建链表结束标志endOfData,则继续建链表
			if(!flagNumOne)
			{
				node *tmpPtr = new node;

				ptrNode->next = tmpPtr;
				ptrNode = tmpPtr;
			}

			ptrNode->data = data;

			flagNumOne = false;
		}
		else
		{                        //输入结束标志endOfData,则结束建链表
			flag = false;
			ptrNode->next = NULL;
		}
	}

	if(head->data == endOfData)       //链表为空的情况
	{
		head = NULL;
		delete ptrNode;          //如果链表中没有元素,则要释放程序申请的唯一结点
	}
}

int sll::getLength()
{
	int num = 0;
	node *ptrNode = head;

	while(ptrNode != NULL)
	{
		num++;                     //未到链表结尾则继续累加
		ptrNode = ptrNode->next;   //链表延展
	}

	return num;
}

void sll::del(dataType num)
{
	//ptrNodeMain和ptrNodeAssit在起始时是指向同一结点的,以后都是指向一前一后的两个点,ptrNodeAhead在前(更接近链表结束)
	node *ptrNodeAhead = head;
	node *ptrNodeFellow = ptrNodeAhead;

	while(ptrNodeAhead != NULL)       //链表要从头找到尾,删除链表中所有等于num的结点
	{
		while(ptrNodeAhead->data != num && ptrNodeAhead->next != NULL)  //未找到num结点,也未到链表结尾,指针向下扩展
		{
			ptrNodeFellow = ptrNodeAhead;
			ptrNodeAhead = ptrNodeAhead->next;
		}

		if(ptrNodeAhead->data == num)   //找到num结点
		{
			if(ptrNodeAhead == head)    //如果num节点是头结点
			{
				head = ptrNodeAhead->next;
				delete ptrNodeAhead;
				ptrNodeAhead = head;
				ptrNodeFellow = ptrNodeAhead;
			}
			else                       //如果num节点不是头结点
			{
				ptrNodeFellow->next = ptrNodeAhead->next;
				delete ptrNodeAhead;
				ptrNodeAhead = ptrNodeFellow->next;
			}
		}
		else                           //链表搜索结束也未找到num结点
		{
			ptrNodeAhead = NULL;
		}
	}
}

bool sll::insert(int pos,dataType num)
{
	if(pos < 0 || pos >= getLength())  //判断插入结点的正确位置是(0 ~ getLength()-1)
	{
		return false;
	}

	node *ptrNodeAhead = head;
	node *ptrNodeFollow = NULL;
	int tmpNum = 0;
	while(1)  //获取插入位置的指针,ptrNodeAhead指向待插入的位置,ptrNodeFollow指向带插入位置的下一结点
	{	
		if(tmpNum++ == pos)
		{
			break;
		}

		ptrNodeFollow = ptrNodeAhead;
		ptrNodeAhead = ptrNodeAhead->next;
	}

	//以下两句将待插入结点的数据准备好
	node *ptrTmpNode = new node;
	ptrTmpNode->data = num;

	if(ptrNodeAhead == head)      //如果是插入头结点
	{
		ptrTmpNode->next = head;
		head = ptrTmpNode;
	}
/*
	else if(ptrNodeAhead->next == NULL)
	{
		ptrNodeAhead->next == ptrTmpNode;
		ptrTmpNode->next = NULL;
	}
*/
	else                         //插入中间节点,此种方法永远也不能插入尾结点,插入是前向的
	{
		ptrNodeFollow->next = ptrTmpNode;
		ptrTmpNode->next = ptrNodeAhead;
	}

	return true;
}

node* sll::getHead()
{
	return head;              //返回链表头结点指针
}

void sll::reverse()
{
	node *ptrNodeAhead = head;
	node *ptrNodeFllow = NULL;
	node *ptrTmp = NULL;

	while(ptrNodeAhead != NULL)
	{
		ptrTmp = ptrNodeAhead->next; 
		ptrNodeAhead->next = ptrNodeFllow;
		ptrNodeFllow = ptrNodeAhead;
		ptrNodeAhead = ptrTmp;
	}

	head = ptrNodeFllow;
}

void sll::print()
{
	node *ptrNode = head;

	while(ptrNode != NULL)
	{
		cout<<ptrNode->data<<" ";

		ptrNode = ptrNode->next;
	}
	cout<<endl;
}

int sll::find(dataType num)
{
	node *ptrNode = head;
	int index = 0;

	while(ptrNode != NULL)
	{
		if(ptrNode->data == num)
		{
			return index;   //返回第一个num结点的下标
		}

		++index;
		ptrNode = ptrNode->next; //链表向下延展
	}

	return -1;                        //未找到num结点返回-1
}

dataType sll::getNum(int pos)
{
	if(pos < 0 || pos >= getLength())  //判断pos的正确位置是(0 ~ getLength()-1)
	{
		return endOfData;
	}

	int index = 0;
	node *ptrNode = head;

	while(1)
	{
		if(index++ == pos)
		{
			return ptrNode->data;
		}

		ptrNode = ptrNode->next;
	}
}


4、main.c

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

int main()
{
	sll exp;

	exp.create();
	
	cout<<"The len of sll: "<<exp.getLength()<<endl;
	exp.print();

	exp.del(2);
	exp.print();

	exp.insert(2,999);
	exp.print();

	exp.reverse();
	exp.print();

	cout<<"2的位置在: "<<exp.find(2)<<endl;

	cout<<exp.getNum(3)<<endl;

	return 0;
}

 

5、测试结果

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++实现单链表实现以及链表反转

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

weixin_45492457的博客 788

单链表的实现(cpp)

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

in_va的博客 748

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

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

diviner_s的博客 5758

C++模版类实现单链表

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

程序猿老樊的博客 1326

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

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

路漫漫小菜狗的博客 4856

C++实现单链表

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

bobi1024的博客 1万+

C++模板类实现单链表

c++模板类实现单链表#include<iostream> using namespace std; #include<assert.h> #include<string> template<class T> struct LinkNode { LinkNode<T>* _next; T _data; LinkNode(const T& x) :_data(x

Nou_Camp的博客 4949

栈的C++单链表实现

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

m0_38084180的博客 883

禾赛XT16 vs XT32激光雷达实测对比:选16线还是32线?看完这篇不纠结

本文深度评测禾赛XT16与XT32激光雷达的性能差异与应用选择。通过实测数据对比,分析16线与32线激光雷达在点云密度、动态场景适应性及与IMU协同工作等方面的表现,帮助用户根据自动驾驶、机器人等不同应用场景做出最优选型决策。

table的专栏 945

Hodgkin-Huxley Model

介绍了经典的动力学模型:HH Model

weixin_73557167的博客 2475

单链表的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

【VMware篇】7-通过ISO镜像升级VMware Esxi

本文主要介绍Dell服务器上安装的ESXi升级的方法之一(采用ISO升级)。

chen_yunan的博客 5518

数据结构——单链表的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

【UV打印机】PrintExp打印软件教程(四)-设置校准电压

序号名称功能说明1校准材料设置定义当前打印材料,不同的材料参数绑定不同的校准值2向导勾选进行校准向导操作3校准类型包括喷头安装、步进校准、喷头间距、套色校准、双向校准4类型子项同类型子项5操作步骤校准存在步骤和校准说明示意图。

Print World的专栏 5077

18、未来医疗信息学中的太赫兹天线技术

本文探讨了太赫兹天线技术在医疗信息学中的关键作用,重点分析了分裂环谐振器和纳米结构光导天线(PCA)的设计与性能提升方法,介绍了相干与非相干太赫兹检测技术,并通过等效电路模型和数值模拟深入解析PCA工作机理。文章还展示了太赫兹技术在无创血糖监测、肿瘤检测等医疗诊断中的实验应用,总结了其非侵入性、高分辨率成像和多参数分析等优势,同时指出信号检测难、成本高和技术复杂等挑战。未来趋势包括设备小型化、效率提升及与人工智能融合,拓展至药物研发、皮肤与神经疾病诊断等领域,展现出变革医疗健康的巨大潜力。

milk8的博客 146

单链表的C++实现

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

cxiaobaia的博客 352

基于深度学习的茶叶等级检测识别系统:YOLOv10 + UI界面 + 数据集

YOLOv10是YOLO系列的最新版本,继承了YOLO模型的优点,并对速度和精度进行了优化。YOLOv10在目标检测中使用卷积神经网络(CNN)作为基础,通过改进网络结构和优化训练策略,实现了在更低的延迟下进行高精度的目标检测。本文详细介绍了基于YOLOv10的茶叶等级检测与识别系统的设计与实现过程。我们从数据集准备、模型训练与推理、UI界面设计等多个方面进行了详细讲解,并给出了相应的代码实现。通过本系统,我们可以高效地自动检测茶叶的等级,并通过UI界面直观地展示结果。

YOLO 765

C++ 实现单链表

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

Slatter的博客 411

阿波罗开发板硬件架构与STM32模块化设计详解

嵌入式开发板的模块化设计是提升硬件复用性、降低迭代成本的关键技术路径。其核心在于底板与核心板的电气解耦与功能分层,依托STM32系列MCU(如F429/F767)的丰富外设资源与引脚复用能力,实现信号完整性、电源域隔离与热管理的系统级协同。该架构显著支撑工业HMI、智能家居网关、便携医疗设备等典型场景,尤其在RGB LCD驱动、QSPI Flash内存映射、多协议通信(CAN/RS485/USB)及低功耗唤醒(WK_UP按键)等工程实践中展现出高可靠性与易调试性。本文围绕阿波罗开发板展开深度解析,覆盖最小系

weixin_42510201的博客 65

基于Simulink开发一个完整的直驱式永磁同步发电机DDPMSG仿真模型

需求分析直驱式永磁同步发电机(Direct-Drive Permanent Magnet Synchronous Generator, DDPMSG)广泛应用于风力发电、海洋能发电等可再生能源领域。与传统的齿轮箱驱动系统相比,DDPMSG具有结构简单、效率高、可靠性好等优点,能够直接将机械能转换为电能,减少了中间传动环节,降低了维护成本。本项目将基于Simulink平台,开发一个完整的DDPMSG仿真模型,模拟其在风力发电场景中的应用。我们将详细讲解如何设计和实现该系统,并结合实际应用案例进行说明。

MHD0815的博客 466

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

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

单链表C++实现

单链表C++实现//单链表C++实现 #include //节点定义 template class ListNode { friend class List; private: T data; ListNode * next; public: ListNode(); ListNode(const Type & item); }; //链表定义 template class Lis

Andrew__Lee的博客 462

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

蓝牙模块HM-10手册

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

上一篇: Edit Box多行显示时如何使滚动条始终在下方
下一篇: 怎么证明一个链表是循环链表
lulipeng_cpp
博客等级 码龄15年 169粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值