【C语言】 作业11 链表+实现函数封装
递归实现链表数据互换,纯不会,明天再说
1、链表实现以下功能
链表,创建链表,申请节点,判空,头插,遍历输出,通过位置查找节点,任意位置插入,头删,任意位置删除,安置查找返回位置,按位置进行修改,按值进行修改,翻转链表,释放链表,链表的排序,反转链表(递归实现)
//link_list.h
#ifndef LINK_LIST_H
#define LINK_LIST_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_retval(NodePtr L,datatype e);//链表按位置进行修改
int list_updata_pos(NodePtr L,int pos,datatype e);//按值进行修改
int list_updata_data(NodePtr L,datatype old_e,datatype new_e);//将链表进行翻转
int list_reserve(NodePtr L);//释放链表
void list_destroy(NodePtr L);//链表的排序
int list_sort(NodePtr L);//链表的翻转(递归函数实现)
NodePtr list_reserve1(NodePtr L);#endif
//link_list.c
#include "link_list.h"//创建链表
NodePtr list_create()
{NodePtr L = (NodePtr)malloc(sizeof(Node));if(NULL == L){printf("链表创建失败\n");return NULL;}L->len = 0;L->next = NULL;printf("链表创建成功\n");return L;
}//申请结点封装数据的函数
NodePtr apply_node(datatype e)
{NodePtr p = (NodePtr)malloc(sizeof(Node));if(NULL == p){printf("创建结点失败\n");return NULL;}p->data = e;p->next = NULL;return p;}//链表判空
int list_empty(NodePtr L)
{return L->next == NULL;
}//头插
int list_insert_head(NodePtr L,datatype e)
{if(NULL == L){printf("头插失败\n");}NodePtr p = apply_node(e);p->next = L->next;L->next = p;L->len++;printf("头插成功\n");return 0;
}//链表遍历函数
int list_show(NodePtr L)
{if(NULL == L || list_empty(L)){printf("遍历失败\n");return -1;}printf("链表中的元素是:");NodePtr q = L->next;while(q){printf("%d->",q->data);q = q->next;}printf("NULL\n");
}//通过位置查找结点
NodePtr list_search_pos(NodePtr L,int pos)
{if(NULL == L || list_empty(L) || pos < 0 || pos > L->len){printf("查找失败\n");return NULL;}NodePtr q = L;for(int i = 0;i < pos;i++){q = q->next;}return q;
}//任意位置插入
int list_insert_pos(NodePtr L,int pos,datatype e)
{if(NULL == L || pos < 1 || pos > L->len+1){printf("插入失败\n");return -1;}NodePtr p = apply_node(e);if(p == NULL){return -1;}NodePtr q = list_search_pos(L,pos-1);p->next = q->next;q->next = p;L->len++;printf("插入成功\n");return 0;
}//链表头删
int list_delete_head(NodePtr L)
{if(NULL == L || list_empty(L)){printf("头删失败\n");return -1;}NodePtr q = L->next;L->next = q->next;free(q);q = NULL;L->len--;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 q = list_search_pos(L,pos-1);NodePtr p = q->next;q->next = p->next;free(p);p = NULL;L->len--;printf("成功删除第%d个元素\n",pos);return 0;
}//链表按值查找返回位置
int list_search_retval(NodePtr L,datatype e)
{if(NULL == L || list_empty(L)){printf("查找失败\n");return -1;}NodePtr q = L->next;for(int i = 1;i <= L->len;i++){if(q->data == e){return i;}q = q->next;}printf("没有找到该元素\n");return -1;
}//链表按位置进行修改
int list_updata_pos(NodePtr L,int pos,datatype e)
{if(NULL == L || list_empty(L) || pos < 1 || pos > L->len){printf("修改失败\n");return -1;}NodePtr q = list_search_pos(L,pos);q->data = e;printf("按位置修改成功\n");return 0;
}//按值进行修改
int list_updata_data(NodePtr L,datatype old_e,datatype new_e)
{if(NULL == L || list_empty(L)){printf("修改失败\n");return -1;}NodePtr q = L->next;while(q){if(q->data == old_e){q->data = new_e;return 0;}q = q->next;}printf("没有该元素\n");return -1;
}//将链表进行翻转
int list_reserve(NodePtr L)
{if(NULL == L || list_empty(L) || L->len == 1){printf("翻转失败\n");return 0;}NodePtr H = L->next;L->next = NULL;while(H){NodePtr q = H;H = H->next;q->next = L->next;L->next = q;}printf("翻转成功\n");return 0;
}//释放链表
void list_destroy(NodePtr L)
{if(NULL == L){return ;}while(!list_empty(L)){list_delete_head(L);}free(L);L = NULL;printf("释放链表成功\n");
}//链表的排序
int list_sort(NodePtr L)
{if(NULL == L || list_empty(L) || L->len ==1){printf("排序失败\n");return -1;}for (int i = 1; i < L->len; i++) {NodePtr p = L->next;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;}} printf("排序成功\n");return 0;
}//链表的翻转(递归函数实现)
NodePtr list_reserve1(NodePtr L)
{if(NULL == L || L->len == 1){printf("翻转失败\n");return L;}NodePtr q = list_reserve1(L->next);L->next->next = L;L->next = NULL;return q;
}
//main.c
#include "link_list.h"int main(int argc, const char *argv[])
{NodePtr L = list_create();int retem = list_empty(L);list_insert_head(L,520);list_insert_head(L,1314);list_insert_head(L,123);list_insert_head(L,456);list_insert_head(L,789);list_show(L);list_insert_pos(L,2,200);list_show(L);list_delete_head(L);list_show(L);list_delete_pos(L,3);list_show(L);int retval = list_search_retval(L,200);if(retval != -1){printf("该元素在第%d个位置\n",retval);}retval = list_search_retval(L,232);list_updata_pos(L,3,520);list_show(L);list_updata_data(L,456,997);list_show(L);list_reserve(L);list_show(L);list_sort(L);list_show(L);NodePtr retPtr = list_reserve1(L);list_show(retPtr);list_destroy(L);L = NULL;list_show(L);return 0;
}
输出结果如下:
相关文章:

【C语言】 作业11 链表+实现函数封装
递归实现链表数据互换,纯不会,明天再说 1、链表实现以下功能 链表,创建链表,申请节点,判空,头插,遍历输出,通过位置查找节点,任意位置插入,头删,…...
【Ubuntu】Ubuntu20修改MAC地址
文章目录 一、临时修改MAC地址(重启后复原)二、永久修改MAC地址 场景:在做虚拟机复制时,复制完的两台虚拟机存在相同MAC,导致无法分别分配IP。 解决:修改一台虚拟机的MAC地址。 一、临时修改MAC地址&#…...

ClickHouse集成LDAP实现简单的用户认证
1.这里我的ldap安装的是docker版的 docker安装的化就yum就好了 sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo systemctl start docker 使用下面的命令验证sudo docker run hello-world docker pull osixia/openl…...
C语言-预处理详解
1.预处理符号 C语言中设置了一些预定义符号,可以直接使用,预定义符号是在预处理期间处理的。 __FILE__//代表当前进行编译的源文件 __LINE__//文件当前行号 __DATE__//文件当前日期 __TIME__//文件当前时间 __STDC__//如果编译器遵循ANSIC,…...

计算机网络-VLAN间通信(三层通信)模拟实现
目录 VLAN基础知识VLAN和普通LAN区别划分VLAN的原因 实现VLAN间的通信(三层通信)方案一:多臂路由方案二:单臂路由方案三:三层交换机 VLAN基础知识 VLAN(Virtual Local Area Network,虚拟局域网…...

【JAVA】数据类型及变量
🎉欢迎大家收看,请多多支持🌹 🥰关注小哇,和我一起成长🚀个人主页🚀 Java的数据类型 可以分为两类,基本数据类型和引用数据类型 基本数据类型有4类8种,4类分别是整型 浮…...

微软蓝屏事件暴露的网络安全问题
目录 1.概述 2.软件更新流程中的风险管理和质量控制机制 2.1.测试流程 2.2.风险管理策略 2.3.质量控制措施 2.4.小结 3.预防类似大规模故障的最佳方案或应急响应对策 3.1. 设计冗余系统 3.2. 实施灾难恢复计划 3.3. 建立高可用架构 3.4. 类似规模的紧急故障下的响应…...
11 - FFmpeg - 编码 AAC
Planar 模式是 ffmpeg内部存储模式,我们实际使用的音频文件都是Packed模式的。 FFmpeq解码不同格式的音频输出的音频采样格式不是一样。 其中AAC解码输出的数据为浮点型的 AV_SAMPLE_FMT_FLTP 格式,MP3 解码输出的数据为 AV_SAMPLE_FMT_S16P 格式(使用的…...

OS Copilot初体验的感受与心得
本文介绍体验操作系统智能助手OS Copilot后,个人的一些收获、体验等。 最近,抽空体验了阿里云的操作系统智能助手OS Copilot,在这里记录一下心得与收获。总体观之,从个人角度来说,感觉这个OS Copilot确实抓住了不少开发…...
Ajax学习笔记
文章目录标题 Ajax学习笔记axios使用axios请求拦截器axios响应拦截器优化axios响应结果 form-serialize插件图片上传HTTP协议请求报文相应报文接口文档 AJAX原理 - XMLHttpRequest使用XMLHttpRequestXMLHttpRequest - 查询参数查询字符串对象 XMLHttpRequest - 数据提交 事件循…...
医学深度学习与机器学习融合的随想
医学深度学习与机器学习融合的随想 近年来,深度学习(图像类)和机器学习在医学领域的应用取得了飞速发展,为医学影像分析、疾病诊断和预后预测等领域带来了革命性的变革。深度学习擅长从复杂数据中提取高层次特征,而机…...
坑人的macos tar 命令 (实际上是bsdtar)换用 gnu tar
周末 看着笔记本上好用的朗文当代高级词典(mac版)和其它两部词典,准备复制到黑苹果台式机上去。考虑到词典内容有太多小文件,普通复制传输太慢,毫无疑问用 tar 打包肯定快而且能保留原始文件的各种信息。命令如下: time tar czf …...

【SpringBoot3】全局异常处理
【SpringBoot3】全局异常处理 一、全局异常处理器step1:创建收入数字的页面step2:创建控制器,计算两个整数相除step3:创建自定义异常处理器step5:创建给用提示的页面step6:测试输入(10/0) 二、BeanValidato…...
vue-Treeselect
一、Node KeyTypeDescriptionid (required)Number | String用于标识树中的选项。其值在所有选项中必须是唯一的label (required)String用于显示选项childrennode[] | null声明一个分支节点。你可以: 1) 设置为由a组成的子选项数组。叶节点,b…...
【机器学习框架TensorFlow和PyTorch】基本使用指南
机器学习框架TensorFlow和PyTorch:基本使用指南 目录 引言TensorFlow概述 TensorFlow简介TensorFlow的基本使用 PyTorch概述 PyTorch简介PyTorch的基本使用 TensorFlow和PyTorch的对比结论 引言 随着深度学习的快速发展,机器学习框架在实际应用中起到…...
matlab 中的methods(Access = protected) 是什么意思
gpt版本 在 MATLAB 中,methods 是用于定义类方法的一部分。(Access protected) 是一种访问控制修饰符,它限制了方法的访问权限。具体来说,当你在类定义中使用 methods(Access protected) 时,你是在定义只有类本身及其子类可以访…...

【漏洞复现】Netgear WN604 downloadFile.php 信息泄露漏洞(CVE-2024-6646)
0x01 产品简介 NETGEAR WN604是一款由NETGEAR(网件)公司生产的无线接入器(或无线路由器)提供Wi-Fi保护协议(WPA2-PSK, WPA-PSK),以及有线等效加密(WEP)64位、128位和152…...
图像处理 -- ISP调优(tuning)的步骤整理
ISP调优流程培训文档 1. 硬件准备 选择合适的图像传感器:根据项目需求选择合适的传感器型号。搭建测试环境:包括测试板、光源、色彩卡和分辨率卡等。 2. 初始设置 寄存器配置:初始化传感器的寄存器设置,包括曝光、增益、白平衡…...

【中项】系统集成项目管理工程师-第4章 信息系统架构-4.2系统架构
前言:系统集成项目管理工程师专业,现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试,全称为“全国计算机与软件专业技术资格(水平)考试”&…...

node.js中nodemon : 无法加载和使用问题,这是由于windows安全策略影起的按如下操作即可
1、用管理员权限打开vscode 2、文件终端中打开,输入 Set-ExecutionPolicy -Scope CurrentUser 3、再输入RemoteSigned 4、使用get-ExecutionPolicy查看权限,可以看到变为了RemoteSigned 重启问题解决...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...

基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...

Unity VR/MR开发-VR开发与传统3D开发的差异
视频讲解链接:【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...

Canal环境搭建并实现和ES数据同步
作者:田超凡 日期:2025年6月7日 Canal安装,启动端口11111、8082: 安装canal-deployer服务端: https://github.com/alibaba/canal/releases/1.1.7/canal.deployer-1.1.7.tar.gz cd /opt/homebrew/etc mkdir canal…...

数据分析六部曲?
引言 上一章我们说到了数据分析六部曲,何谓六部曲呢? 其实啊,数据分析没那么难,只要掌握了下面这六个步骤,也就是数据分析六部曲,就算你是个啥都不懂的小白,也能慢慢上手做数据分析啦。 第一…...