算法与数据结构之带头结点的单链表

2023-10-31

单链表优缺点

链表是非随机存取的存储结构,和顺序表相比,链表存储结构在实现插入、删除的操作时,不需要移动大量数据元素(但不容易实现随机存取线性表的第 i 个数据元素的操作)。所以,链表适用于经常需要进行插入和删除操作的线性表,如飞机航班的乘客表等

单链表的定义

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

typedef struct Node
{
	int data;	//数据域
	struct Node *next;	//指针域
}NODE,*PNODE;

基本操作的实现

单链表的创建

单链表的创建分为两种,第一种在表头插入数据,第二种在表尾插入数据

在表头插入数据
PNODE Create1()
{
	int i,n;
	PNODE pNew,pHead=NULL;
	pHead=(PNODE)malloc(sizeof(NODE));
	if(NULL==pHead)
		exit(-1);
	pHead->next=NULL;	//先建立一个带头结点的单链表
	printf("请输入数据元素的个数:");
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		pNew=(PNODE)malloc(sizeof(NODE));
		if(NULL==pNew)
			exit(-1);
		printf("请输入第%d个元素的值:",i+1);
		scanf("%d",&pNew->data);
		pNew->next=pHead->next;
		pHead->next=pNew;
	}
	return pHead;
}
在表尾插入数据
PNODE Create2()
{
	int i,n;
	PNODE pHead,pTail,pNew;
	pHead=(PNODE)malloc(sizeof(NODE));
	if(NULL==pHead)
		exit(-1);
	pHead->next=NULL;	//生成头结点
	pTail=pHead;
	printf("请输入数据元素的个数:");
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		pNew=(PNODE)malloc(sizeof(NODE));
		if(NULL==pNew)
			exit(-1);
		printf("请输入第%d个元素的值:",i+1);
		scanf("%d",&pNew->data);
		pTail->next=pNew;
		pTail=pTail->next;
		pNew->next=NULL;
	}
	return pHead;
}

销毁单链表

销毁单链表指的是破除各个结点之间的关系,并且释放各个结点(包括头结点)内存空间

void Destroy(PNODE pHead)
{	//销毁pHead指向的单链表:头结点也不存在只剩一个头指针,
	//且头指针为NULL
	PNODE p;
	while(pHead!=NULL)
	{
		p=pHead->next;
		free(pHead);
		pHead=p;
	}
}

置空单链表

注意置空和销毁的区别,销毁到最后什么也没有,但是置空在最后会剩一个头指针和头结点

void Clear(PNODE pHead)
{	//将pHead指向的单链表置为空表,和初始状态一样,
	//只剩一个头指针和一个头结点,
	//且头结点的指针域为NULL
	PNODE p,q;
	p=pHead->next;//p指向第一个节点
	while(p!=NULL)
	{
		q=p->next;
		free(p);
		p=q;
	}
	pHead->next=NULL;
}

判断链表是否为空

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

返回单链表中元素个数

int	Length(PNODE pHead)
{
	int count=0;//定义临时变量,存储单链表元素个数
	PNODE p=pHead->next;
	while(p!=NULL)
	{
		count++;
		p=p->next;
	}
	return count;
}

返回第某个元素的值

将第i个元素的值赋给e

bool Get(PNODE pHead,int i,int *e)
{
	int k=1;
	PNODE p=pHead->next;
	while(k<i&&p!=NULL)
	{
		k++;
		p=p->next;
	}
	if(k>i||p==NULL)
		return false;
	*e=p->data;
	return true;
}

求某个元素的前驱元素

求cur_e的前驱元素,用pre_e保存

bool Prior(PNODE pHead,int cur_e,int *pre_e)
{
	PNODE p=pHead->next,q;//p指向第一个节点
	while(p->next)	//p所指节点有后继
	{
		q=p->next;	//q为p的后继
		if(q->data==cur_e)
		{
			*pre_e=p->data;
			return true;
		}
		p=q;	//p向后移
	}
	return false;
}

求某个元素的后继元素

求cur_e的后继元素,用next_e保存

bool Next(PNODE pHead,int cur_e,int *next_e)
{
	PNODE p=pHead->next;//p指向第一个节点
	while(p->next)	//p所指节点有后继
	{
		if(p->data==cur_e)
		{
			*next_e=p->next->data;
			return true;
		}
		p=p->next;	//p向后移
	}
	return false;
}

在第某个元素前面插入元素

在第i个元素前面插入元素e

bool Insert(PNODE pHead,int i,int e)
{
	int k=0;
	PNODE p=pHead,pNew;
	while(k<i-1&&p!=NULL)
	{
		k++;
		p=p->next;
	}
	if(NULL==p||k>i-1)
		return false;
	pNew=(PNODE)malloc(sizeof(NODE));
	if(pNew==NULL)
		exit(-1);
	pNew->data=e;
	pNew->next=p->next;
	p->next=pNew;
	return true;
}

删除第某个元素

删除单链表第i个元素,并用e保存

bool Delete(PNODE pHead,int i,int *e)
{
	int k=0;
	PNODE p=pHead,q;
	while(k<i-1&&p->next!=NULL)
	{
		k++;
		p=p->next;
	}
	if(k>i-1||p->next==NULL)
		return false;
	q=p->next; // 删除并释放结点
	p->next=q->next;
	*e=q->data;
	free(q);
	return true;
}

遍历链表中的所有元素

void Traverse(PNODE pHead)
{
	PNODE p=pHead->next;
	while(p!=NULL)
	{
		printf("%d	",p->data);
		p=p->next;
	}
	printf("\n");
}

对链表中的元素进行升序排序

void Sort(PNODE pHead)
{
	int i,j,temp;
	PNODE p,q;
	for(i=0,p=pHead->next;i<Length(pHead)-1;i++,p=p->next)
	{
		for(j=i+1,q=p->next;j<Length(pHead);j++,q=q->next)
		{
			if(p->data>q->data)
			{
				temp=p->data;
				p->data=q->data;
				q->data=temp;
			}
		}
	}
}

归并两个有序单链表

void MergeList(PNODE La,PNODE Lb,PNODE Lc)
{
	PNODE pa=La->next,pb=Lb->next,pc=Lc=La;
	while(pa!=NULL&&pb!=NULL)
	{
		if(pa->data<=pb->data)
		{
			pc->next=pa;
			pc=pa;
			pa=pa->next;
		}
		else
		{
			pc->next=pb;
			pc=pb;
			pb=pb->next;
		}
	}
	pc->next=pa? pa:pb;
	free(Lb);
	Lb=NULL;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法与数据结构之带头结点的单链表 的相关文章

  • 数组模拟环形队列(思路分析) [数据结构与算法][Java]

    数组模拟环形队列 思路分析 使用数组模拟环形队列 就可以解决使用数组模拟队列中的遗留问题了 那么我们要如何使用数组模拟环形队列 相当于前面讲过的数组模拟非环形队列 也就是一般队列 我们这里有如下的变化 front变量的含义发生了改变 fro
  • 【剑指offer】数据结构——队列 栈 堆

    目录 数据结构 树 剑指offer 09 用两个栈实现队列 剑指offer 30 包含min函数的栈 剑指offer 31 栈的压入 弹出序列 剑指offer 41 数据流中的中位数 剑指offer 59 2 队列的最大值 数据结构 树 剑
  • 12种排序算法详解

    作者 寒小阳 时间 2013年9月 出处 http blog csdn net han xiaoyang article details 12163251 声明 版权所有 转载请注明出处 谢谢 0 前言 从这一部分开始直接切入我们计算机互联
  • 【C++后台开发面试】STL相关

    此部分较为精简 只供面试前联想记忆使用 需要先熟读相关的内容知识才能发挥其作用 推荐书籍 STL源码剖析 侯捷 六大组件及其关系 空间配置器 容器 迭代器 算法 仿函数 适配器 内存管理 内存配置和对象构造 析构分开 使用双层级配置器 第一
  • 剑指Offer系列(java版,详细解析)16.数值的整数次方

    题目描述 剑指 Offer 16 数值的整数次方 难度中等129 实现 pow x n 即计算 x 的 n 次幂函数 即 xn 不得使用库函数 同时不需要考虑大数问题 示例 1 输入 x 2 00000 n 10 输出 1024 00000
  • 【经典排序算法】3. 插入排序

    对顺序性强的数据 插入排序就比较快 最好情况O n 代码如下 public class Main public static void main String args int arr 3 3 5 6 2 1 arrPrint arr In
  • C++中STL用法超详细总结

    目录 1 什么是STL 2 STL内容介绍 2 1 容器 2 2 STL迭代器 2 3 算法 2 4 仿函数 2 4 1 概述 2 4 2 仿函数 functor 在编程语言中的应用 2 4 3 仿函数在STL中的定义 2 5 容器适配器
  • 单链表的增删改查操作详解之C语言版

    单链表在应用中经常用到增加新结点 删除结点 修改结点 查找结点等操作 本文针对上述基本操作做了简单汇总 并给出了详细的算法 一 在单链表中增加结点 在链表中增加新结点是经常要用到的操作 增加新结点大致可以分为在链表末尾增加 在链表头增加 在
  • 算法——有向图的最短路径算法

    建议学习最短路径算法时 观看这个视频 https www bilibili com video BV1q4411M7r9 from search seid 9662298119837732890 Dijkstra算法 思路 1 从一个单源节
  • LeetCode-剑指 Offer II 114. 外星文字典,BFS 搜索算法及图的表示

    剑指 Offer II 114 外星文字典 现有一种使用英语字母的外星文语言 这门语言的字母顺序与英语顺序不同 给定一个字符串列表 words 作为这门语言的词典 words 中的字符串已经 按这门新语言的字母顺序进行了排序 请你根据该词典
  • 为什么说快速排序是性能最好的排序算法?

    刚刚学习了排序这一章 看到了书中最后的一个总结表 心想从表上来看 堆排序不该是最好的排序算法么 不管最好 最坏还是平均情况 时间复杂度都是O nlogn 而且还不像快排和归并排序那样占空间 为什么说快速排序是最好的算法呢 其实经过实验 会发
  • 【java实现二叉树的各种遍历方式】

    二叉树的各种遍历方式 通过递归方式 可实现二叉树的层级遍历 先序 中序 后序等遍历方式 package com ykq import java util ArrayList import java util List author ykq
  • 【Leetcode】154. 寻找旋转排序数组中的最小值 II

    题目描述 已知一个长度为 n 的数组 预先按照升序排列 经由 1 到 n 次 旋转 后 得到输入数组 例如 原数组 nums 0 1 4 4 5 6 7 在变化后可能得到 若旋转 4 次 则可以得到 4 5 6 7 0 1 4 若旋转 7
  • 算法训练day43

    文章目录 1049 最后一块石头的重量 II 求最大重量 思路分析 代码实现 494 目标和 求组合方法数 思路分析 动规方法 代码实现 总结思考 474 一和零 求二维背包的最大物品数 思路分析 代码实现 思考总结 1049 最后一块石头
  • 力扣刷题-面试题 17.13. 恢复空格、字典树、前缀树的应用

    基本概念 Trie 树 又称单词查找树 前缀树 是一种树形结构 典型应用是用于统计 排序和保存大量的字符串 但不仅限于字符串 它的优点是 利用字符串的公共前缀来减少查询时间 最大限度地减少无谓的字符串比较 比哈希表更快 基本性质 根节点不包
  • 剖析高性能队列Disruptor背后的数据结构和算法

    本文是学习算法的笔记 数据结构与算法之美 极客时间的课程 Disruptor 是一种内存消息队列 它经Java 中另外一个非常常用的内存消息队列 ArrayBlockQueue ABS 的性能 要高出一个数量级 可以算得上是最快的内存消息队
  • 设计模式(四) —— 观察者模式/发布订阅模式,c和c++示例代码

    往期地址 设计模式 一 简单工厂模式 设计模式 二 策略模式 设计模式 三 装饰模式 本期主题 使用c和c 代码 讲解观察者模式 发布订阅模式 发布 订阅模式 1 什么是发布 订阅模式 2 实例 2 1 场景 2 2 代码设计 2 3 代码
  • 数据结构系列——先进先出队列queue

    本期主题 先进先出队列实现 目录 1 队列定义 2 实现一个简单的队列以及分析 1 代码实现分析 2 code 3 优缺点分析 3 循环队列实现 1 循环队列原理 2 循环队列实现分析 3 code 1 队列定义 队列是什么 定义 一个先进
  • 华为OD德科面试+机试记录

    一 机试 6 25 三道编程题 难度偏中 由于时间久远 只记得其中两道题目 1 找车位 动态规划 2 题目不记得了 后面如果找到会补充 双指针 3 高效的任务规划 动态规划 第一题和第二题是做出来了 第三题做出来一点点 当时时间不够 没想出
  • 设计一个能够获取栈中最小值的栈。

    设计一个栈 要求 支持 push pop top 操作 并能在常数时间内检索到栈中最小元素 示例 public Stack

随机推荐

  • Linux防火墙查看及白名单添加

    一 临时白名单添加 执行即生效 重启防火墙后失效 查看防火墙状态 service iptables status 查看白名单列表 sudo iptables nL 添加白名单 sudo iptables I INPUT m state st
  • Spring AOP 源码分析 - 拦截器链的执行过程

    1 简介 本篇文章是 AOP 源码分析系列文章的最后一篇文章 在前面的两篇文章中 我分别介绍了 Spring AOP 是如何为目标 bean 筛选合适的通知器 以及如何创建代理对象的过程 现在我们的得到了 bean 的代理对象 且通知也以合
  • java:无法从静态上下文中引用非静态方法

    编辑以下代码 public class t public int i public void fun public static void main String args i 3 fun 编译 javac t java 得到以下报错 原因
  • c++svd算法_2020DCIC智能算法赛智慧海洋建设TOP1方案

    大家好 我是来自团队Pursuing the Past Youth的Ethan 天池ID是GrandRookie 和队友青禹小生 wbbhcb Chauncy YAO经过2个多月的 征途 最终在本届智能算法赛部分拿到了线上Top1的成绩 下
  • 蓝桥杯第十届青少年Python组省赛试题

    ns 1 3 5 8 cnt 0 for a in ns for b in ns for c in ns if a b and a c and b c print a 100 b 10 c cnt 1 print cnt for i in
  • SpringSecurity详解

    一 Spring Security简介 Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架 Spring Security致力于为Java应用程序提供身份验证和授权的能力 像所有Spring项目一样 Sprin
  • Lora无线终端工作原理及优缺点

    LoRa 数据传输终端是一种基于LoRa 扩频技术的无线数据传输终端 利用 LoRa 网络为用户提供无线数据传输功能 该产品采用高性能的工业级 LoRa 方案 以嵌入式实时操作系统为软件支撑平台 同时提供 RS232 和 RS485 或 R
  • mipsel-openwrt-linux交叉编译libwebsockets

    mipsel openwrt linux交叉编译libwebsockets mipsel openwrt linux交叉编译libwebsockets 1 下载libwebsockets 2 准备条件 3 编译安装libwebsockets
  • 数据库——实体联系模型

    文章目录 1 实体 2 属性 3 联系 4 实体 联系图 5 弱实体集 1 实体 1 实体 客观存在并且可以相互区分的任何事物 可以是实际对象 也可以是抽象概念 2 属性 实体所代表的事物具有的某种特性 每个实体都可以用一组属性来刻画 例如
  • 思维导图怎么变成ppt?4个思维导图一键生成ppt的方法

    做好的思维导图如何变成一份ppt 本文罗列了4个可行方法 一起来看看吧 一 直接复制粘贴 这是最简单的方法 虽然这样可能会花费一些时间 但可以确保内容排版和布局与你想要的一致 当然 我们大可使用更高效的方法 二 导出为图片格式 大多数思维导
  • 矩阵相关定义性质全总结

    矩阵相关定义性质全总结 0 前言 矩阵是线性代数中的核心内容 所以我写这篇文章对矩阵 研究生以下阶段 进行一个完整的叙述 虽然是主要说矩阵 但是我也会将行列式 向量 线性方程组三个方面也包含在内 不过是概述的形式 具体的叙述会另外展开写 能
  • C++沉思录读书笔记1.如何定义一个完整的类

    C 沉思录 Ruminations On C 读书笔记1 如何定义一个完整的类 作者 2006 4 27 12 19 C 哲学 只为用到的东西付出代价 定义一个类时必须搞清楚的几个问题 需要构造函数吗 如果答案为 no 那么很可能你需要定义
  • 关于转义字符&

    1 情况是这样的 就是前段传的xml参数里存在 这种特殊字符 所以前端需要转义后再传给后端 也就是 转义为 后传给后端 但是后端接收但这个参数时 会拼接url 就像下面这样的 http www xx com path api gender
  • 【Colab】基本操作【LeNet】【MNIST】训练测试

    文章目录 1 介绍 2 查看基本配置 2 1查看pytorch版本 2 2查看是否可以使用cuda 2 3查看显卡配置 3 挂载 31 挂载谷歌云盘 3 2更改运行目录 4 训练 5 Reference Colab 官网初始界面 1 介绍
  • python函数用法之numpy.mgrid

    参考链接 python笔记 numpy中mgrid的用法 布衣小张 CSDN博客 mgrid numpy中的mgrid函数 KangLongWang的博客 CSDN博客 mgrid函数 mgrid函数返回多维结构 np mgrid 第1维
  • ISP图像处理流程

    文章目录 前言 ISP图像处理流程 总结 参考 前言 因工作需要 今天看了ISP图像处理的基本流程 为了检验自己的理解情况 这里根据自己的理解写下这篇文章 如有错误 敬请原谅 ISP图像处理流程 ISP Image Sensor Proce
  • 后台管理系统项目

    1 项目名称 后台管理 2 技术栈 vue全家桶 element ui axios less eachers 3 项目亮点 性能优化 百万级项目 新旧系统更迭 权限把控 项目开发流程 1 安装vue脚手架 2 vue create 项目名称
  • MySQL-索引

    一 介绍 索引是数据库对象之一 用于提高字段检索效率 使用者只需要对哪个表中哪些字段建立索引即可 其余什么都不做 数据库会自行处理 索引提供指向存储在表的指定列中的数据值的指针 如同图书的目录 能够加快表的查询速度 但同时也增加了插入 更新
  • SpringBoot 二维码生成

    来源 https www cnblogs com songweipeng p 16623793 html 一 基于Google开发工具包ZXing生成二维码
  • 算法与数据结构之带头结点的单链表

    单链表优缺点 链表是非随机存取的存储结构 和顺序表相比 链表存储结构在实现插入 删除的操作时 不需要移动大量数据元素 但不容易实现随机存取线性表的第 i 个数据元素的操作 所以 链表适用于经常需要进行插入和删除操作的线性表 如飞机航班的乘客