C++ 用结构体和类创建单向链表

2023-05-16

一、结构体

#include <iostream>
using namespace std;
//一个链表要实现的操作有
//建立链表,遍历链表,查找链表,插入和删除节点
//查找和遍历某种程度上来说是一样的,反正都是扎进堆里然后去找你想要的那个数

//创建链表还有两个前置条件,一个是链表头,还有一个是结点,这两个类
//节点由于存放数据和下一个节点的首地址
//而链表头用于存放第一个节点的首地址和链表的长度

//链表如果直接用struct会简单得多,因为struct的默认权限是public而不是private

struct Node //创建结点类
{
	int data;//数据
	Node *next;//下一个结点的首地址  
	//总有种循环的感觉,类的定义里面套了一个正在定义的类
};

struct List  //再创建一个链表类
{
	Node *head; //指向第一个结点的首地址
	int len;//链表长度
};


void creatEmpty(List &list)//创建一个空链表的头    
//要注意,任何类的成员是不可以在声明时初始化的,要定义成员就必须通过构造函数或全局函数,类内函数之类的
{
	list.head=NULL;
	list.len=0;
}

void creatList(List &list,int n)//这一步是创建第一个结点,所以传进来的是链表头
{
	Node *node=new Node;//创建第一个结点的空间
	list.head=node;
	cin>>node->data;  //同时你要为第一结点的data赋值
	//这个地方也可以通过传进来一个参数,node->data=a,这样赋值
	node->next=NULL;  //第一结点的next应该指向再下一个结点的首地址,但还没出来,先给个NULL
	//这样也可以解决链表的最后一个结点的next是NULL的问题
	list.len++;
	
	//接下来的步骤就是根据第一个结点继续往下创建链表了
	Node *p;
	for(int i=0;i<n-1;i++)//n是总共要创建多少结点(感觉奇奇怪怪的,那我还要len干什么)
	{
		p=node;//这个时候p接受new出来的node,p就是第一个结点的首地址
		node=new Node;//然后node变成下一个结点
		p->next=node;//p这个指代当前结点的首地址,让第一个结点的next赋上新的第二结点的首地址
		cin>>node->data;//输入第二结点的data
		node->next=NULL;//给默认的NULL
		list.len++;
	}
	delete p;
}

bool Search(List &list,int data)
{
	Node *p;
	p=list.head;
	while(p!=NULL)
	{
		if(p->data==data)
		return true;
		else p=p->next;
	}
	delete p;
	return false;
}


//插入结点分为两种情况,在列表头和第一个节点之间插一个,让第一个节点变成第二个结点
//或者在两个结点之间插一个
//具体到要在哪个结点前面插,又需要遍历链表给出首地址了。
void insert(List&list,int data,int po)//在哪插,就是根据这个po来判断了
{
	Node *p=new Node;//新增的结点
	if(po==1)
	{
		p->next=list.head;
		p->data=data;
		list.head=p;
	}
	else
	{
		p=list.head;	//p这个时候就相当于第一个结点的首地址
		for(int i=0;i<po-2;i++)
		{
			p=p->next;
		}
		//这个时候p就是第po-1个结点的首地址
		Node *q1=p;
		Node *q2=q1->next;//q2就是第po个节点的首地址
		//p存放的next已经是p2了
		q1->next=p;
		p->data=data;
		delete p;//记得delete
	}
	list.len++;	
}

void Delete(List &list,int po)//注意一下函数名 delete已经有了
{
	if(po=1)
	{
		list.head=list.head->next;
		list.len--;
	}
	else
	{
		Node *p=new Node;
		p=list.head;
		for(int i=0;i<po-2;i++)
		{
			p=p->next;
		}
		//这个时候p就是第po-1个结点的首地址
		Node *q=p;
		q->next=p->next->next;
		list.len--;
		delete p;//记得delete		
	}
}

int main()
{
	List L;
	creatEmpty(L);//创建链表的头
	int n;
	cin>>n;
	creatList(L,n);//链表创建完成
	bool flag;
	flag=Search(L,8);
	if(flag) cout<<"链表中有这个数"<<endl;
	else cout<<"链表中没有这个数"<<endl;
}

二、类

类更巧妙,也更难写一点,要关注一下

另外,类外访问Node的data是有权限问题的,可直接将整个List声明为Node的友元类来解决,相当的简单粗暴,剩下的我不高兴写了,哪天想起来再补吧,但整体上来说只要实现了这个,把struct中的insert和delete函数稍作修改作为类的成员函数就可以了。

#include <iostream>
using namespace std;
class Node
{
	friend class List;//粗暴一点直接友元
	int data;
	Node *next;
public:
	Node(int data)   //这本来是createlist的开头部分,创建第一个结点,到这里就变成了构造函数
	{
		this->data=data;
		next=NULL;
	}
	void setnext(Node *p)//这个是给for循环创建结点的过程中,给当前结点的next赋值的函数,因此只要传入Node的指针就可以了
	//指针所应该拥有的空间是在create函数中给的
	{
		next=p;	
	}
};

class List
{
	Node *head;
	int len;
public:
	List()
	{
		head=NULL;
		len=0;
	}
	List(int n)//这两个有参构造和无参构造完成了creatEmpty  创建了空链表的头
	{
		head=NULL;
		len=n;
	}
	void createList()
	{
		int n;
		cin>>n;
		Node *node=new Node(n);//创建第一个节点并且通过构造函数给第一个结点的data赋值
		head=node;//head指向第一个结点
		for(int i=0;i<n-1;i++)
		{
			int n_data;
			cin>>n_data;
			Node *p=node;//接受第一个结点
			node=new Node(n_data);//对于这个new出来的新结点,在有参构造函数中next赋成NULL
			p->setnext(node);//调用第一节结点的构造函数,根据结点的构造函数,会将这个新new出来的node赋值给里面的next
			//len也不用++了,在List的有参构造里面直接就给了,就像在struct里面写的,这个len意义还真不大
		}
	}
	bool search(int num)
	{
		Node *p;
		p=head;
		if(p->data!=num)
		{
			
			
		}
		
		
	}	
};



int main()
{
    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 用结构体和类创建单向链表 的相关文章

  • 1071. Greatest Common Divisor of Strings

    1071 Greatest Common Divisor of Strings Easy 30985Share For strings S and T we say 34 T divides S 34 if and only if S 61
  • 这个问题搞了我一天

  • 150逆波兰式

    文章目录 150 Evaluate Reverse Polish NotationSolution 150 Evaluate Reverse Polish Notation Medium Evaluate the value of an a
  • 收到礼物最大值

    题目描述 在一个m n的棋盘的每一个格都放有一个礼物 xff0c 每个礼物都有一定价值 xff08 大于0 xff09 从左上角开始拿礼物 xff0c 每次向右或向下移动一格 xff0c 直到右下角结束 给定一个棋盘 xff0c 求拿到礼物
  • 64. Minimum Path Sum

    64 Minimum Path Sum Given a m x n grid filled with non negative numbers find a path from top left to bottom right which
  • 找出亲密对数

    题目内容 xff1a 求数n之内的亲密对数 所谓 亲密对数 xff0c 即A的所有因子 xff08 包含1但不包含其本身 xff09 之和等于B xff0c 而B的所有因子之和等于A 输入格式 某个数字n 输出格式 xff1a 此数字n之内
  • 5. Longest Palindromic Substring

    5 Longest Palindromic Substring Given a string s find the longest palindromic substring in s You may assume that the max
  • 516. Longest Palindromic Subsequence

    516 Longest Palindromic Subsequence Given a string s find the longest palindromic subsequence s length in s You may assu
  • 第一讲_网站架构的演变及海量数据的解决方案

    文章目录 看透springMVC 读书笔记 第一讲单机类型CS结构 xff08 Client Server xff09 BS结构 xff08 Browser Server xff09 BS结构网络传输方式OSI七层模型 TCP IP四层模型
  • 10. Regular Expression Matching

    10 Regular Expression Matching Given an input string s and a pattern p implement regular expression matching with suppor
  • 866. Prime Palindrome

    866 Prime Palindrome Find the smallest prime palindrome greater than or equal to N Recall that a number is prime if it s
  • CMakeLists用法总结

    分一下几个方面来描述 xff1a 1 每一个LIB要编译成静态库或动态库如何描述 xff0c 每一个TOOL要编译成可执行文件如何描述 xff1f 2 LIB和TOOL可能会依赖于其他LIB xff0c 该如何描述 xff1f 3 每个LI
  • 声明变量为类成员变量(静态变量)的条件

    建议在全部具备下列条件的情况下使用静态变量 1 静态所包含的对象体积较大 xff0c 占用的内存比较大时 xff1a 2 变量所包含的对象数据稳定 3 变量包含的对象生命周期比较长时 4 用于该类的对象实例化之后 xff0c 实例的数据共享
  • HDFS读流程

    文章目录 HDFS读流程读流程的概述读流程大体步骤对逻辑图的解释读流程代码 剖析OPEN方法客户端类关系图NameNode数据存储逻辑图 服务端方法关系图 对Block列表进行排序 剖析READ方法数据传输格式客户端方法关系图服务端方法关系
  • 应用层log函数的写法

    int my log const char format va list args FILE fp fp 61 fopen 34 tmp my log 34 34 a 43 34 if fp fprintf stderr 34 fp is
  • 工程计算流体力学软件FloEFD

    推荐一款工程计算流体力学软件FloEFD 此前一直使用ICEM 43 FLUENT软件 xff0c 后来由于工作原因 xff0c 使用的机会逐渐变少了 对不少人而言 xff0c CFD通常作为一种工程的辅助工具 xff0c 不想花太多精力
  • #统计整数个数(指针)

    以下面这题为例 xff1a 题目内容 xff1a 输入一个字符串 xff0c 其包括数字和非数字字符 xff0c 如 xff1a a123x456 17935 098tab xff0c 将其中连续的数字作为一个整数 xff0c 依次存放到数
  • 富斯i6B接收机与pixhawk连接

    pix接收PPM编码信号 xff0c 传统PWM接收器不能直接接收 xff08 例如FS ia6 xff09 xff0c 通常需要PWM转PPM转接板 xff0c 或者直接采用PPM输出的接收器 xff08 例如FS ia6B xff09
  • mission planner飞行模式设置

    我采用的富斯i6遥控器 xff0c 可以设置三种飞行模式 飞行模式中有六种模式 xff0c 在哪三个通道设置会与遥控器对应呢 xff1f 首先在 遥控器校准 选 项观察切换遥控器 模式时 输出的pwm值 xff1a 三个值分别为1000 1
  • ArduPilot Tutorial(PDF版)及ArduPilot飞行模式介绍

    ArduPilot官方Tutorial PDF 2017 2 http download csdn net download xiaoshuai537 10262086 ArduPilot中有14种常用的模式 xff1a 依赖GPS的模式有

随机推荐

  • PX4飞行模式-多旋翼

    手动模式 xff08 1 xff09 ARCO xff1a 特技模式 遥控器输入被转换为横滚 俯仰和偏航速度 xff0c 当摇杆回中时飞行器不会保持平衡 xff0c 可以用于翻滚等特技飞行 xff08 2 xff09 RATTITUDE x
  • 《PID控制算法的C语言实现》学习笔记

    1 PID算法原理 如果偏差为0 xff0c 则比例环节不起作用 xff1b 积分环节主要是用来消除静差 xff0c 即系统稳定后输出值和设定值之间的差值 xff1b 微分环节则反映了偏差信号的变化规律 xff0c 根据偏差信号的变化趋势来
  • 跟我一起写Makefile(整理版)

    跟我一起写Makefile 陈皓 xff08 博客地址 xff1a http blog csdn net haoel article details 2886 xff09 整理的PDF文件 xff1a http download csdn
  • PX4 Makefile分析解读

    参考文章 xff1a PX4源码的Makefile详细理解 http blog csdn net linkcian article details 79152724 感谢原文作者 主要分析 make px4fmu v2 default编译流
  • CREO工程图学习笔记

    CREO工程图技术手册 学习笔记 1 小功能 不同窗口切换操作 xff1a 视图 激活 材料设置 xff1a 文件 准备 模型属性 2 视图创建 插入视图 xff1a 图纸上长按右键 插入普通视图插入投影视图 xff1a 选择母视图 xff
  • 操作系统清华向勇陈渝版笔记(七) 进程与线程 PCB TCB 进程挂起 用户线程 内核线程 轻量级进程 僵尸队列

    7 1 进程定义 OS系统从只能跑一个程序到能跑多个 进程可以描述程序的执行过程 进程 xff1a 一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程 只有当一个程序被OS加载到内存中 xff0c cpu对其执行时 xff0c 这
  • 基于stm32F103HAL库+cubemx+freertos无感无刷电机BLDC控制程序开发

    基于stm32F103HAL库 43 cubemx 43 freertos无感无刷电机BLDC控制程序开发 最近在做一个舵机控制项目 xff0c 控制对象为大功率无感无刷电机 xff0c 网上搜遍了资源 xff0c 貌似这方面的资源真得十分
  • C++思路

    1 统计英文单词 在进行文章重复度检查时 xff0c 经常需要统计一段英文中的单词数量 xff0c 并找出长度最长的单词 设有如下定义 xff1a char str 500 编写程序 xff0c 通过利用cin getline str 50
  • 基于OpenCV构建停车场车位识别项目

    OpenCV是一个基于 xff08 开源 xff09 发行的跨平台计算机视觉库 xff0c 能实现图像处理和计算机视觉方面的很多通用算法 车位识别的图像处理过程如图所示 在python中设置完所有内容后 xff0c 最重要的依赖关系将是Op
  • 学生成绩管理系统-python

    乱写的成绩管理系统 派森 span class token comment 定义学生类型 姓名 学号 科目 span span class token keyword class span span class token class na
  • 11_3、Java集合之迭代器Iterator接口

    一 引入 Iterator对象称为迭代器 设计模式的一种 xff0c 主要用于遍历 Collection 集合中的元素 GOF给迭代器模式的定义为 xff1a 提供一种方法访问一个容器 container 对象中各个元 素 xff0c 而又
  • 进程切换和进程调度的区别

    进程切换和进程调度的区别 调度是决定将系统资源分配给哪个进程 xff0c 进程切换是实际分配系统资源 另外需要注意进程切换一定会产生中断 xff0c 进行处理器模式切换 xff0c 即从用户态进入内核态 xff0c 之后又回到用户态 xff
  • 树莓派3b+安装ubuntu server,安装mysql

    1 下载镜像 http cdimage ubuntu com ubuntu releases 18 04 5 release ubuntu 18 04 5 preinstalled server arm64 43 raspi3 img xz
  • 【GVINS初体验】

    在Ubuntu18 04下跑通GVINS GVINS介绍 环境配置 1 C 11编译器 2 ROS 3 Eigen 4 Ceres 5 gnss comm Build GVINS 跑VINS啦 GVINS介绍 GVINS是一个基于非线性优化
  • 【OpenCV】基于Adaboost和Haar-like特征人脸识别

    毕设算是告一段落 xff0c 里面用了一点点人脸识别 xff0c 其实完全是OpenCV自带的 xff0c 源自两篇论文 xff1a P Viola and M Jones Rapid object detection using a bo
  • Jetson Tx2上跑MYNT_EYE的ORB SLAM示例

    愁呀 xff0c 按照官网的说明文档 xff0c 好长时间郁闷在跑不起来 每次都是在加载词袋时报bad malloc 打开MYNT EYE ORB SLAM2 Sample Vocabulary ORBvoc txt词袋看见1082073行
  • 解决ST-LINK无法连接设备(解决不了你顺着网线来打我)

    问题分析 问题描述 在mdk中 xff0c 点击下载按钮提示找不到目标设备 xff0c 无法自动下载程序 原因猜想 单片机只有在停止状态下才可以下载程序 xff1f 猜想验证 如果让单片机处在停止状态 xff0c 是不是就能正常下载了呢 x
  • tensorflow 利用tfrecords文件制作数据集

    TensorFlow之tfrecords文件详细教程 制作数据集思路 xff1a 将训练数据和测试数据生成tfrecords文件 为什么呢 xff1f 这种文件以二进制进行存储 xff0c 只占用一个内存块 对于大数据能够提高cpu效率 代
  • 解决mininet运行报错“ImportError: No module named mininet.log”

    解决mininet运行报错 ImportError No module named mininet log 运行环境 系统Ubuntu 04 安装Mininet 2 3 0d6问题描述 运行miniedit py时报错ImportError
  • C++ 用结构体和类创建单向链表

    一 结构体 include lt iostream gt using namespace std 一个链表要实现的操作有 建立链表 xff0c 遍历链表 xff0c 查找链表 xff0c 插入和删除节点 查找和遍历某种程度上来说是一样的 x