2024.7.19 作业
1.链表的排序
int list_sort(NodePtr L)
{if(NULL==L || L->len<=1){printf("排序失败");return -1;}int len=L->len+1;NodePtr p;int i,j;for( i=1;i<len;i++){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;}}}printf("排序成功\n");return 0;
}
2.链表的反转(递归实现)
// 递归反转链表
NodePtr list_fz(NodePtr L)
{ // 基础情况:空链表或只有一个节点 if (L == NULL || L->next == NULL) { return L; } NodePtr new_L = list_fz(L->next); L->next->next = L; L->next = NULL;return new_L;
}
3.链表去重
// 去重函数
int list_dr(NodePtr L)
{NodePtr current = L;NodePtr prev = NULL;while (current != NULL) {NodePtr runner = L;prev = NULL;int flag = 0;// 查找当前节点的重复项while (runner != current) {if (runner->data == current->data) {flag = 1;break;}prev = runner;runner = runner->next;}if (flag) {// 如果是重复节点,删除当前节点NodePtr temp = current;if (prev != NULL) {prev->next = current->next;} else {L = current->next; // 更新头节点}current = current->next;free(temp);} else {current = current->next;}}
}
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);//释放链表
void list_destroy(NodePtr L);//链表排序
int list_sort(NodePtr L);// 去重函数
int list_dr(NodePtr head);// 递归反转链表
NodePtr list_fz(NodePtr L);#endif
linklist.c
#include "linklist.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");return -1;}NodePtr p = apply_node(e);if(NULL==p){return -1;}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;} 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 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<=0 ||pos>L->len+1){printf("插入失败\n");return -1;}NodePtr p = apply_node(e);if(NULL==p){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 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 q=list_search_pos(L,pos-1);NodePtr p=q->next;q->next =p->next;free(p);p=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 q=L->next;for(int index=1;index<=L->len;index++){if(q->data==e){return index;}q=q->next;}printf("没找到\n");return -1;
}//链表按位置进行修改
int list_update_pos(NodePtr L,int pos,datatype e)
{if(NULL==L || list_empty(L) || pos<1 || pos>L->len ){printf("修改失败\n");return -1;}list_search_pos(L,pos)->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;}int res = list_search_value(L,old_e);if(res == -1){printf("没有要修改的值\n");return -1;}list_update_pos(L,res,new_e);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");return;
}//释放链表
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 || L->len<=1){printf("排序失败");return -1;}int len=L->len+1;NodePtr p;int i,j;for( i=1;i<len;i++){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;}}}printf("排序成功\n");return 0;
}// 递归反转链表
NodePtr list_fz(NodePtr L)
{ // 基础情况:空链表或只有一个节点 if (L == NULL || L->next == NULL) { return L; } NodePtr new_L = list_fz(L->next); L->next->next = L; L->next = NULL;return new_L;
} // 去重函数
int list_dr(NodePtr L)
{NodePtr current = L;NodePtr prev = NULL;while (current != NULL) {NodePtr runner = L;prev = NULL;int flag = 0;// 查找当前节点的重复项while (runner != current) {if (runner->data == current->data) {flag = 1;break;}prev = runner;runner = runner->next;}if (flag) {// 如果是重复节点,删除当前节点NodePtr temp = current;if (prev != NULL) {prev->next = current->next;} else {L = current->next; // 更新头节点}current = current->next;free(temp);} else {current = current->next;}}
}
main.c
#include"linklist.h"int main(int argc, const char *argv[])
{//调用函数创建一个链表NodePtr L = list_create();if(NULL == L){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);printf("排序: ");list_sort(L);list_show(L);printf("去重:");list_dr(L);list_show(L);printf("反转:");L->next=list_fz(L->next);list_show(L);return 0;
}
思维导图

相关文章:
2024.7.19 作业
1.链表的排序 int list_sort(NodePtr L) {if(NULLL || L->len<1){printf("排序失败");return -1;}int lenL->len1;NodePtr p;int i,j;for( i1;i<len;i){for( j0,pL;j<len-i;j,pp->next){if( p->data > p->next->data ){datatype tp-&…...
python如何创建SQLite 数据库连接,如何将数据库存储在内存中?
嗨,大家好,我是兰若姐姐。今天给大家说下如何创建SQLite 数据库连接,并将数据库存储在内存中,这是一种临时的、私有的数据存储空间,一般用于以下情形: 什么都不说,先上代码: import sqlite3创建数据库连接…...
机器学习-20-基于交互式web应用框架streamlit的基础使用教程
参考简洁而优雅地展示你的算法和数据——streamlit教程(一) 原理介绍与布局控制 参考Streamlit 讲解专栏(二):搭建第一个应用 Streamlit 讲解专栏(三):两种方案构建多页面 Streamlit 讲解专栏(五):探索强大而灵活的 st.write() 函数 1 streamlit 1.1 运行原理 im…...
基于luckysheet实现在线电子表格和Excel在线预览
概述 本文基于luckysheet实现在线的电子表格,并基于luckyexcel实现excel文件的导入和在线预览。 效果 实现 1. luckysheet介绍 Luckysheet ,一款纯前端类似excel的在线表格,功能强大、配置简单、完全开源。 官方文档在线Demo 2. 实现 …...
【学习笔记】无人机系统(UAS)的连接、识别和跟踪(一)-3GPP TS 23.256 技术规范概述
3GPP TS 23.256 技术规范,主要定义了3GPP系统对无人机(UAV)的连接性、身份识别、跟踪及A2X(Aircraft-to-Everything)服务的支持。 3GPP TS 23.256 技术规范: 以下是文档的核心内容总结: UAV系…...
sqlalchemy_dm
1、参考文档: https://blog.csdn.net/njcwwddcz/article/details/126554118 https://eco.dameng.com/document/dm/zh-cn/pm/dmpython-dialect-package.html 2、生成工具 sqlalchemy2.0.0.zip 3、安装步骤 conda create --name kes --clone kes1 rz unzip sql…...
基于springboot+vue+uniapp的驾校预约平台小程序
开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…...
echarts实现3d柱状效果
代码如下,单个的调第一个方法,多个柱状的调第二个方法,具体情况修改参数或者二次开发即可 //3d柱状图 export function getEcharts3DBar (xAxisData:string[][name1,name2,name3], data:number[][1,2,3], colorObj:IBaseObject{topStartColo…...
Flask校验
WTForms 是一个 Python 库,用于处理和验证 Web 表单。它提供了很多功能来简化表单处理,包括字段类型、验证器、错误消息等。在 WTForms 中,validate 机制是用于确保表单数据满足特定条件的关键部分。 1.验证器(Validators&#x…...
web前端 Vue 框架面试120题(一)
面试题 1 . 简述Vue的MVVM 模式? 参考回答: MVVM 是 Model-View-ViewModel的缩写,即将数据模型与数据表现层通过数据驱动进行分离,从而只需要关系数据模型的开发,而不需要考虑页面的表现,具体说来如下:M…...
UniApp__微信小程序项目实战 实现长列表分页,通过 onReachBottom 方法上划分次加载数据
UniApp 实现长列表分页,通过 onReachBottom 方法上划分次加载数据 项目实战中比较常见,方便下次使用 文章目录 一、应用场景? 二、作用 三、使用步骤? 3.1 实现的整体思路? …...
数据结构(功能受限的表-栈队列)
功能受限的表结构 一、栈和队列介绍 栈和队列是两种重要的线性结构,从数据结构角度,他们都是线性表,特殊点在于它们的操作被限制,也就是所谓的功能受限,统称功能受限的线性表 从数据类型角度,它们也可以是…...
高数知识补充----矩阵、行列式、数学符号
矩阵计算 参考链接:矩阵如何运算?——线性代数_矩阵计算-CSDN博客 行列式计算 参考链接:实用的行列式计算方法 —— 线性代数(det)_det线性代数-CSDN博客 参考链接:行列式的计算方法(含四种,…...
《Techporters架构搭建》-Day01 第一个RESTful API接口
微服务架构搭建 搭建微服务架构分析一下项目的build.gradle添加Demo接口 搭建微服务架构 首先搭建系统管理模块,模块结构如下 tps-cloud └── tps-system -- 系统管理模块└── tps-system-api -- 系统管理模块公共api模块└── tps-system-biz -- 系统管理模…...
【C++ —— AVL树】
C —— AVL树 AVL树的概念AVL树节点的定义AVL树的插入向上调整旋转左单旋右单旋左右双旋右左双旋 AVL树的高度AVL树的验证总结:代码 AVL树的概念 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素…...
跨平台webSocket模块设计技术解决方案
1. 概述 目标:设计并实现一个能够在多种操作系统上运行的WebSocket通讯模块,支持与前端浏览器和HTTPS服务端进行数据交换。技术栈:C11 ,使用跨平台库如 Boost处理网络IO,使用 JSON 库如 nlohmann/json 解析消息。 2.…...
Drools规则引擎
一、Drools规则引擎 Drools官网: https://www.drools.org/Drools中文网: http://www.drools.org.cn/bilibili学习视频(黑马博学谷2020年最新Java项目Drools业务规则管理系统(BRMS)): https://www.bilibili.com/video/BV1Pa4y1a7u…...
vue学习day11-路由、路由模块的封装、声明式导航-路由的介绍、VueRouter、router-link、自定义高亮类名
32、路由 (1)路由的介绍 1)生活中的路由:设备和ip的映射关系 2)路由:一种映射关系 3)Vue中的路由:路径与组件的映射关系 (根据路由就能知道不同的路径,应…...
智慧校园学期基础数据管理
在智慧校园基础数据管理之一的学期管理功能管理中,学期的有序管理具有重要意义。它不仅是教学活动有序开展的指挥棒,更是连接学校管理者、教师与学生之间沟通的桥梁,承载着规划、跟踪与管理学期内各项事务的重要使命。 学期管理功能的首要任务…...
ISP代理和双ISP代理:区别和优势
随着互联网技术的不断发展和普及,网络代理服务成为众多用户保护隐私、提高网络性能、增强安全性的重要工具。其中,ISP代理和双ISP代理是两种常见的网络代理服务形式。本文将详细探讨ISP代理和双ISP代理的区别和优势,以便用户更好地了解并选择…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
