华清数据结构day4 24-7-19

news2024/11/14 17:55:29

链表的相关操作

linklist.h

#ifndef LINKLIST_H
#define LINKLIST_H
#include <myhead.h>
typedef int datatype;
typedef struct Node
{
	union
	{
		int len;
		datatype data;
	};
	struct Node *next;
} Node, *NodePtr;

NodePtr list_create();
NodePtr apply_node(datatype e);
int list_empty(NodePtr L);
//头插
int list_insert_head(NodePtr L, datatype e);
//链表遍历函数
int list_show(NodePtr L);
//通过位置查找结点
NodePtr list_search_pos(NodePtr L, int pos);
//任意位置插入
int list_insert_pos(NodePtr L, int pos, datatype e);
//链表头删
int list_delete_head(NodePtr L);
//链表任意位置删除
int list_delete_pos(NodePtr L, int pos);
//链表按值查找返回位置
int list_search_value(NodePtr L, datatype e);
//链表按位置进行修改
int list_update_pos(NodePtr L, int pos, datatype e);
//按值进行修改
int list_update_value(NodePtr L, datatype old_e, datatype new_e);
//将链表进行翻转
void list_reverse(NodePtr L);
//链表的排序
int list_sort(NodePtr L);
//链表的翻转(递归函数实现)
NodePtr list_reserve1(NodePtr L);
//释放链表
void list_destroy(NodePtr L);
#endif

linklist.c

#include "linklist.h"
NodePtr list_create() //链表的创建
{
	NodePtr L = (NodePtr)malloc(sizeof(Node));
	if (L == NULL)
	{
		printf("创建失败\n");
		return NULL;
	}
	L->len = 0;
	L->next = NULL;
	printf("链表创建成功\n");
	return L;
}

NodePtr apply_node(datatype e) //申请新元素
{
	NodePtr new = (NodePtr)malloc(sizeof(Node));
	if (new == NULL)
	{
		printf("申请失败\n");
	}
	new->data = e;
	new->next = NULL;
	return new;
}
int list_empty(NodePtr L) //判空
{
	return L->next == NULL;
}

//头插
int list_insert_head(NodePtr L, datatype e)
{
	if (L == NULL)
	{
		printf("没有创建表\n");
		return -1;
	}
	NodePtr new = apply_node(e);
	if (new == NULL)
	{
		return -1;
	}
	new->next = L->next;
	L->next = new;
	L->len++;
	printf("头插成功\n");
	return 0;
}
//链表遍历函数
int list_show(NodePtr L)
{
	if (L == NULL)
	{
		printf("遍历失败\n");
		return -1;
	}
	printf("元素分别为");
	NodePtr q = L->next;
	while (q != NULL)
	{
		printf("%d\t", q->data);
		q = q->next;
	}
	putchar(10);
}
//通过位置查找结点
NodePtr list_search_pos(NodePtr L, int pos)
{
	if (NULL == L || list_empty(L) || pos < 0 || pos > L->len)
	{
		printf("查找失败\n");
		return NULL;
	}
	NodePtr p = L;
	for (int i = 0; i < pos; i++)
	{
		p = p->next;
	}
	return p;
}
//任意位置插入
int list_insert_pos(NodePtr L, int pos, datatype e)
{
	if (NULL == L || pos < 0 || pos > L->len + 1)
	{
		printf("插入失败\n");
		return -1;
	}
	NodePtr p = L;
	for (int i = 0; i < pos - 1; i++)
	{
		p = p->next;
	}
	NodePtr new = apply_node(e);
	if (NULL == new)
	{
		return -1;
	}
	new->next = p->next;
	p->next = new;
	L->len++;
	printf("插入成功\n");
	return 0;
}
//链表头删
int list_delete_head(NodePtr L)
{
	if (L == NULL || list_empty(L))
	{
		printf("删除失败\n");
		return -1;
	}
	NodePtr p = L->next;
	L->next = p->next;
	free(p);
	p = NULL;
	L->len--;
	printf("删除成功\n");
	return 0;
}
//链表任意位置删除
int list_delete_pos(NodePtr L, int pos)
{
	if (NULL == L || list_empty(L) || pos < 1 || pos > L->len)
	{
		printf("删除失败\n");
		return -1;
	}
	NodePtr p = list_search_pos(L, pos - 1);
	NodePtr q = p->next;
	p->next = p->next->next;
	free(q);
	q = NULL;
	L->len--;
	printf("删除成功\n");
	return 0;
}
//链表按值查找返回位置
int list_search_value(NodePtr L, datatype e)
{
	if (NULL == L || list_empty(L))
	{
		printf("查找失败\n");
		return -1;
	}
	NodePtr p = L->next;
	for (int i = 0; i < L->len; i++)
	{
		if (p->data == e)
		{
			return i;
		}
		p = p->next;
	}
	printf("没找到\n");
	return -1;
}
//链表按位置进行修改
int list_update_pos(NodePtr L, int pos, datatype e)
{
	if (L == NULL || list_empty(L) || pos < 1 || pos > L->len)
	{
		printf("修改失败\n");
		return -1;
	}
	NodePtr p = list_search_pos(L, pos);
	p->data = e;
	printf("修改成功\n");
	return 0;
}
//按值进行修改
int list_update_value(NodePtr L, datatype old_e, datatype new_e)
{
	if (NULL == L || list_empty(L))
	{
		printf("修改失败\n");
		return -1;
	}
	NodePtr p = L->next;
	for (int i = 0; i < L->len; i++)
	{
		if (p->data == old_e)
		{
			p->data = new_e;
		}
		p = p->next;
	}
	printf("修改成功\n");
	return 0;
}
//将链表进行翻转
void list_reverse(NodePtr L)
{
	if (NULL == L || L->len <= 1)
	{
		printf("翻转失败\n");
		return;
	}
	NodePtr H = L->next;
	L->next = NULL;
	NodePtr p = NULL;
	while (H != NULL)
	{
		p = H;
		H = H->next;
		p->next = L->next;
		L->next = p;
	}
	printf("翻转成功\n");
}
//链表的排序
int list_sort(NodePtr L)
{
	if (NULL == L || L->len <= 1)
	{
		printf("排序失败\n");
		return -1;
	}
	NodePtr p = L->next;
	for (int i = 1; i < L->len; i++)
	{
		for (int j = 0; j < L->len - i; j++)
		{
			if (p->data > p->next->data)
			{
				int temp = p->data;
				p->data = p->next->data;
				p->next->data = temp;
			}
			p = p->next;
		}
		p = L->next;
	}
	printf("排序成功\n");
	return 0;
}
//链表的翻转(递归函数实现)
NodePtr list_reserve1(NodePtr L)
{
	if(NULL == L || L->next->next == NULL)
	{
		return L;
	}
	NodePtr q = list_reserve1(L->next);
	L->next->next = L;
	L->next = NULL;
	return q;
}
//释放链表
void list_destroy(NodePtr L)
{
	if (NULL == L)
	{
		return;
	}
	while (!list_empty(L))
	{
		list_delete_head(L);
	}
	free(L);
	L = NULL;
	printf("销毁成功\n");
}

main.c

#include "linklist.h"
int main(int argc, const char *argv[])
{
	NodePtr L = list_create();
	if (L == NULL)
	{
		return -1;
	}
	//调用头插函数
	list_insert_head(L, 520);
	list_insert_head(L, 1314);
	list_insert_head(L, 666);
	list_insert_head(L, 999);

	//调用遍历函数
	list_show(L);

	//调用任意位置插入函数
	list_insert_pos(L, 1, 100);
	list_insert_pos(L, 3, 100);
	list_insert_pos(L, L->len + 1, 100);
	list_show(L);

	//调用排序函数
	list_sort(L);
	list_show(L);

	//调用头删函数
	list_delete_head(L);
	list_delete_head(L);
	list_show(L);

	//调用按位置查找位置
	NodePtr res = list_search_pos(L, 2);
	if (res != NULL)
	{
		printf("您要找的数据的值是%d\n", res->data);
	}

	//调用删除函数
	list_delete_pos(L, 1);
	list_delete_pos(L, 2);
	list_delete_pos(L, L->len);
	list_show(L);

	//调用按值查找位置
	int index = list_search_value(L, 666);
	if (index != -1)
	{
		printf("您要找的数据在链表的第%d个位置\n", index + 1);
	}

	//调用按位置进行修改函数
	list_update_pos(L, 1, 12345);
	list_show(L);

	//调用按值修改函数
	list_update_value(L, 12345, 6789);
	list_show(L);

	//调用翻转函数
	list_reverse(L);
	list_show(L);

	//调用翻转函数
	NodePtr retPtr = list_reserve1(L);
	list_show(retPtr);

	//调用释放函数
	list_destroy(L);
	L = NULL;

	return 0;
}
a

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

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

相关文章

开源XDR-SIEM一体化平台 Wazuh (1)基础架构

简介 Wazuh平台提供了XDR和SIEM功能&#xff0c;保护云、容器和服务器工作负载。这些功能包括日志数据分析、入侵和恶意软件检测、文件完整性监控、配置评估、漏洞检测以及对法规遵从性的支持。详细信息可以参考Wazuh - Open Source XDR. Open Source SIEM.官方网站 Wazuh解决…

秒懂C++之string类(上)

目录 一.string类的常用接口说明 二.不太常用接口&#xff08;了解接口&#xff09; 三.string类的遍历访问 3.1 迭代器iterator 3.2 反向迭代器 四.string的其他功能 4.1 reserve(扩容&#xff09; 4.2 resize 4.3 at 4.4 append 4.5 4.6 insert 一.string类的常用…

VS2015加断点(红色),修改过后,断点变为白色不能命中

实际这个问题是因为&#xff1a;源文件和原始版本不同。解决方法有二&#xff1a; 一&#xff0c;在断点上右键&#xff0c;选择“位置”》勾选”允许源代码与原始版本不同&#xff1b; 二&#xff0c;点击菜单栏“调试”》“选项和设置”》“常规”》去掉“要求源文件与原始…

外卖霸王餐运营规划,系统该怎么选择?

在当今的外卖市场中&#xff0c;竞争日益激烈&#xff0c;如何吸引并留住消费者成为了每个餐饮商家关注的焦点。霸王餐作为一种创新的营销策略&#xff0c;以其独特的魅力&#xff0c;吸引了大量消费者的目光。然而&#xff0c;如何有效地运营霸王餐活动&#xff0c;选择合适的…

浅谈断言之XML Schema断言

浅谈断言之XML Schema断言 “XML Schema断言”是一种专门用于验证基于XML的响应是否遵循特定XML Schema定义的标准和结构的断言类型。下面我们将详细探讨XML Schema断言的各个方面。 XML Schema断言简介 XML Schema断言&#xff08;XML Schema Assertion&#xff09;允许用户…

EXO项目解析:pynvml怎么实现监控的,包括什么参数

目录 pynvml怎么实现监控的,包括什么参数 pynvml实现监控的方式 pynvml包括的主要参数 GPU功耗的组成 举例说明 注意事项 EXO项目解析:https://github.com/exo-explore/exo?tab=readme-ov-file 这段代码是一个使用setuptools库编写的Python包安装脚本,主要用于定义和…

std的时间函数——chrono

参考&#xff1a; C 标准库 分数运算&#xff08;ratio库&#xff09; 再也不被时间束缚&#xff1a;C stdchrono时间库全面解析 C11时间类 c11 chrono全面解析(最高可达纳秒级别的精度) C std::chrono库使用指南 (实现C 获取日期,时间戳,计时等功能) 一、std的分数ratio…

Android 防止重复点击

1.第一种方式&#xff1a; private static final int MIN_DELAY_TIME 2000; // 两次点击间隔不能少于2000ms private static long lastClickTime System.currentTimeMillis(); public static boolean isFastClick() { boolean flag true; long currentClickTime …

JMeter接口测试-3.断言及参数化测试

1. 断言 JMeter官方断言&#xff08;Assertion&#xff09;的定义 用于检查测试中得到的响应数据是否符合预期&#xff0c;用于保证测试过程中的数据交互与预期一致 断言的目的&#xff1a; 一个取样器可以添加多个不同形式的断言&#xff0c;根据你的检查需求来添加相应的…

dou dian滑块captchaBody

声明(lianxi a15018601872) 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 前言(lianxi a…

基于生物地理算法的MLP多层感知机优化matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 生物地理算法&#xff08;BBO&#xff09;原理 4.2 多层感知机&#xff08;MLP&#xff09; 4.3 BBO优化MLP参数 5.完整程序 1.程序功能描述 基于生物地理算法的MLP多层感知机优化mat…

Git之repo sync -l与repo forall -c git checkout用法区别(四十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Java 集合框架:TreeMap 的介绍、使用、原理与源码解析

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 021 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

SpringBoot原理解析(二)- Spring Bean的生命周期以及后处理器和回调接口

SpringBoot原理解析&#xff08;二&#xff09;- Spring Bean的生命周期以及后处理器和回调接口 文章目录 SpringBoot原理解析&#xff08;二&#xff09;- Spring Bean的生命周期以及后处理器和回调接口1.Bean的实例化阶段1.1.Bean 实例化的基本流程1.2.Bean 实例化图例1.3.实…

leetcode算法题之接雨水

这是一道很经典的题目&#xff0c;问题如下&#xff1a; 题目地址 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 解法1&#xff1a;动态规划 动态规划的核心就是将问题拆分成若干个子问题求解&#…

相信开源的力量,MoonBit 构建系统正式开源

MoonBit 构建系统正式开源 作为由 AI 驱动的云服务和边缘计算开发者平台&#xff0c;MoonBit 自设计之初便注重工具链与语言的协同效果。MoonBit 为开发者提供了一套开箱即用的工具链&#xff0c;包括集成开发环境&#xff08;IDE&#xff09;、编译器、构建系统和包管理器&…

内网隧道——HTTP隧道

文章目录 一、ReGeorg二、Neo-reGeorg三、Pivotnacci 实验网络拓扑如下&#xff1a; 攻击机kali IP&#xff1a;192.168.111.0 跳板机win7 IP&#xff1a;192.168.111.128&#xff0c;192.168.52.143 靶机win server 2008 IP&#xff1a;192.168.52.138 攻击机与Web服务器彼此之…

Unity 之 【Android Unity 共享纹理】之 Android 共享图片给 Unity 显示

Unity 之 【Android Unity 共享纹理】之 Android 共享图片给 Unity 显示 目录 Unity 之 【Android Unity 共享纹理】之 Android 共享图片给 Unity 显示 一、简单介绍 二、共享纹理 1、共享纹理的原理 2、共享纹理涉及到的关键知识点 3、什么可以实现共享 不能实现共享…

越权与逻辑漏洞

目录 越权漏洞 1、越权原理概述 2、越权分类 2.1、平行越权 2.2、垂直越权 3、越权防范&#xff1a; 逻辑漏洞 1、常见的逻辑漏洞 2、逻辑漏洞概述 3、逻辑漏洞防范&#xff1a; 越权漏洞 1、越权原理概述 如果使用A用户的权限去操作B用户的数据&#xff0c;A的权限…

静态路由技术

一、路由的概念 路由是指指导IP报文发送的路径信息。 二、路由表的结构 1、Destination/Mask:IP报文的接收方的IP地址及其子网掩码; 2、proto:协议(Static:静态路由协议,Direct:表示直连路由) 3、pref:优先级(数值和优先级成反比) 4、cost:路由开销(从源到目的…