线性表2:链表的基本操作

实验一:线性表的基本操作 实验一:线性表的基本操作 一、实验目的:   1、熟悉Java 上机环境,掌握Java语言编程方法,熟练运用Java语言实现数据结构设计和算法设计。 2、掌握线性表的顺序存储结构和链式存储结构的定义与基本操作,并能用Java语言实现线性表基本功能。 3、掌握利用线性表编写算法解决实际问题的方法。   二、实验内容:   1、编写一个Java语言程序,实现带头结点的单链表存储及基本操 阅读详情


此系列文主要用于自查、复习。所以行文、逻辑、思路是按照个人的思考方式来的,但也希冀能帮到一二三位初学者。

线性表的特点:
1.表头无前驱,表尾无后继
2.其他元素有且仅有一个直接前驱和一个直接后继

线性表有顺序存储结构和链式存储结构,下面介绍链式存储结构的单向链表。

链表的特点

优点: 删除和增加不会造成大量数据的移动
缺点: 查找、修改比较麻烦

链表的描述

描述: 数据域+指针域

typedef int datatype;

typedef struct node {
	datatype data;//数据域
	struct node * next;//保存下一个数据的地址
}linknode, * linklist;

基本操作

创建空链表

用malloc动态申请空间

linklist createLinkList()
{
	//1.申请头结点的空间
	linklist H = (linklist)malloc(sizeof(linknode));
	if(NULL == H)
	{
		printf("创建头结点失败\n");
		return NULL;
	}
	
	//2.给头结点赋值
	H->data = 0;
	H->next = NULL;
	
	//3.返回头节点
	return H;
}

第一种插入方式:头插

头插,新结点永远插入第一项(头结点不是第一项,头结点后面才是第一项)
头插

int headInsertLinkList(linklist H, datatype x)
{
	//1.申请新结点空间
	linklist pnew = (linklist)malloc(sizeof(linknode));
	if(NULL == pnew)
	{
		printf("申请新结点失败\n");
		return -1;
	}

	//2.给新结点赋值
	pnew->data = x;
	
	//3.新结点先保存头结点下一个数据的地址
	pnew->next = H->next;
	//4.将新结点接入头结点后面
	H->next = pnew;

	return 0;
}

输出链表

void showLinkList(linklist H)
{
	linklist p = H->next;

	while(p)
	{
		printf("%d ", p->data);
		p = p->next;
	}
	printf("\n");
}

求表长

int linkLength(linklist H)
{
	linklist p = H;
	int length = 0;
	
	while(p->next != NULL)
	{
		p = p->next;
		length++;
	}
	
	return length;
}

查

单链表中,取第i个元素必须从头结点出发寻找。
按位置查找,查找第pos项元素,返回其地址

linklist searchPos(linklist H, int pos)
{
	int count = -1;//计数:记录遍历的次数
	linklist p = H;
	int length = linkLength(H);
	
	if(pos<0 || pos>length)//1.判断位置是否合法
	{
		printf("位置不在表长范围内\n");
		return NULL;
	}
	
	//2.依次遍历直到pos
	while(count < pos)
	{
		p = p->next;
		count++;
	}
	
	return p;
}

第二种插入方式:任意位置插入新结点

利用上面的查找函数searchPos()找到要插入的前一个位置

int insertLinklist(linklist H, int pos, datatype x)
{
	//1.找到插入位置的前一项
	linklist p;
	if(0 == pos)
		p = H;
	else
		p = search(H, pos-1);

	if(NULL == p)
		return -1;

	//2.申请新结点
	linklist pnew = (linklist)malloc(sizeof(linknode));
	if(NULL == pnew)
	{
		printf("insert: 申请新结点失败\n");
		return -1;
	}

	//3.给新结点赋值
	pnew->data = x;
	//“先连后断”
	pnew->next = p->next;
	p->next = pnew;

	return 0;
}

删

删除结点
删

int deleteLinkList(linklist H, int pos)
{
	//判空
	if(NULL == H->next)
	{
		printf("链表为空\n");
		return -1;
	}
	
	//p保存删除的前一个位置, q保存要删除的位置
	linklist p = NULL, q = NULL;

	if(pos>=0 && pos<=linkLength(H))//保证位置有效
	{
		if(pos == 0)
			p = H;
		else		
			p = searchPos(H, pos-1);

		//保存删除结点
		q = p->next;
		//删除该结点
		p->next = q->next;
		//释放该结点
		free(q);
		q = NULL;
	}
	else
	{
		printf("deleteLinkList:the pos is error\n");
		return -1;
	}
		
	return 0;
}

逆序输出

利用头插法
在这里插入图片描述

void reverseLinkList(linklist H)
{
	//p保存无头链表的一个结点,q保存要接入头节点后面的结点
	linklist p = NULL, q = NULL;

	//1.一分为二,分为头结点和无头链表两部分
	p = H->next;
	H->next = NULL;

	//2.依次从无头链表中取第一个结点出来头插
	while(p != NULL)
	{
		//取无头链表的第一个结点
		q = p;
		p = p->next;

		q->next = H->next;
		H->next = q;
	}
}

排序

在这里插入图片描述

void orderLinkList(linklist H)
{
	linklist p = NULL;//保存无头链表的第一个结点
	linklist q = NULL;//保存插入结点
	linklist r = NULL;//保存要插入位置的前一个结点

	//1.一分为二,分为头结点和无头链表两部分
	p = H->next;
	H->next = NULL;

	//2.从无头链表中取第一个结点,有序插入到有头链表中
	while(p != NULL)
	{
		//取无头链表的第一个结点
		q = p;
		p = p->next;

		//从头开始找插入位置的前一个结点
		r = H;
		while(r->next && (r->next->data < q->data))
			r = r->next;

		//找到了,就插入该结点
		q->next = r->next;
		r->next = q;
	}
}

清空

清空是将链表置空,头结点保留,表仍然可以用。
销毁不仅要将有效结点全部删除,头结点也要删除,表不再可用。

void clear(linklist H)
{
	linklist p, q;
	p = H->next;
	while(p != NULL)
	{
		q = p;
		p = p->next;
		
		free(q);		
	}
}

销毁

void destroy(linklist H)
{
	clear(H);
	
	free(H);
	H = NULL;
}

测试

#include"linklist.h"

int main()
{
	//1.调用函数创建一个空链表
	linklist H = createLinkList();
	if(NULL == H)
	{
		printf("创建空链表失败\n");
		return -1;
	}
	//2.调用头插函数,向链表里新增数据
	printf("head insert:\n");
	headInsertLinkList(H, 111);
	headInsertLinkList(H, 555);
	headInsertLinkList(H, 333);
	headInsertLinkList(H, 777);
	headInsertLinkList(H, 666);
	//3.调用打印函数,查看链表
	showLinkList(H);
	
	printf("search:\n");
	linklist p = searchPos(H, 2);
	printf("pos %d = %d\n", 2, p->data);

	//4.任意位置插入数据
	insertLinklist(H, 2, 777);
	showLinkList(H);

	//5.求表长
	printf("length = %d\n", linkLength(H));

	//6.删除结点
	deleteLinkList(H, 0);
	printf("delete: ");
	showLinkList(H);
	
	//7.逆序输出
	reverseLinkList(H);
	printf("reverse: ");
	showLinkList(H);
	
	//8.排序
	printf("order: ");
	orderLinkList(H);
	showLinkList(H);
	
    return 0;
}
线性表的基本操作实现 - 链表与顺序表 注:实验用书为 数据结构 C语言版 第2版,人民邮电出版社出版。 一、实验目的 1、掌握线性表的定义; 2、掌握线性表的基本操作,如建立、查找、插入和删除等。 二、实验内容 定义一个包含学生信息(学号,姓名,成绩)的顺序表和链表,使其具有如下功能: 1、根据指定学生个数,逐个输入学生信息; 2、逐个显示学生表中所有学生的相关信息; 3、根据姓名进行查找,返回此学生的学号和成绩; 4 阅读详情

相关推荐

【线性表的基本操作实现及其应用 】

本次实验是在多次思考调试后才做出来的。经过这次单链表基本操作实验自己的编程能力有了进一步提高,认识到自己以前在思考问题上思路不够开阔,不能灵活的表达出自己的想法。通过这次实验我知道了只有在切身编程中才能真正地理解掌握。今后更应勤加学习、练习,多看、多练、勤思考,以便更好的掌握数据结构这门至关重要的课程。

PokemonMcy的博客 1472

线性表:链表的基本操作

线性表的链式存储方式: 用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。因此,为了表示每个数据元素与其后继元素的逻辑关系,除了本身数据信息之外,还需要存储一个指示其直接后继的信息。这两部分,称为结点,数据本身信息叫做数据域,存储后继位置信息的叫做指针域。 下图是链式存储结构示意图: 如下图,我们可以很清晰的看到,每个结点是怎么组成的: ...

lesileqin的博客 4866

线性链表的基本操作(C语言)

线性链表的基本操作; 插入 删除 排序 初始化 判空 销毁 求长度...,都是些基本操作

【笔记】C++链表实现线性表基本操作

c++链表实现线性表的基本操作,包括顺序、逆序构建线性表等

西木的博客 2302

金蝶云星空API实战:从零到一,用Postman打通业务数据流

本文详细介绍了如何使用Postman调试金蝶云星空API,从创建第三方应用到实战调试技巧,帮助开发者快速打通业务数据流。文章重点讲解了API配置的关键细节、常见问题排查方法以及自动化测试方案,提升开发效率与准确性。

weixin_33712987的博客 520

【论文阅读】AU检测|《Deep Adaptive Attention for Joint Facial Action Unit Detection and Face Alignment》

摘要 本文旨在从大量没有人工标注的视频中学习用于面部动作单元检测的区分表示。受面部动作是面部肌肉运动这一事实的启发,论文将这些运动描述为不同帧中两幅面部图像之间的转换,并将其用作学习表示的自我监控信号。但是,在不受控制的情况下,这种转换是由面部动作和头部运动引起的。为了消除头部运动的影响,我们提出了一个双圈自动编码器(TCAE),它可以解开面部动作相关运动和头部运动相关运动。具体而言,TCAE被训练成分别将源面部的面部动作和头部姿态改变为目标面部的面部动作和头部姿态。我们的实验验证了TCAE解耦运动的能力。

Celine的博客 4554

线性表之链表的创建以及基本操作

在线性表中,使用最多的莫过于链表了,链表有多个种类,而且使用方便,接下来我们来慢慢了解链表的创建以及基本操作;

m0_64028711的博客 999

【python3.7】解决报错 error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++

解决pip安装py7zr遇到的报错问题。

水w的博客 3944

数据结构:线性表中链表的建立和基本操作(C)

链表是一种物理存储上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。

m0_65651864的博客 5238

【Autosar COM】Marvell 88Q5050 以太网交换机驱动技术解析

本驱动实现了对Marvell 88Q5050交换机的全面控制,通过模块化设计满足AUTOSAR规范要求。增加DMA加速机制提升大数据量处理性能实现TSN(时间敏感网络)特性支持引入异步通知机制替代轮询操作增强安全特性,如MACsec支持该驱动架构为车载以太网交换机控制提供了可靠基础,其设计思想可推广到其他车载网络控制器开发中。随着车载网络技术的演进,驱动需持续迭代以支持新特性与更高通信速率需求。

1451

基于深度学习的图像修复系统,GAN图像修复,图像修复算法研究,并实现系统登录和注册,全网独发

近年来,深度学习已成为计算机视觉领域的研究热点,基于深度学习的图像修复技术弥补了传统修复方法长期存在的不足,显著提高了生成结果的质量。深度学习是指模仿人脑机制设计的具有深层结构的神经网络。深度学习作为一种表征学习,通过模仿人脑神经元之间的信息传递方式来学习输入数据的特征,并找到输入和输出数据之间的映射关系。通过在图像修复中应用深度学习技术,可以准确学习图像的语义信息,然后根据信息预测缺失的内容,大大克服了传统修复算法的不足,使结果更具逻辑性。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 8271

数据结构笔记(一)

数据结构笔记(一) 1.  绪论           随着计算机深入到各个领域,它的作用已不再局限于科学计算,而更多的用于控制,管理及数据处理等非数值计算的处理工作。而它加工出理的对象也由纯粹的数值发展到字符,表格和图像等各种具有一定结构的数据。一个“好”的程序,必须分析待处理的对象的特性以及各处理对象之间存在的关系。这就是数据结构这门学科产生的背景。 1.1  什么是数据结构?     ...

weixin_41679015的博客 368

【异常】OpenClaw总Token超限400报错400 Total tokens of image and text exceed max message tokens. Request id:

摘要: 多模态大模型调用中,图文总Token超限导致的400报错是常见问题。本文分析了该报错的触发原因(文本+图片Token总和超出接口限额),并从技术层面解释了多模态Token的计数规则。解决方案分为三个层次:1)紧急修复(精简文本、压缩图片、拆分请求);2)标准化根治(预校验Token、图片预处理、限额适配);3)进阶兜底(分块处理、模型升级、容错机制)。通过前置管控与源头优化,可有效解决并预防此类问题,提升业务稳定性。

奶爸的编程之路,也就一周冷个三天 832

单链表的合并c语言,单链表的两种合并操作(C语言)

#include #include /*** 含头节点单链表定义及基本操作*///基本操作函数用到的状态码#define TRUE 1;#define FALSE 0;#define OK 1;#define ERROR 0;//Status函数返回值类型typedef int Status;//数据元素类型typedef int ElemType;//单链表定义typedef struct Ln...

weixin_39609503的博客 1279

2025高教社数学建模国赛A题 - 烟幕干扰弹的投放策略(完整参考论文)

摘要:本研究基于模拟遗传退火算法优化无人机投放烟幕弹策略,建立三维运动学模型分析遮蔽效果。针对不同战术场景(单机单弹至多机多弹),构建以遮蔽时间最大化为目标的非线性优化模型。通过改进遗传算法求解最优参数组合,结果显示在给定条件下单枚烟幕弹对M1导弹的有效遮蔽时长可达1.4秒。研究为无人机协同干扰提供了高效解决方案,验证了智能算法在复杂战术决策中的适用性。关键词:烟幕干扰;无人机投弹;运动学建模;时序优化;遗传算法。

ProminentWu的博客 544

STM32F407中文手册

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

数据结构:线性表的基本操作与链式表达

线性表是具有相同数据类型的n个数据元素的有序数列,n为表长第一个元素叫表头元素,除了他,每个元素有且仅有一个直接前驱最后一个元素叫表尾元素,除了他,每个元素有且仅有一个直接后继线性表的顺序存储称为顺序表,逻辑顺序与物理存储顺序相同,是一种随机存取的存储结构位序:就是第几个,相当于下标但不是下标,数组的下标从0开始,位序从1开始单链表是一种链式存储结构,通过节点(Node)连接而成。数据域:存储数据元素的值指针域:存储下一个节点的地址(null表示无后继节点)逻辑结构head。

爱因斯晨的博客 1956

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【线性表,线性表中的顺序表和链表】

线性表是具有相同数据类型的n(n>0)个数据元素的有限序列。存在唯一的第一个元素;存在唯一的最后一个元素;除第一个元素外,每个元素均只有一个直接前驱;除最后一个元素外,每个元素均只有一个直接后继;【直接前驱】:指在该序列中位于其前面且紧邻的元素;【直接后继】:指在该序列中位于其后面且紧邻的元素。例如:在一个整数数组[1,5,8,10,49]中,元素8的直接前驱为5,直接后继为10。

Pumpkin_O的博客 2959

OV9734 DATASHEET,完整规格书

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

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

单链表基础概念,线性表的链式表示和实现,单链表基本操作的实现

单链表基础概念 单链表 单链表(Singly Linked List)是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。 特点 用一组 ...

diviner_s的博客 4422

线性表之链表的基本操作

本文主要实现了线性表中顺序表的初始化、创建、增加、删除、修改、清空,判断表长、判断表长等基本操作。 主要依据严蔚敏版数据结构教材以及王道数据结构考研辅导书。 以下是主要的功能函数: int InitList(LinkList &L);//初始化 bool CreateList(LinkList &L, int n); int Length(LinkList L);//返回长度...

Jennifer_Love_Frank的博客 3万+

数据结构之【线性表】(顺序表、链表的基本操作实现)

概念 线性表:是N个数据元素的有限序列。 顺序表:用一组地址连续的存储单元依次存储【线性表 】的数据元素。(区别于有序表:表中的数据元素存在非递增或非递减有序) 链表:用一组任意的存储单元来存储【线性表】的数据元素。 顺序表的声明: 0、顺序表的声明 顺序表的基本操作: 1、初始化顺序表L 2、销毁顺序表L 3、创建顺序表 4、清空顺序表 5、判断顺序表是否为空 6、求顺序表的长度 7、获取第i个数据元素的值 8、定位某元素e的位置 9、求当前元素的直接前驱元素 10、求当前元素的直接后继元素 11、向顺

不动声色的小蜗牛的博客 3777

线性表之二:单链表概述特点以及基本操作

单链表概述: 线性表的链式存储 通过指针实现线性逻辑关系 通过一组任意的存储单元来存储线性表中的数据元素 数据+地址:单链表的一个结点 //程序实现结点 typedef struct LNode{ ELemType data; struct LNode *next; }LNode,*LinkList; //通过一个指针可以表示一个单链表 单链表特点: 只能顺序存取,从头开始遍历 通常引入头结点...

ThePaK的博客 1858

线性表基本操作

数据在代码中被处理和操作的最小单位动作是增、删、查。他们是深入学习数据结构的根基,通过“增删查”操作,我们可以选择更合适的数据结构来解决实际工作中遇到的问题。例如几个客户端分别分别向服务端发送请求,服务端要采取先到先得的处理方式,应该如何设计数据结构呢?本文介绍数据结构之一,线性表。 1.什么是线性表 数据结构是数据的组织方式。那么线性表就是数据的组织方式之一。线性表是n个数据元素的有限列表,最常用的是链式表达,通常也叫作线性链表或链表。 在链表中存储的数据元素叫做结点,一个结点存储的就是一条数据记录。每个

Yangchenju的博客 2731

数据结构线性表的逻辑结构(四)单链表的基本操作的实现

一、 实验目的1. 掌握线性表的逻辑结构;2. 链表的基本操作的实现;3. 掌握利用C++/C编程语言实现数据结构的编程方法;4. 通过上机时间加强利用数据结构解决实际应用问题的能力;二、 实验要求1. 实验前做好充分准备,包括复习线性表所学内容,事先预习好本次实验内容;2. 实验时记录实验结果,按要求完成各题;三、 实验题目与要求一、基础题:链表的实现1. 编写链表基本操作函数:l InitLi...

青红造了个大白之成长记 2871

线性表和链表的基本操作:初始化·定位查询·插入元素·删除·查找·双向链表

1.线性表和链表的结点定义、表定义不同,因而操作不同 比较: ①线性表定义: #define LIST_INIT_SIZE 80 #define LISTINCREMENT 10 //define后面不加分号 typedef char ElemType; typedef struct{ ElemType *elem; int length; int listsize; }SqList; ...

111辄的博客 876

数据结构 第2章:线性表

线性表:是具有相同数据类型的 n 个数据元素的有限序列。特点:存在惟一的第一个元素。存在惟一的最后一个元素。除第一个元素之外,每个元素均只有一个直接前驱。除最后一个元素之外,每个元素均只有一个直接后继。线性表的存储结构:顺序存储结构:顺序表链式存储结构:链表。

zzzzzyliu的博客 1240
上一篇: 线性表1:顺序表的增 删 改 查
下一篇: 线性表3:单向循环链表
hellohelloe
博客等级 码龄8年 18粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值