C语言数据结构——单链表

单链表(C++) C++实现单链表 阅读详情
AI摘要

本文详细介绍了C++中的单链表数据结构,包括带头结点和不带头结点的链表建立、增删查操作、遍历、长度计算以及注意事项,提供了示例代码实现。

0.引言

链表是一种相对简单的数据结构,但衍生种类繁多,并且在某些方面举足轻重。

关于链表的内容回分多篇文章简要介绍,此文仅介绍单链表。

和所有数据结构一样,最基础的部分无非是建立、增、删、改、查、遍历。

(本文以带头结点的链表为例)

1.建立

01.定义链表的结点

typedef int ElemType;
typedef struct LNode
{
	ElemType data;
	struct LNode* next;//指向下一个节点
}LNode,*LinkList;

02.建立链表

(1)头插法建立链表

不妨设输入9999为结束

LinkList CreateList1(LinkList &L)//头插法新建链表 
{
	LNode* s;
	int x;
	L = (LinkList)malloc(sizeof(LNode));//带头结点的链表
	L->next = NULL;//L->data里面没放东西
	scanf("%d", &x);//从标准输入读取数据
	//3 4 5 6 7 9999
	while (x != 9999)
	{
		s = (LNode*)malloc(sizeof(LNode));//申请一个空间,强制类型转换
		s->data = x;//把读取到的值,给新空间中的data成员
		s->next = L->next;//让新结点的next指针指向链表的第一个元素
		L->next = s;//让s作为第一个元素
		scanf("%d", &x);//读取标准输入
	}
	return L;
}

(2)尾插法建立链表

LinkList CreateList2(LinkList& L)//尾插法新建链表
{
	int x;
	L = (LinkList)malloc(sizeof(LNode));//带头节点的链表
	LNode* s, * r = L;//LinkList s,r=L;也可以,r代表链表表尾结点,指向链表尾部
	//3 4 5 6 7 9999
	scanf("%d", &x);
	while (x!=9999)
	{
		s = (LNode*)malloc(sizeof(LNode));
		s->data = x;
		r->next = s;//让尾部指向新节点
		r = s;//r指向新的表尾结点
		scanf("%d", &x);
	}
	r->next = NULL;
	return L;
}

03.初始化链表

(1)带头结点

bool InitList(LinkList& L)
{
	L = (LNode*)malloc(sizeof(LNode));//分配一个头结点
	if (L == NULL)	//内存不足,分配失败
	{
		return false;
	}
	L->next = NULL; //头结点之后暂时还没有结点
	return true;
}

(2)不带头结点

//不带头结点
bool InitList(LinkList& L)
{
	L = NULL;//空表,暂时还没有任何结点
	return true;
}

2.增:插入元素

01.按位序插入

(1)带头结点

//按位序插入
bool ListFrontInsert(LinkList L, int i, ElemType e)//往第i个位置插入元素
{
	if (i < 1)
	{
		return false;
	}
	LinkList p = GetElem(L, i - 1);//拿到要插入位置的前一个位置的地址值
	if (NULL == p)
	{
		return false;//i不对
	}
	LinkList s = (LNode*)malloc(sizeof(LNode));//为新插入的结点申请空间
	s->data = e;//要插入的值放入空间
	s->next = p->next;//插入的步骤
	p->next = s;
	return true;
}

(2)不带头结点

//按位序插入
bool ListInsert(LinkList& L, int i, ElemType e)
{
	if (i < 1)
	{
		return false;
	}
	if (i == 1)//插入第一个结点的操作与其它结点操作不同
	{
		LNode* s = (LNode*)malloc(sizeof(LNode));
		s->data = e;
		s->next = L;
		L = s;//头指针指向新结点
		return true;
	}
	LNode* p;//指针p指向当前扫描到的结点
	int j = 1;//当前p指向的是第几个结点
	p = L;//p指向第一个结点(注意:不是头结点)
	while (p != NULL && j < i - 1)//循环找到第i-1个结点
	{
		p = p->next;
		j++;
	}
	if (p == NULL)//i值不合法
	{
		return false;
	}
	LNode* s = (LNode*)malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;
	p->next = s;
	return true;//插入成功
}

02.后插操作

//后插操作:在p结点之后插入元素e
bool InsertNextNode(LNode* p, ElemType e)
{
	if (p == NULL)
	{
		return false;
	}
	LNode* s = (LNode*)malloc(sizeof(LNode));
	if (s == NULL)//内存分配失败
	{
		return false;
	}
	s->data = e;//用结点s保存数据元素e
	s->next = p->next;
	p->next = s;//将结点s连到p之后
	return true;
}

03.前插操作

//前插操作:在p结点之前插入元素e
bool InsertPriorNode(LNode* p, ElemType e)
{
	if (p == NULL)
	{
		return false;
	}
	LNode* s = (LNode*)malloc(sizeof(LNode));
	if (s == NULL)//内存分配失败
	{
		return false;
	}
	s->next = p->next;
	p->next = s;//新结点s连到p之后
	s->data = p->data;//将p中元素复制到s中
	p->data = e;//p中元素覆盖为e
	return true;
}

3.删:删除元素

01.按位序删除

bool ListDelete(LinkList L, int i)//删除第i个元素的位置
{
	LinkList p = GetElem(L, i - 1);//查找删除位置的前驱结点
	if (NULL==p)
	{
		return false;
	}
	LinkList q = p->next;
	if (NULL==q)
	{
		return false;
	}
	p->next = q->next;
	free(q);
	q = NULL;
	return true;
}

02.按结点删除

//删除指定结点p
bool DeleteNode(LNode* p)
{
	if (p == NULL)
	{
		return false;
	}
	LNode* q = p->next;//令q指向*p的后继节点
	p->data = p->next->data;//和后继节点交换数据域
	p->next = q->next;//将*q结点从链中“断开”
	free(q);//释放后继结点的存储空间
	return true;
}

4.查:查找元素

01.按位序查找

LinkList GetElem(LinkList L, int i)//按序查找元素
{
	int j = 1;
	LNode* p = L->next;//让p指向第一个结点
	if (0==i)
	{
		return L;//i是零就返回头节点
	}
	if (i < 1)
	{
		return NULL;//i是负值就返回空
	}
	while (p && j < i)
	{
		p = p->next;//让p指向下一个结点
		j++;
	}
	return p;
}

02.按元素查找

LinkList LocateElem(LinkList L, int e)//按值查找元素
{
	LinkList p = L->next;
	while (p && p->data != e)
	{
		p = p->next;
	}
	return p;
}

5.检查是否为空

(1)带头结点

bool Empty(LinkList L)
{
	if (L->next == NULL)
	{
		return true;
	}
	else
	{
		return false;
	}
}

(2)不带头结点

//不带头结点
bool Empty(LinkList L)
{
	if (L == NULL)
	{
		return true;
	}
	else
	{
		return false;
	}
}

6.遍历链表并打印

void PrintList(LinkList L)//打印链表
{
	L = L->next;
	while (L!=NULL)
	{
		printf("%3d", L->data);//打印当前结点数据
		L = L->next;//指向下一个结点
	}
	printf("\n");
}

7.链表长度

int Length(LinkList L)
{
	int len = 0;
	LNode* p = L;
	while (p->next != NULL)
	{
		p = p->next;
		len++;
	}
	return len;
}

附:

1.关于销毁和改

销毁只需遍历链表并free一下即可

关于改,直接访问修改即可。

2.此文代码中语法问题


以上因为书写方便,故使用到布尔类型、引用等C++语法,所以使用以上代码文件名后缀要改为cpp,其余书写与C++几乎无关。

C++中单链表的建立 链表作为动态数据结构之一,对其掌握很有必要,链表主要作用有两个:一是用来代替数组元素个数不确定的数组,二是在数据库管理中对磁盘进行存储操作。链表分为单链表和双链表,单链表的末尾结点的指针赋值为0,而双链表的头部和末尾指针的结点均赋值为0。下面主要介绍单链表的一些操作,双链表与其操作类似。对于单链表,最基本的操作有链表的建立、链表结点插入、链表结点删除和链表结点显示。 链表建立:建立链表之前有如下... 阅读详情

相关推荐

数据结构 单链表 C语言实现

单链表 单链表 顺序存储线性表 分配方式 分散存储 集中存储 时间性能 查找O(n) 插入删除O(1) 查找O(1) 插入删除O(n) 空间性能 无需分配空间,元素可以无限扩充 分配空间,元素个数有限 c语言代码实现(单链表) // // main.c // 线性表链式存储结构 // // Created by Kinble Wu on 2020/3/2. /...

Baron_wu的博客 1123

关于链表的建立与操作(c++实现)

因为线性表是静态线性的存储结构,所以为了方便动态地对数据进行处理,我们引入链表这一数据结构。因为链表是动态的存储结构,所以存储在其中的数据地址不一定是连续的。因此在创建链表时不仅需要保存数据本身,还需保存它的地址。所以我们就用一个结构体来存储链表的结点。其中每个结点都要包含两个领域,分别是数据域和指针域,用于存储数据和存储下一个结点的地址。int data;//这里的data可以是任意数据类型 struct node * link;} LNode;

weixin_74943550的博客 8753

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

文章目录前言一、要学什么、掌握什么二、深入了解1.数据构成2.头指针、头结点、首元结点二、深入了解二、深入了解二、深入了解总结 前言 链表,别名链式存储结构或单链表,用于存储逻辑关系为 “一对一” 的数据。与顺序表不同,链表不限制数据的物理存储状态,换句话说,使用链表存储的数据元素,其物理存储位置是随机的。 一、要学什么、掌握什么 1. 熟练掌握线性表的基本操作在链式存储结构上的实现 2. 掌握单链表的建立、插入、删除等基本操作; 二、深入了解 1.数据构成 数据域:存放数据本身的信息。 指针域:

weixin_53000329的博客 1962

C++链表的创建及操作

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、链表定义与函数声明二、链表创建三、删除节点四、插入节点总结 前言 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。 一、链表定义与函数声明 首先,本文主要将链表的操作分为三个部分,即创建链表,删除节点以及增加节点。其中链表的结构体定义以及函数声明与主函数如下: typedef struct L.

weisterki的博客 1万+

数据结构——单链表原地逆置(C语言)

单链表原地逆置 #include<stdio.h> #include<stdlib.h> #define MAXSIZE 10010 #define ElemType int typedef struct LNode{ ElemType data; LNode *next; }LNode,*LinkList; //创建 LinkList initLinkList(int num){ LNode* head=(LNode *)malloc(sizeof(LN.

Melody_my的博客 1624

单链表的结点插入C语言c语言数据结构

单链表的结点插入C语言数据结构 基本上每句都有注释 #include<stdio.h> #include<stdlib.h> #define NULL 0 //定义结点结构体类型 typedef struct LNode{ int data; //定义数据域 struct LNode * next; //定义指针域 }LNode,*LinkList; //声明函数 LinkList InitList(LinkList &L); LinkList GreatL

qq_44208167的博客 1526

【数据结构】【C语言】------ 单链表

前言 大家好,我是Abert。 这篇文章和大家分享用C语言实现数据结构中的单链表。 单链表可以看作是“拆分开”的顺序表。在顺序表的基础上,单链表做了一些优化,但同时也丧失了一些顺序表有的功能。 我们一起来学习单链表吧!!! 文章目录 一、单链表的讲解 二、程序基本框架的搭建与讲解 2.1 文件的创建 2.2 变量的创建 三、各种功能的实现及逻辑关系的讲解 3.1 尾插 3.2 头插 3.3 尾删 ...

m0_63601181的博客 4500

单链表的取值 数据结构C语言

单链表的取值 数据结构C语言 基本上每条语句都有注释,若有困惑,欢迎留言!博主会尽快回复 #include<stdio.h> #include<stdlib.h> //定义宏常量 #define NULL 0 //定义链表的存储结构 typedef struct LNode{ int data; struct LNode *next; }LNode,*LinkList; //声明函数 LinkList InitList(LinkList &L); LinkList

qq_44208167的博客 2187

C语言 数据结构之循环单链表

循环单链表的操作及代码 操作有:定义、添加(头插法、尾插法)、删除、遍历链表

haungxinhui的博客 1479

王道数据结构实践代码----单链表的实现(C语言版)

王道数据结构实践代码----单链表的实现(C语言版) 前言 日期:2021年8月26日 书籍:王道2021年数据结构考研复习指导 代码内容:实现单链表的实现,包括初始化,插入新元素,删除新元素,输出,查询 代码难点 1.C语言的指针和C++的引用转换 … 指针我太阳你个** 简而言之,王道书上的单链表声明和初始化是以C++为模板的,C语言无法直接使用,需要做一定的转换,介于我指针学的也不是很好,就不说这中间的转换过程和原理了,日后有闲暇了再慢慢研究 2.头插法和尾插法的区别,带头指针和不带头指针的区别

繁臻的小窝 4096

四种创建单链表的方法

学习了这么久的数据结构,终于把链表吃透啦,下面是我整理的四种创建单链表的的方法,以及一些非常容易犯的错误,让我们一起来看看吧~

AIGC 1万+

C语言数据结构学习:单链表

C语言数据结构学习:单链表

L_Z_J_I的博客 977

Gemini Enterprise免费试用攻略:解锁企业级AI平台的隐藏技巧与避坑指南

本文详细介绍了Gemini Enterprise免费试用的全流程攻略,包括注册优化、团队协作、资源管理和典型应用场景。通过解锁企业级AI平台的核心功能如Gemini 3.0 Pro模型和Nano Banana图像生成系统,帮助企业高效评估AI与业务的契合度。文章还提供了安全合规与数据管理的实用建议,确保试用过程顺畅无忧。

weixin_29233857的博客 657

数据结构——创建一个带头节点的单链表(C语言)

基础的单链表的构建,以及前插法、后插法在输入数据时的应用。还有一些细小的不同引发的非法访问及其解决方法。

weixin_73849400的博客 7391

多任务学习中的过拟合陷阱:动态停止训练机制详解与避坑指南

本文深入剖析了多任务学习中因任务过拟合不同步导致的性能下降问题,并详细介绍了动态停止-继续训练机制。该机制通过为每个任务设置独立的训练开关,基于验证集性能动态控制其梯度更新,有效缓解了任务间负迁移,是提升多任务模型整体泛化能力的关键策略。

happy2的博客 1092

机器学习——Anaconda下载安装教程

Anaconda详细下载安装教程

2401_83693485的博客 3067

【C语言】数据结构——无头单链表实例探究

单链表是一种常见的数据结构,由一系列节点依次连接形成。数据信息和指向下一个节点的指针。单链表的第一个节点称为头节点,最后一个节点没有下一个节点,其指针指向空。类似于火车,火车头连接后一个车厢,再由后面的车厢依次连接。

qq_64818885的博客 1776

EWF写保护功能详解:从安装到实战操作指南

本文详细介绍了EWF写保护功能的安装与实战操作指南。EWF(Enhanced Write Filter)通过重定向写入操作保护硬盘分区,特别适合需要长期稳定运行的系统场景。文章涵盖从安装准备、图形界面操作到命令行高级管理的全流程,并提供了常见问题的解决方案,帮助用户轻松掌握这一实用工具。

weixin_28710999的博客 446

C语言数据结构(3)——线性表其二(单链表)

欢迎来到博主的专栏——C语言数据结构博主id:代码小豪。

2301_77239666的博客 1243

TensorFlow GPU版本安装步骤-Windows系统

本文由在Windows下安装TensorFlow GPU版本教程-优快云等整理得到。 目录 1、确认显卡是否支持CUDA 1.1 查看显卡信息 打开“设备管理器”,查看显卡信息,如下图所示: 由上图知,本电脑的显卡为NVIDIA Quadro P400. 1.2 查看支持CUDA的显卡 网址:https://developer.nvidia.com/cuda-gpus 经查询可知,该显卡支持CUDA,如下图所示: 2、安装CUDA 2.1 下载CUDA 网址:https://developer.nvi

x_lingyun的专栏 766

科研绘图系列:R语言折线图(linechart plots)

科研绘图系列:R语言折线图(linechart plots)

专注生信领域 1270

单链表数据结构代码(C语言)

利用单链表数据结构实现一组数据的存储,通过简单的交互实现单链表的增删改查。 //ADT 线性表(List) 链式存储结构 LinkList #include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int ElemType; typedef int Status; //定义单链表 typedef struct Node {

m0_51512094的博客 2693

华为OD机考2025C卷 - 高矮个子排队(Java & Python& JS & C++ & C)

华为OD机考2025C卷 - 高矮个子排队。提供在线OJ刷题。Java、C++、Python、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 1682

数据结构——单链表(C语言写法)

目录: 单链表的概念⭐: 链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针连接次序实现的。 单链表的优缺点⭐: 优点:适合头插头删,按需进行扩容释放 缺点:不适合中间插入删除 意义:作为学习复杂数据结构的子结构(图的邻接表,哈希桶) ​ OJ题很多,再今后的笔试中考到概率也较大 代码实现🚕: 最基本的单链表实现🌈: typedef int SLTDataType; typedef struct SLTistNode { int data; //val

m0_63816268的博客 1479

2026 拉勾网:JA4+指纹绕过 + sign逆向 + 动态城市参数,月采集10万+数据实战

2026年拉勾网反爬技术全面升级,采用JA4+ TLS指纹识别、动态sign签名等多维度防护体系。本文提供工业级爬虫解决方案,通过curl_cffi模拟浏览器指纹、逆向sign加密算法、动态生成城市参数三大核心技术,实现高效稳定的数据采集。系统采用分层架构设计,包含任务调度、签名生成、多线程引擎等模块,单月可获取10万+条招聘数据。重点解析了JA4+指纹识别原理、传统方法的局限性,以及通过HMAC-SHA256算法逆向sign参数的完整过程。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2394

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

数据结构c语言循环单链表,数据结构 C语言实现循环单链表的实例

数据结构 C语言实现循环单链表的实例实例代码://=========杨鑫========================////循环单链表的实现#include #include typedef int ElemType;//定义结点类型typedef struct Node{ElemType data;struct Node *next;}Node,*LinkedList;int count =...

weixin_30738065的博客 237

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

上一篇: C语言数据结构——顺序表
下一篇: 关于C++因RVO优化而不调移动构造函数的问题
Epsilon_Win
博客等级 码龄3年 24粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值