数据结构 单向链表(不循环)的基础知识和基础操作

news2024/11/24 8:38:29

头定义:

typedef int datatype;
typedef struct Node
{
	//数据域存储数据
	datatype data;
	//指针域存储下一个地址
	struct Node *next;
}*Linkelist;

创建节点

Linkelist create_node()//创建新节点
{
	Linkelist node=(Linkelist)malloc(sizeof(struct Node));
	if(node==NULL)
		return NULL;
	node->data=0;
	node->next=NULL;
	return node;
}

头插(从第一个插入)

Linkelist insert_head(datatype e,Linkelist L)//头插
{
	//在堆区创建一个节点
	Linkelist node=create_node();//在堆区申请一个节点
	node->data=e;//赋值
	node->next=L;//头插
	L=node;
	return L;
}

输出

int output(Linkelist L)//输出
{
	if(L==NULL)
	{
		return -1;
	}
	while(L!=NULL)
	{
		printf("%d ",L->data);
		L=L->next;
	}
	puts("");
	return 0;
}

尾插(插在最后一个)

Linkelist  insert_rear(datatype e,Linkelist L)//尾插
{
	//创建一个新节点
	Linkelist newrear=create_node();
	newrear->data=e;
	if(L==NULL)
		L=newrear;
	else
	{
		Linkelist rear=L;//尾节点从头节点开始后移
		while(rear->next!=NULL)
		{
			rear=rear->next;
		}
		rear->next=newrear;
	}
	return L;
}

头删(删除第一个)

Linkelist delete_head(Linkelist L)//头删
{
	//判断链表是否为空
	if(L==NULL)
		return NULL;
	if(L->next==NULL)
	{
		free(L);
		L=NULL;
	}
	else
	{
		Linkelist q=L->next;
		L->data=q->data;
		L->next=q->next;
		free(q);
		q=NULL;
	}
	return L;
}

尾删

Linkelist delete_rear(Linkelist L)//尾删
{
	if(L==NULL)
		return NULL;
	if(L->next==NULL)
	{
		free(L);
		L=NULL;
	}
	else
	{
		Linkelist secondrear=L;
		while(secondrear->next->next!=NULL)
		{
			secondrear=secondrear->next;
		}
		free(secondrear->next);
		secondrear->next=NULL;
	}
	return L;
}

计算节点数

int len_Linkelist(Linkelist L)//计算节点数
{
	int count=0;
	while(L!=NULL)
	{
		count++;
		L=L->next;
	}
	return count;
}

按位置插入

Linkelist insert_pos(int pos,datatype e,Linkelist L)//按位置插入
{
	if(NULL==L||pos<1||pos>len_Linkelist(L)+1)
	{
		printf("插入失败\n");
		return L;
	}
	Linkelist p=L;
	if(pos==len_Linkelist(L)+1)
	{
		insert_rear(e,L);
		return L;
	}
	for(int i=1;i<pos;i++)
	{
		p=p->next;
	}
	Linkelist new=create_node();
	new->next=p->next;
	p->next=new;
	new->data=p->data;
	p->data=e;
	return L;
}

按位置修改

Linkelist rev_pos(int pos,datatype e,Linkelist L)//按位置修改
{
	if(NULL==L||pos<1||pos>len_Linkelist(L))
	{
		printf("修改失败\n");
		return L;
	}
	Linkelist p=L;
	for(int i=1;i<pos;i++)
	{
		p=p->next;
	}
	p->data=e;
	return L;
}

按位置查找

datatype seek_pos(int pos,Linkelist L)//按位置查找
{
	if(NULL==L||pos<1||pos>len_Linkelist(L))
	{
		return -1;
	}
	Linkelist p=L;
	for(int i=1;i<pos;i++)
	{
		p=p->next;
	}
	return p->data;
}

按位置删除

Linkelist delete_pos(int pos,Linkelist L)//按位置删除
{
	if(NULL==L||pos<1||pos>len_Linkelist(L))
	{
		printf("删除失败\n");
		return L;
	}
	Linkelist p=L;
	if(pos==1)
	{
		L=delete_head(L);
	}
	else
	{
		for(int i=1;i<pos-1;i++)
		{
			p=p->next;
		}
		Linkelist q=p->next;
		p->next=q->next;
		free(q);
		q=NULL;
	}
		return L;
}

查找元素位置

int search_pos(datatype key, Linkelist L)//查找元素位置
{
	if(NULL==L)
	return -1;
	int pos=0;
	while(L!=NULL)
	{
		pos++;
		if(L->data==key)
			return pos;
		L=L->next;
	}
	return -1;
}

按元素删除

Linkelist delete_data(datatype key,Linkelist L)//按元素删除
{
	int pos=search_pos(key,L);
	if(pos==-1)
	{
		printf("删除失败\n");
		return L;
	}
	L=delete_pos(pos,L);
	return L;
}

全部逆置

Linkelist rev_linklist(Linkelist L)//全部逆置
{
	if(NULL==L||L->next==NULL)
		return L;
	Linkelist p=L->next;
	int len=len_Linkelist(L);
	L->next=NULL;
	for(int i=1;i<len;i++)
	{
		Linkelist t=p;
		p=p->next;
		t->next=L;
		L=t;
	}
	return L;
}

释放所有节点空间

Linkelist free_space(Linkelist L)//释放空间
{
	if(NULL==L)
	{
		return NULL;
	}
	int len=len_Linkelist(L);
	for(int i=0;i<len;i++)
	{
		L=delete_head(L);
	}
	return L;
}

对节点输入值并进行冒泡排序(升序)

void Bubble(Linkelist L)//冒泡
{
	if(NULL==L||L->next==NULL)
		return;
	int len=len_Linkelist(L);
	int i,j,count;
	Linkelist p;
	for(i=1;i<len;i++)
	{
		count==0;
		for(j=0,p=L;j<len-i;j++,p=p->next)
		{
			if(p->data>p->next->data)
			{
				datatype t=p->data;
				p->data=p->next->data;
				p->next->data=t;
				count++;
			}
		}
		if(count==0)
			break;
	}
}

对节点输入值并进行简单排序(升序)

void Sort(Linkelist L)//简单排序
{
	if(NULL==L||L->next==NULL)
		return;
	Linkelist p,q,k;
	int len=len_Linkelist(L);
	int i,j;
	for(i=1,p=L;i<len;i++,p=p->next)
	{
		k=p;
		for(j=i+1,q=p->next;j<len+1;j++,q=q->next)
		{
			if(k->data>q->data)
				k=q;
		}
		if(k->data!=p->data)
		{
			datatype m=p->data;
			p->data=k->data;
			k->data=m;
		}
	}
}

按元素插入

Linkelist insert_data(datatype key,datatype e,Linkelist L)//按元素插入
{
	if(NULL==L)
		return L;
	int pos=search_pos(key,L);
	if(pos==-1)
	{
		printf("插入失败\n");
		return L;
	}
	insert_pos(pos,e,L);
	return L;
}

按元素修改

Linkelist rev_data(datatype key,datatype e,Linkelist L)//按元素修改
{
	if(NULL==L)
		return L;
	int pos=search_pos(key,L);
	if(pos==-1)
	{
		printf("修改失败\n");
		return L;
	}
	rev_pos(pos,e,L);
	return L;
}

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

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

相关文章

Elasticsearch 源码探究 001——故障探测和恢复机制

1、Elasticsearch 故障探测及熔断背景 探究Elasticsearch7.10.2 节点之间的故障探测以及熔断故障是怎么做的&#xff0c;思考生产上的最佳实践。 服务端故障场景&#xff1a; 单个master挂掉 除了断点断网&#xff0c;状态同步异常&#xff0c;主master也会认为自己已经失败&am…

ASPICE V模型之软件需求

ASPICE V模型之软件需求 了解ASPICE认识软件需求软件需求分解软件需求工作流程 了解ASPICE ASPICE全称是“Automotive Software Process Improvement and Capacity Determination”汽车软件过程改进及能力评定&#xff0c;是汽车行业用于评价软件开发团队的研发能力水平的模型框…

全球生成式AI大竞赛,Llama 2大模型现已可在亚马逊云科技上使用

一直以来Llama可以说是AI社区内最强大的开源大模型。但因为开源协议问题&#xff0c;一直不可免费商用。7月19日&#xff0c;Meta发布了大家期待已久的免费可商用版本Llama 2。一夜之间&#xff0c;大模型格局再次发生巨变。 作为Meta宣布的首批合作伙伴之一&#xff0c;现亚…

Ubuntu 安装Postgresql与PostGIS

1.前言 最近在做GIS分析&#xff0c;采集设备的经纬度点判断是否进出围栏以及是否产生道路偏移报警&#xff0c;在之前的文章有介绍过Windows下使用C#来实现&#xff0c;参考文章&#xff1a;利用PostgresqlPostgis进行空间地理信息分析&#xff08;道路偏移&#xff0c;进出电…

sql注入---报错注入

updatexml&#xff08;&#xff09;&#xff1a;对XML文档数据进行查询和修改 extractvalue&#xff08;&#xff09;&#xff1a;对XML文档数据进行查询 floor&#xff08;&#xff09;&#xff1a;取整的函数 前提是未关闭数据库报错函数&#xff0c;对于一些SQL语句的错误…

Java反射、动态代理

文章目录 反射什么是动态代理&#xff1f;程序为什么需要代理?代理长什么样? 反射 java反射机制原理&#xff1a;我们写的源代码是.java文件&#xff0c;通过javac编译后成为.class文件&#xff0c;即字节码文件&#xff0c;程序执行时&#xff0c;JVM会类加载字节码文件到内…

浅谈单片机

目录 1.什么是单片机 2.单片机的作用&#xff1f; 3.单片机的种类 4.如何学好单片机 5. 单片机的就业前景 1.什么是单片机 单片机&#xff08;Microcontroller Unit&#xff0c;简称MCU&#xff09;是一种集成了微处理器核心、存储器、输入输出端口和各种外围功能模块于一体…

Rspack 学习了解

一、简介 Rspack GitHub 仓库、Rspack Quick start。 Rspack 是由字节 ByteDance Web Infra 团队基于 Rust 语言开发的 Web 高性能构建工具。 Rust 是种高效、可靠的通用高级语言。其高效不仅限于开发效率&#xff0c;执行效率也是令人称赞的&#xff0c;属于少有兼顾开发效率…

vulnhub打靶--buli_b0x

目录 vulnhub--buli_b0x1.下载靶机2.导入靶机&#xff0c;开启靶机&#xff0c;nmap扫描3.探测目录&#xff0c;发现敏感目录4.通过test.php下载源码5.代码审计6.提权7.总结 vulnhub–buli_b0x 1.下载靶机 Billu_b0x.zip 2.导入靶机&#xff0c;开启靶机&#xff0c;nmap扫描…

分布式 RPC 框架HSF

分布式 RPC 框架HSF 概述HSF架构调用方式优势应用场景 概述 HSF (High-speed Service Framework)&#xff0c;高速服务框架&#xff0c;是在阿里巴巴内部广泛使用的分布式 RPC 服务框架。HSF 作为阿里巴巴的基础中间件&#xff0c;联通不同的业务系统&#xff0c;解耦系统间的…

WebSocket笔记

1. websocket介绍 WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c; 并进行双向数据传输。 HTTP协议和WebSocket协议对比&#xff1a; HTTP是短连接W…

iOS--动静态库

文章目录 认识动静态库静态库动态库静态的打包静态库的使用动态库的打包动态库的使用 动静态库的本质就是可执行程序的"半成品"。 需要完成一个可执行程序需要经历以下四个步骤: 预处理:完成头文件的展开&#xff0c;去掉注释&#xff0c;宏替换&#xff0c;条件编译…

微信小程序学习笔记(五)——优化

下拉刷新后主动关闭 Page({onPullDownRefresh: function() {// ...wx.stopPullDownRefresh()} })在发起请求时设置 loading&#xff0c;请求结束后关闭 Page({onLoad: function(options) {wx.showLoading({title: 数据加载中...}) // 展示 loadingwx.request({// ...complete: …

leetcode每日一练-第206题-反转链表

一、思路 迭代 二、解题方法 以输入为 1 -> 2 -> 3 -> 4 -> 5 的链表为例 三、code class Solution { public:ListNode* reverseList(ListNode* head) {ListNode* prevnullptr;//反转后的链表ListNode* currhead;//当前更新的原有链表while(curr)//原有链表无值…

【大模型】更强的 LLaMA2 来了,开源可商用、与 ChatGPT 齐平

【大模型】可商用且更强的 LLaMA2 来了 LLaMA2 简介论文GitHubhuggingface模型列表训练数据训练信息模型信息 许可证参考 LLaMA2 简介 2023年7月19日&#xff1a;Meta 发布开源可商用模型 Llama 2。 Llama 2是一个预训练和微调的生成文本模型的集合&#xff0c;其规模从70亿到…

中间件安全-CVE漏洞复现-Weblogic+JBoss+GlassFish

服务攻防测试流程&#xff1a; 使用vulfocus靶场&#xff1a; 案例演示&#xff1a;中间件-Weblogic-工具梭哈 探针默认端口&#xff1a;7001&#xff0c;Weblogic是Oracle公司推出的J2EE应用服务器 使用vulfocus靶场复现漏洞 漏洞&#xff1a;weblogic-cve_2020_14883 启动环…

自然语言处理:赋予AI理解和交流的能力

文章目录 &#x1f340;引言&#x1f340;NLP的定义与重要性&#x1f340;NLP的应用领域&#x1f340;学好自然语言处理需要掌握以下知识&#x1f340;GPT和自然语言处理&#x1f340;总结 &#x1f340;引言 自然语言处理&#xff08;Natural Language Processing&#xff0c;…

Visual Studio创建Web项目时候报错- 找不到“2.0.1“版本的程序包”解决方法

问题描述 在今天我开始想做一个ASP.Net Web 项目时&#xff0c;在创建项目的时候突然报下面这个错&#xff0c;也是试了很多方法&#xff0c;比如卸载重新安装&#xff0c;安装更高版本&#xff0c;我之前用的是2019版本&#xff0c;后面下载了2022的&#xff0c;又出现了新的…

python与深度学习(三):ANN和fashion_mnist

目录 1. 说明2. fashion_mnist实战2.1 导入相关库2.2 加载数据2.3 数据预处理2.4 数据处理2.5 构建网络模型2.6 模型编译2.7 模型训练2.8 模型保存2.9 模型评价2.10 模型测试2.11 模型训练结果的可视化 3. fashion_mnist的ANN模型可视化结果图4. 完整代码 1. 说明 本篇文章是A…

(202307)wonderful-sql:环境搭建(ubuntu 22.04 + mysql 8.0 + workbench/dbeavar,免密码-不建议免哈)

前言 能够再次参加datawhale组织的开源学习是十分兴奋的&#xff0c;看到datawhale能够越办越好我也是由衷地感到高兴。 这次参加的是mysql的学习&#xff0c;我知道这样短期的学习不会对我的能力造成多么大的提升&#xff0c;但是相信经过这次学习&#xff0c;我又将被datawh…