单链表速通后续!

news2024/11/24 17:03:00

目录

1>>闲话

2>>头删

3>>查找

4>>在指定位置之前插入

5>>删除指定结点

6>>指定位置之后插入

7>>删除指定位置之后的结点

特别思考:

8>>销毁单链表

Slist.h

Slist.c

 test.c

9>>总结


1>>闲话

        单链表其实也不是很难对吧,学会了,认真去学了都比没学强了,就好像你看了这篇文章,获取到知识,你就比之前强了一点点,希望大家再接再厉,那么话不多说,继续后续章节。

附:单链表难?带你速通!-CSDN博客

2>>头删

        

        头删的声明也很简单,只需要传首结点地址即可。函数名front前面表示头部。

进入函数的实现,首先断言判断传进来的是不是空指针,并且判断是不是传进来了一个空结点。

接着思考,我们删除了头节点,那么头节点对应的phead也就是*pphead需要更改,直接删就不知道下一个结点地址在哪里,所以需要一个临时地址存储,那么实现:

创建一个新节点next提前存储第二个结点地址,也就是*pphead->next,然后便可以释放(free)原来结点,并让头部*pphead=第二个结点,此时头节点为原来的第二个结点。完成操作。

3>>查找

        查找的声明需要注意,返回的是一个结点的地址,那么就需要用结构体指针(SLN*)接收,这里只需要传递一级指针phead,为什么?因为不需要更改单链表里的结点,只需要查找,所以用形参就可以,x表示要查找的数据,sldatetype在前面说过,方便更改所自定义的类型名称,此时为int类型。

assert每个都是类似的,就不过多赘述啦~不懂的欢迎评论区提出来,小编都会回答的,查找需要遍历一遍单链表,只要有结果符合x,那么就返回这个结点的地址,不符合就返回空指针。

4>>在指定位置之前插入

声明有三个参数,原来的单链表头结点,指定位置(结点)pos,和插入数值x

思考:指定位置之前插入,分三个步骤:

1:新建结点

2:pos之前结点的下一个地址为新建结点

3:新建结点的地址下一个地址为pos

下面详细代码:

首先进来就要判断,这个“位置”是不是头节点,如果是的话那就是头插,直接调用头插代码就好,如果不是,那么就要新建一个结点,然后遍历单链表,注意:这里的循环判断条件和之前不一样,如果下一个地址为pos的话就退出循环,这样得到的pcur就是pos之前的结点地址,然后pcur->next等于新结点,新结点的下一个地址为pos就结束

5>>删除指定结点

声明如上,与之前类似,不多嗦啦~!

思考:与指定位置之前插入代码是否相似?少了什么?

代码如下:

相信聪明的宝宝们已经看粗来了,当pos为头结点的时候不就是进行头删吗?回答正确,奖励互三!然后还是需要找到pos之前的结点,然后另前一个结点的next为pos的next就好,注意!!所有的删除,都有free,然后把pos置为空指针就好啦!

6>>指定位置之后插入

这里代码比较简单,因为单链表往后找结点容易,往前找结点难,因此,只需要创建新节点,并且让新节点的next为pos的next,再让pos的next为新节点就好,注意:这里顺序一定不能调换,否则pos就会找不到下一个结点

7>>删除指定位置之后的结点

        

这里也比较简单只需要得知pos指向的下一个结点的下一个地址就简单了。这里不多说啦,大家看看代码。

特别思考

        在学习了时间复杂度和空间复杂度后,大家对这两有一定认识,那么请问:在指定位置之前插入和后插入时间复杂度是多少?删除指定位置和之后的时间复杂度是多少?答案写在最后啦。

8>>销毁单链表

ptail表示销毁到的结点,pcur遍历单链表,销毁(free)每一个结点,最后让*pphead也就是phead等于空指针,不然phead就会成为野指针

结束啦,感谢观看,这里附上三个文件代码,希望对大家有所帮助!

Slist.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>

typedef int sldatetype;

typedef struct SLnode {
	sldatetype date;
	struct SLnode* next;
}SLN;

void SLprint(SLN* phead);

void SLtailc(SLN** pphead, sldatetype x);//尾插,尾部tail+插入c

void SLtaild(SLN** pphead);//尾删,尾部tail+删除d

void SLfrontc(SLN** pphead, sldatetype x);//头插

void SLfrontd(SLN** pphead);//头删

SLN* SLfind(SLN* phead,sldatetype x);//查找

void SLinsert(SLN** pphead, SLN* pos,sldatetype x);//指定位置之前插入

void SLinsertd(SLN** pphead, SLN* pos); //删除指定结点

void SLinsertafter(SLN* pos, sldatetype x);//指定位置之后插入

void SLinsertafterd(SLN* pos); //删除指定位置后的结点

void SLruin(SLN** pphead);//销毁链表

Slist.c

#include"Slist.h"

void SLprint(SLN* phead) {
	SLN* pcur = phead;
	while (pcur) {
		printf("%d -> ", pcur->date);
		pcur = pcur->next;
	}
		printf("NULL\n");
}

SLN* buynode(sldatetype x) {
	SLN* node = (SLN*)malloc(sizeof(SLN));
	if (node == NULL) {
		perror("malloc");
		exit(1);
	}
	node->date = x;
	node->next = NULL;
	return node;
}
void SLtailc(SLN** pphead, sldatetype x) {
	assert(pphead);
	SLN* newnode = buynode(x);
	if (*pphead == NULL) {
		*pphead = newnode;
	}
	else {
		SLN* ptail = *pphead;
		while (ptail->next) {
			ptail = ptail->next;
		}
		ptail->next = newnode;
	}
}

void SLtaild(SLN** pphead) {
	assert(pphead && *pphead);
	if ((*pphead)->next == NULL) {
		free(*pphead);
		*pphead = NULL;
	}
	else {
		SLN* pcur = *pphead;
		SLN* pend = NULL;
		while (pcur->next) {
			pend = pcur;
			pcur = pcur->next;
		}
		pend->next = NULL;
		free(pcur);
		pcur = NULL;
	}
}

void SLfrontc(SLN** pphead, sldatetype x) {
	assert(pphead);
	SLN* newnode = buynode(x);
	newnode->next = *pphead;
	*pphead = newnode;
}

void SLfrontd(SLN** pphead) {
	assert(pphead && *pphead);
	SLN* next = (*pphead)->next;
	free(*pphead);
	*pphead = next;
}

SLN* SLfind(SLN* phead, sldatetype x) {
	assert(phead);
	SLN* pcur = phead;
	while (pcur) {
		if (pcur->date == x) {
			return pcur;
		}
		pcur = pcur->next;
	}
	return NULL;
}

void SLinsert(SLN** pphead, SLN* pos, sldatetype x) {
	assert(pphead && pos);
	if (pos == *pphead) {
		SLfrontc(pphead, x);
	}
	else {
		SLN* newnode = buynode(x);
		SLN* pcur = *pphead;
		while (pcur->next != pos) {
			pcur = pcur->next;
		}
		pcur->next = newnode;
		newnode->next = pos;
	}
}

void SLinsertd(SLN** pphead, SLN* pos) {
	assert(pphead && *pphead && pos);
	if (pos == *pphead) {
		SLfrontd(pphead);
	}
	else {
		SLN* pcur = *pphead;
		while (pcur->next != pos) {
			pcur = pcur->next;
		}
		pcur->next = pos->next ;
		free(pos);
		pos = NULL;
	}
}

void SLinsertafter(SLN* pos, sldatetype x) {
	assert(pos);
	SLN* newnode = buynode(x);
	newnode->next = pos->next;
	pos->next = newnode;
}

void SLinsertafterd(SLN* pos) {
	assert(pos && pos->next);
	SLN* posnext = pos->next;
		pos->next = posnext->next;
		free(posnext);
		posnext = NULL;
}

void SLruin(SLN** pphead) {
	assert(pphead);
	SLN* pcur = *pphead;
	SLN* ptail = *pphead;
	while (pcur) {
		pcur = pcur->next;
		free(ptail);
		ptail = pcur;
	}
	*pphead = NULL;
}

 test.c

#include"Slist.h"


void test() {
	SLN* phead = NULL;
	SLtailc(&phead, 1);
	SLprint(phead);	SLtailc(&phead, 2);
	SLprint(phead);	SLtailc(&phead, 3);
	SLprint(phead);	SLtailc(&phead, 4);
	SLprint(phead);
	SLN* find = SLfind(phead, 3);

	SLruin(&phead);
	SLprint(phead);

}
int main() {
	test();
	return 0;
}

9>>总结

        数据结构单链表篇到此结束,今天讲了单链表的各项功能实现包括:尾插、尾删、头插、头删、查找、指定位置前插/删、指定位置后插/删、销毁。希望对大家有所帮助,一起加油,一起进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2209040.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++一个很好的计时方法

C一个很好的计时方法 //记时LARGE_INTEGER t1;LARGE_INTEGER t2;LARGE_INTEGER f;QueryPerformanceFrequency(&f);QueryPerformanceCounter(&t1);Sleep(100);QueryPerformanceCounter(&t2);double time;time (double)(t2.QuadPart-t1.QuadPart)/(double)f.QuadPar…

机器学习篇-day06-集成学习-随机森林 Adaboost GBDT XGBoost

一. 集成学习思想 集成学习 原理 集成学习是机器学习中的一种思想&#xff0c;它通过多个模型的组合形成一个精度更高的模型&#xff0c;参与组合的模型称为弱学习器&#xff08;基学习器&#xff09;。训练时&#xff0c;使用训练集依次训练出这些弱学习器&#xff0c;对未知…

Chromium 如何查找前端 window.navigator, window.screen等对象在c++中的实现

以前端Navigator 对象为例&#xff1a; 1、直接在vscode里面搜索"Navigator" 过滤条件*.idl&#xff0c;这样可以搜到Navigator.idl对象文件。 2、打开Navigator.idl 可以看到平级目录对应的Navigator.h 和Navigator.cc定义 3、Navigator.idl会在out\Debug\gen\thir…

【系统集成中级】线上直播平台开发项目质量管理案例分析

【系统集成中级】线上直播平台开发项目质量管理案例分析 一、案例二、小林在项目质量管理中存在的问题&#xff08;一&#xff09;计划阶段缺失&#xff08;二&#xff09;测试用例编制与执行问题&#xff08;三&#xff09;质量管理流程问题&#xff08;四&#xff09;质量保证…

全金属的两足机器人钢铁侠开发

比较喜欢钢铁侠和终结者&#xff0c;其全金属的机身&#xff0c;反射着金属的光泽&#xff0c;透露出令人惊叹的美感。 这也是一个全金属机器人&#xff0c;周身有十几片铝片和四个舵机组成&#xff0c;可以叫他钢铁侠或者终结者。这么笨&#xff0c;这么小&#xff0c;可以说是…

【笔记】shell基本使用,超全,更新ing

一、shell的执行 1、执行命令但不输出结果到命令行 [rootlocalhost ~]$ command >/dev/null2、多命令顺序执行 命令 1;命令 2 #顺序执行命令&#xff0c;命令间无逻辑关联 命令 1&&命令 2 #命令1正确执行才执行命令2&#xff0c;否则不执行 命令 1||命令 2 #命令…

记录IDEA编译报错:不支持发行版本

一共四个地方&#xff0c;版本均保持一致

成分喵(一键查询食品/化妆品成分)

一款免费可以一键查询各大品牌食品和化妆品成分神器&#xff0c;无论是拍照、扫码又或者是商品链接都能查成分&#xff0c;还能根据成分查商品&#xff0c;而且各种成分的功效、作用和安全性都会一一标注出来&#xff0c;包括是否对身体有害、敏感风险等级等等。 下载&#xf…

大模型应用开发速成:一本通向LLM专家之路

大家好&#xff0c;今天给大家推荐一本大模型应用开发入门书籍《大模型应用开发极简入门》&#xff0c;本书对很多AI概念做了讲解和说明&#xff01; 朋友们如果有需要 《大模型应用开发极简入门》&#xff0c;扫码获取~ 本书主要讲解了以下几个方面的大模型技术&#xff1a; G…

技术发明一等奖!FISCO BCOS研究成果荣获CCF权威认可

近日&#xff0c;中国计算机学会&#xff08;CCF&#xff09;正式揭晓了2024年度“CCF科技成果奖”的获奖名单。FISCO BCOS开源工作组组长单位微众银行与清华大学合作的“安全可控高性能区块链基础平台”项目&#xff0c;凭借卓越的技术创新与显著的社会经济效益&#xff0c;荣…

MFC项目如何使用hiredis库连接redis

如何在windows平台使用c连接redis 1. 下载hiredis的vs工程文件2. 使用vs2022编译hiredis3.项目中调用4. 集群连接5. 简单的封装下 最近需要在windows PC终端读取redis数据。我这里使用hiredis连接redis. 工程是vs2022开发的。 注意&#xff1a;如果是使用的‘hiredis’就不能在…

【鸟类识别系统】Python+卷积神经网络算法+人工智能+深度学习+ResNet50算法+计算机课设项目

一、介绍 鸟类识别系统。本系统采用Python作为主要开发语言&#xff0c;通过使用加利福利亚大学开源的200种鸟类图像作为数据集。使用TensorFlow搭建ResNet50卷积神经网络算法模型&#xff0c;然后进行模型的迭代训练&#xff0c;得到一个识别精度较高的模型&#xff0c;然后在…

ORA-65096:公用用户名或角色名无效

CREATE USER DATA_SHARING IDENTIFIED BY "Ab2"; Oracle建立用户的的时候&#xff0c;可能会出现一直提示 ORA-65096:公用用户名或角色名无效&#xff1b; 我查了一下&#xff0c;好像是 oracle 12版本及以上版本的特性&#xff0c;用户名必须加c##或者C##前缀才能创…

对ElementPlus的el-select二次封装,添加分页和搜索功能,实现一个自定义的下拉选择框

组件展示效果图 在 Vue3 的 elementPlus项目中&#xff0c;我们经常需要使用下拉选择框 (el-select) 来展示大量数据。然而&#xff0c;默认情况下 el-select 不支持分页和搜索功能。本文将介绍如何通过二次封装 el-select 组件来实现这一需求&#xff0c;并使用自定义的 Hook …

一周热门|OpenAI 回击马斯克:为了自己的竞争优势,不断骚扰我们;微软、清华团队提出 Diff Transformer

「一周热门」将从【企业动态】【技术前瞻】【政策法规】【专家观点】四部分&#xff0c;带你快速跟进大模型行业热门动态。 企业动态 OpenAI 回击马斯克&#xff1a;为了自己的竞争优势&#xff0c;他不断骚扰我们 日前&#xff0c;OpenAI 指控马斯克在一场法律诉讼中对其进行…

谷歌浏览器 文件下载提示网络错误

情况描述&#xff1a; 谷歌版本&#xff1a;129.0.6668.90 (正式版本) &#xff08;64 位&#xff09; (cohort: Control)其他浏览器&#xff0c;比如火狐没有问题&#xff0c;但是谷歌会下载失败&#xff0c;故推断为谷歌浏览器导致的问题小文件比如1、2M会成功&#xff0c;大…

基于Transformer的诗句生成

基于Transformer的诗句生成 前言相关介绍Transformer一、基本原理与结构二、关键技术三、应用领域四、优缺点 Transformer应用&#xff1a;诗句生成优缺点 前提条件实验环境基于Transformer的诗句生成准备数据集读取数据集分割数据集设置相关参数创建自己DataSet对象定义网络模…

双十一速购清单!如何才能挑到性价比高的宠物空气净化器

对于很多上班族而言&#xff0c;平时都不敢大手大脚的花钱&#xff0c;甚至很想将一份钱掰成两份来用&#xff0c;所以双十一是很多人都不会错过的购物狂欢节。 当然&#xff0c;我这个996的社畜也一样&#xff0c;而且我还养了一只爱掉毛的猫咪&#xff0c;每天下班回去都看到…

光路科技TSN交换机和电力专用交换机即将亮相第31届中国国际电力设备及技术展览会

在全球能源领域正经历深刻转型之际&#xff0c;可再生能源技术的飞跃进步正为电力行业的未来开辟新径。太阳能、风能等绿色能源&#xff0c;凭借其无可比拟的优势&#xff0c;正稳步取代化石燃料&#xff0c;成为电力行业的主流趋势。多国政府积极响应&#xff0c;出台多项政策…

日均千万订单的交易平台设计稿

业务背景 平台主要售卖电子商品和少量特定的实物商品。 经营模式&#xff0c;主要分为平台商家和自营店&#xff0c;自营店的流量占整个平台业务的50%以上&#xff0c;我负责自营店交易履约相关业务。 以前的架构&#xff0c;平台交易和履约中心是所有流量共享&#xff0c;在…