单向链表的数据存储(申请堆空间)

 函数功能:

0.排序(逆置和顺序排序)    1.回显    2.头插    3.位插    4.尾插    5.尾删     6.头删    

7.位删    8.查找 (按值或按位查找)   9.修改 (按值或按位修改)   10.退出

main.c

#include "link.h"

int main()
{
	link_p H = link_create();

	if(NULL == H)
		printf("申请失败");
	else
	{
		int i;
		do
		{
			printf("0.排序\t1.回显\t2.头插\t3.位插\t4.尾插\t5.尾删\n");
			printf("6.头删\t7.位删\t8.查找\t9.修改\t10.退出\n");
			printf("请输入指令选项:");
			scanf("%d", &i);
			switch(i)
			{
			case 0: link_short(H);break;
			case 2: head_add(H);break;
			case 1: link_show(H);break;
			case 3: idex_inset(H);break;
			case 4:	tail_add(H);break;
			case 5: tail_delete(H);break;
			case 6: head_delete(H);break;
			case 7: idex_delete(H);break;
			case 8: idex_find(H);break;
			case 9:	idex_change(H);break;
			case 10: link_delete(H);
					 printf("已退出\n");break;
			}
		}while(10!= i);
	}
}

link.c

#include "link.h"

//create link head
link_p link_create()
{
	link_p H = (link_p)malloc(sizeof(link));
	if(NULL == H)
	{
		printf("失败");
		return NULL;
	}

	H -> len = 0;
	printf("申请成功\n");
	return H;
}

//创建数据结点
link_p link_node()
{
	link_p p = (link_p)malloc(sizeof(link));
	if(NULL == p)
	{
		printf("失败");
		return NULL;
	}
	printf("请输入数据结点存储的值:");
	scanf("%d", &p -> data);
	p -> next = NULL;
	return p;
}

//头插
void head_add(link_p H)
{
	link_p in = link_node();

	in -> next = H -> next;
	H -> next = in;
	H -> len++;
}

//尾插
void tail_add(link_p H)
{
	//创建结点
	link_p p = link_node();
	//将结点链接到尾部
	link_p q = H;
	for(int i = 0; i < H -> len; i++)
		q = q -> next;
	q -> next = p;

	H -> len++;
}

//位插
void idex_inset(link_p H)
{
	//输入位置,判断是否能进行插入操作
	printf("位置:");
	int num;
	scanf("%d", &num);
	if(num < 1 || num > H -> len + 1)
	{
		printf("插入失败");
		return;
	}
	//找到插入位置的前一个结点
	link_p q = H;
	for(int i = 0; i < num - 1; i++)
		q = q -> next;
	//创建结点链接到尾部 
	link_p p = link_node();
	p -> next = q -> next;
	q -> next = p;
	H -> len++;
}

//头删
void head_delete(link_p H)
{
	if(empty(H))
	{
		printf("空");
		return;
	}

	link_p p = H -> next;
	H -> next = p -> next;
	H -> len--;
	free(p);
	p = NULL;
	
}

//尾删
void tail_delete(link_p H)
{
	if(empty(H))
	{
		printf("空");
		return;
	}

	link_p q = H;
	for(int i = 0; i < H -> len - 1; i++)
		q = q -> next;//找到倒数第二个数据的地址

	link_p p = q -> next;
	q -> next = p -> next; 

	H -> len--;
	free(p);
	p = NULL;
}

//位删
void idex_delete(link_p H)
{
	printf("位置:");
	int num;
	scanf("%d", &num);
	if(empty(H) || num > H -> len || num < 1)
	{
		printf("空");
		return;
	}

	link_p q = H;
	for(int i = 0; i < num - 1; i++)
		q = q -> next;

	link_p p = q -> next;
	q -> next = p -> next;

	H -> len--;
	free(p);
	p = NULL;
}

//查找
link_p idex_find(link_p H)
{
	if(empty(H))
	{
		printf("空");
		return NULL;
	}

	printf("1.按位查找\t2.按值查找\n请输入你的选项:");
	int n;
	scanf("%d", &n);
	switch(n)
	{
	case 1:
		printf("位置:");
		scanf("%d", &n);
		if(n > H -> len || n < 1)
		{
			printf("空");
			return NULL;
		}

		link_p q = H;
		for(int i = 0; i < n; i++)
			q = q -> next;
		return q;
	case 2: 
		printf("请输入查找的值");
		datatype data;
		scanf("%d", &data);

		link_p p = H -> next;
		do
		{
			if(p -> data == data)
			{
				printf("%p\n", p);
				return p;
			}
			p = p -> next;
		}while(p != NULL);
		printf("没有你要查找的值\n");
	}			
}

//修改
void idex_change(link_p H)
{
	if(empty(H))
	{
		printf("空");
		return;
	}
	printf("1.按位修改\t2.按值修改\n请输入修改选项:");
	int i;
	scanf("%d", &i);

	switch(i)
	{
	case 1:
		printf("位置:");
		int num;
		scanf("%d", &num);
		if(empty(H) || num > H -> len || num < 1)
		{
			printf("空");
			return;
		}
		link_p q = H;
		for(int i = 0; i < num; i++)
			q = q -> next;
		printf("请输入修改后的值:");
		scanf("%d", &q -> data);
		link_show(H);
		break;
	case 2:
		if(empty(H))
		{
			printf("空");
			return;
		}
		printf("请输入需要修改的值");
		datatype data;
		scanf("%d", &data);

		link_p p = H -> next;
		for(int i = 0; i < H -> len; i++)
		{
			if(p -> data == data)
			{
				printf("请输入修改后的值:");
				scanf("%d", &p -> data);
				return;
			}
			p = p -> next;
		}
		printf("没有你要修改的值");
	}
}

//排序
void link_short(link_p H)
{
	if(empty(H))
	{
		printf("空");
		return;
	}
	printf("1.顺序排序\t2.逆置\n请输入你的选项:");
	int n, m, i;
	scanf("%d", &n);
	link_p q = H -> next;
	m = H -> len; 
	datatype arr[m];
	switch(n)
	{
	case 1:

		for(int i = 0; i < H -> len - 1; i++)
		{
			link_p p = q -> next;
			for(int j = i + 1; j < H -> len; j++)
			{
				if(q -> data > p -> data)
					p -> data = q -> data + p -> data - (q -> data = p -> data);
				p = p -> next;
			}
			q = q -> next;
		}
		break;
	case 2:
		i = 0;
		n = H -> len; 
		q = H -> next;

		do
		{
			arr[i] = q -> data;
			i++;
			q = q -> next;
		}while(q != NULL);

		q = H -> next;
		do
		{
			m--;
			q -> data = arr[m];
			q = q ->next;
		}while(q != NULL);
	}
	link_show(H);
}

//销毁链表
void link_delete(link_p H)
{
	while(H -> next != NULL)
		tail_delete(H);
}
//回显数据
void link_show(link_p H)
{
	if(empty(H))
	{
		printf("空");
		return ;
	}
	link_p p = H -> next;
	printf("————");
	for(int i = 0; i < H -> len; i++)
	{
		printf("%d",p -> data);
		p = p -> next;
	}
	printf("————");
	putchar(10);
}

//判空
int empty(link_p H)
{
	return H == NULL;
}

link.h

#ifndef __LINK_H__
#define __LINK_H__

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

typedef int datatype;
typedef struct link
{
	union
	{
		datatype data;
		int len;
	};
	struct link *next;
}link, *link_p;

//创建头结点和数据节点
link_p link_create();
link_p link_node();

//节点功能函数
void head_add(link_p H);
void tail_add(link_p H);
void idex_inset(link_p H);
void head_delete(link_p H);
void tail_delete(link_p H);
void idex_delete(link_p H);
link_p idex_find(link_p H);
void idex_change(link_p H);
void link_delete(link_p H);
void link_short(link_p H);
void link_show(link_p H);
int empty(link_p H);
#endif

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端vue打印后端对象为[object,object]

今天给自己项目进行编写前端页面时&#xff0c;惊讶的发现&#xff0c;自己进行打印后端传递的对象&#xff0c;一直显示未[object,object]&#xff0c;如下图所示&#xff1a; 感觉很奇怪&#xff0c;于是我猜测是不是自己获取的返回数据的问题&#xff0c;在进行添加了datat…

Windows10/11家庭版开启Hyper-V虚拟机功能详解

Hyper-V是微软的一款虚拟机软件&#xff0c;可以使我们在一台Windows PC上&#xff0c;在虚拟环境下同时运行多个互相之间完全隔离的操作系统&#xff0c;这就实现了在Windows环境下运行Linux以及其他OS的可能性。和第三方虚拟机软件&#xff0c;如VMware等相比&#xff0c;Hyp…

云计算【第一阶段(28)】DNS域名解析服务

一、DNS解析的定义与作用 1.1、DNS解析的定义 DNS解析&#xff08;Domain Name System Resolution&#xff09;是互联网服务中的一个核心环节&#xff0c;它负责将用户容易记住的域名转换成网络设备能够识别和使用的IP地址。一般来讲域名比 IP 地址更加的有含义、也更容易记住…

202487读书笔记|《我有个拥抱,你要不要》——生活从来如此,你的态度赋予它意义

202487读书笔记|《我有个拥抱&#xff0c;你要不要》——生活从来如此&#xff0c;你的态度赋予它意义 《我有个拥抱&#xff0c;你要不要》作者一天到晚气fufu&#xff0c;挺有愛的小漫画&#xff0c;适合用来看图说话锻炼小语言&#xff0c;我看的很快乐也写得很痛快&#xf…

打卡第6天----哈希表

每天进步一点点,滴水石穿,日积月累,不断提升。 数组和链表章节告一段落。开启哈希表相关的。 哈希表能解决什么问题呢,一般哈希表都是用来快速判断一个元素是否出现集合里 一、有效的字母异位词 leetcode题目编号:242 题目描述: 给定两个字符串 s 和 t ,编写一个函数…

国内教育科技公司自研大语言模型

好未来的数学大模型九章大模型&#xff08;MathGPT&#xff09; 2023年8月下旬&#xff0c;在好未来20周年直播活动中&#xff0c;好未来公司CTO田密宣布好未来自研的数学领域千亿级大模型MathGPT正式上线并开启公测。根据九章大模型的官网介绍&#xff0c;九章大模型&#xff…

语言模型的进化:从NLP到LLM的跨越之旅

在人工智能的浩瀚宇宙中&#xff0c;自然语言处理&#xff08;NLP&#xff09;一直是一个充满挑战和机遇的领域。随着技术的发展&#xff0c;我们见证了从传统规则到统计机器学习&#xff0c;再到深度学习和预训练模型的演进。如今&#xff0c;我们站在了大型语言模型&#xff…

搭建基础库~

前言 项目中会用到工具库、函数库以及一些跟框架绑定的组件&#xff0c;如果这些基础模块每个项目都实现一套&#xff0c;维护起来那真的头大&#xff0c;你说呢&#x1f609; 搭建流程 准备工作 创建文件夹myLib、安装Git以及pnpm 目录大概就系这样子&#xff1a; myLib ├…

你真的会信息收集嘛,4k字渗透测试信息收集10大技巧

前言 在渗透测试中&#xff0c;信息收集是非常关键的一步&#xff0c;它为后续的漏洞发现和利用提供了重要的基础。以下是非常详细的信息收集方式&#xff1a; 一、被动信息收集 被动信息收集是指在不与目标系统直接交互的情况下&#xff0c;通过公开渠道获取目标系统的相关…

LabVIEW在半导体自动化测试中的应用

半导体制造的复杂性和精密度要求极高&#xff0c;每一个生产步骤都需要严格的控制和监测。自动化测试设备在半导体制造中起到了关键作用&#xff0c;通过精密测量和数据分析&#xff0c;确保产品质量和生产效率。本文介绍如何使用LabVIEW结合研华硬件&#xff0c;开发一个用于半…

Nacos注册中心相关错误记录

文章目录 1&#xff0c;com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery:jar:unknown was not found1.1 定位及解决方案1.2&#xff0c;简要说明dependencyManagement的作用 2&#xff0c;nacos启动失败2.1 解决方案 1&#xff0c;com.alibaba.cloud:spring-c…

白嫖A100活动来啦,书生·浦语大模型全链路开源体系

扫码参加即可获得&#xff1a; 第一节 书生浦语大模型全链路开源体系 书生浦语大模型的开源历程。 从模型到应用的典型流程 书生浦语的开源体系&#xff0c;包含从数据、预训练、微调、部署、评测、应用等环节

无线领夹麦克风品牌排名,揭秘国产领夹麦克风哪个品牌好

在自媒体行业迅猛发展的浪潮中&#xff0c;领夹麦克风作为音频采集的关键设备&#xff0c;其市场需求正经历着前所未有的激增。面对市场上众多品牌和型号的选择&#xff0c;如何做出既符合个人需求又不失专业水准的决策&#xff0c;成为了消费者亟待解决的问题。 我特意为大家…

逻辑回归中的损失函数

一、损失函数介绍&#xff1a; 与回归问题成本函数不同的是&#xff0c;逻辑回归模型&#xff08;解决分类问题&#xff09;的成本函数在获得损失J的时候不再用真实值y与预测值y^的差值计算损失&#xff0c;真实值y不再出现在公式中作为计算项。 首先&#xff0c;该次训练损失…

Gradle基础:从入门到掌握

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 在现代软件开发中&#xff0c;自动化构建工具是提高效率和管理依赖的重要手段。而Gradle作为一种灵活且强大的构…

中国各省金融监管水平-测算数据(2006-2022年)

金融监管水平是指政府及其指定机构通过法律法规对金融机构及其市场行为进行监督、管理与规范的能力和效率&#xff0c;以维护金融体系稳定、保护投资者和消费者权益、促进公平竞争及支持经济增长。衡量金融监管水平的指标多样&#xff0c;常见的一种计算方式是金融监管支出与金…

linux指令练习

二、touch、vi练习&#xff1a; 1、在root家目录下创建目录A1和B1 2、进入B1下同时创建三个文件m1, m2 , n1&#xff0c;单独创建目录N1 3、进入到A1目录中分别创建一个文件t1,k2&#xff0c;同时创建目录F1&#xff0c;F2 4、删除B1下的所有1结尾的文件或者目录 5、删除A1目录…

容易涨粉的视频素材在哪找啊?爆款涨粉的视频素材网站有这几个

亲爱的读者&#xff0c;大家好&#xff01;今天我们要探讨一个至关重要的问题&#xff1a;在充满竞争的视觉时代&#xff0c;如何使自己的短视频脱颖而出并吸引更多粉丝&#xff1f;关键在于使用那些既酷炫又高质量的视频素材&#xff01;下面就向大家推荐几个顶级视频素材网站…

【分布式系统】Filebeat+Kafka+ELK 的服务部署

目录 一.实验准备 二.配置部署 Filebeat 三.配置Logstash 四.验证 一.实验准备 结合之前的博客中的实验 主机名ip地址主要软件es01192.168.80.101ElasticSearches02192.168.80.102ElasticSearches03192.168.80.103ElasticSearch、Kibananginx01192.168.80.104nginx、Logs…

vue对axios进行请求响应封装

一、原因 像是在一些业务逻辑上&#xff0c;比如需要在请求之前展示loading效果&#xff0c;或者在登录的时候判断身份信息&#xff08;token&#xff09;等信息有没有过期&#xff0c;再者根据服务器响应回来的code码进行相应的提示信息。等等在请求之前&#xff0c;之后做的一…