当前位置: 首页 > news >正文

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 数据库连接,如何将数据库存储在内存中?

嗨&#xff0c;大家好&#xff0c;我是兰若姐姐。今天给大家说下如何创建SQLite 数据库连接,并将数据库存储在内存中,这是一种临时的、私有的数据存储空间&#xff0c;一般用于以下情形&#xff1a; 什么都不说&#xff0c;先上代码&#xff1a; import sqlite3创建数据库连接…...

机器学习-20-基于交互式web应用框架streamlit的基础使用教程

参考简洁而优雅地展示你的算法和数据——streamlit教程(一) 原理介绍与布局控制 参考Streamlit 讲解专栏(二):搭建第一个应用 Streamlit 讲解专栏(三):两种方案构建多页面 Streamlit 讲解专栏(五):探索强大而灵活的 st.write() 函数 1 streamlit 1.1 运行原理 im…...

基于luckysheet实现在线电子表格和Excel在线预览

概述 本文基于luckysheet实现在线的电子表格&#xff0c;并基于luckyexcel实现excel文件的导入和在线预览。 效果 实现 1. luckysheet介绍 Luckysheet &#xff0c;一款纯前端类似excel的在线表格&#xff0c;功能强大、配置简单、完全开源。 官方文档在线Demo 2. 实现 …...

【学习笔记】无人机系统(UAS)的连接、识别和跟踪(一)-3GPP TS 23.256 技术规范概述

3GPP TS 23.256 技术规范&#xff0c;主要定义了3GPP系统对无人机&#xff08;UAV&#xff09;的连接性、身份识别、跟踪及A2X&#xff08;Aircraft-to-Everything&#xff09;服务的支持。 3GPP TS 23.256 技术规范&#xff1a; 以下是文档的核心内容总结&#xff1a; UAV系…...

sqlalchemy_dm

1、参考文档&#xff1a; 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的驾校预约平台小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…...

echarts实现3d柱状效果

代码如下&#xff0c;单个的调第一个方法&#xff0c;多个柱状的调第二个方法&#xff0c;具体情况修改参数或者二次开发即可 //3d柱状图 export function getEcharts3DBar (xAxisData:string[][name1,name2,name3], data:number[][1,2,3], colorObj:IBaseObject{topStartColo…...

Flask校验

WTForms 是一个 Python 库&#xff0c;用于处理和验证 Web 表单。它提供了很多功能来简化表单处理&#xff0c;包括字段类型、验证器、错误消息等。在 WTForms 中&#xff0c;validate 机制是用于确保表单数据满足特定条件的关键部分。 1.验证器&#xff08;Validators&#x…...

web前端 Vue 框架面试120题(一)

面试题 1 . 简述Vue的MVVM 模式? 参考回答&#xff1a; MVVM 是 Model-View-ViewModel的缩写&#xff0c;即将数据模型与数据表现层通过数据驱动进行分离&#xff0c;从而只需要关系数据模型的开发&#xff0c;而不需要考虑页面的表现&#xff0c;具体说来如下&#xff1a;M…...

UniApp__微信小程序项目实战 实现长列表分页,通过 onReachBottom 方法上划分次加载数据

UniApp 实现长列表分页&#xff0c;通过 onReachBottom 方法上划分次加载数据 项目实战中比较常见&#xff0c;方便下次使用 文章目录 一、应用场景? 二、作用 三、使用步骤&#xff1f;          3.1 实现的整体思路&#xff1f;    …...

数据结构(功能受限的表-栈队列)

功能受限的表结构 一、栈和队列介绍 栈和队列是两种重要的线性结构&#xff0c;从数据结构角度&#xff0c;他们都是线性表&#xff0c;特殊点在于它们的操作被限制&#xff0c;也就是所谓的功能受限&#xff0c;统称功能受限的线性表 从数据类型角度&#xff0c;它们也可以是…...

高数知识补充----矩阵、行列式、数学符号

矩阵计算 参考链接&#xff1a;矩阵如何运算&#xff1f;——线性代数_矩阵计算-CSDN博客 行列式计算 参考链接&#xff1a;实用的行列式计算方法 —— 线性代数&#xff08;det&#xff09;_det线性代数-CSDN博客 参考链接&#xff1a;行列式的计算方法(含四种&#xff0c;…...

《Techporters架构搭建》-Day01 第一个RESTful API接口

微服务架构搭建 搭建微服务架构分析一下项目的build.gradle添加Demo接口 搭建微服务架构 首先搭建系统管理模块&#xff0c;模块结构如下 tps-cloud └── tps-system -- 系统管理模块└── tps-system-api -- 系统管理模块公共api模块└── tps-system-biz -- 系统管理模…...

【C++ —— AVL树】

C —— AVL树 AVL树的概念AVL树节点的定义AVL树的插入向上调整旋转左单旋右单旋左右双旋右左双旋 AVL树的高度AVL树的验证总结&#xff1a;代码 AVL树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素…...

跨平台webSocket模块设计技术解决方案

1. 概述 目标&#xff1a;设计并实现一个能够在多种操作系统上运行的WebSocket通讯模块&#xff0c;支持与前端浏览器和HTTPS服务端进行数据交换。技术栈&#xff1a;C11 &#xff0c;使用跨平台库如 Boost处理网络IO&#xff0c;使用 JSON 库如 nlohmann/json 解析消息。 2.…...

Drools规则引擎

一、Drools规则引擎 Drools官网&#xff1a; https://www.drools.org/Drools中文网: http://www.drools.org.cn/bilibili学习视频(黑马博学谷2020年最新Java项目Drools业务规则管理系统&#xff08;BRMS&#xff09;)&#xff1a; https://www.bilibili.com/video/BV1Pa4y1a7u…...

vue学习day11-路由、路由模块的封装、声明式导航-路由的介绍、VueRouter、router-link、自定义高亮类名

32、路由 &#xff08;1&#xff09;路由的介绍 1&#xff09;生活中的路由&#xff1a;设备和ip的映射关系 2&#xff09;路由&#xff1a;一种映射关系 3&#xff09;Vue中的路由&#xff1a;路径与组件的映射关系 &#xff08;根据路由就能知道不同的路径&#xff0c;应…...

智慧校园学期基础数据管理

在智慧校园基础数据管理之一的学期管理功能管理中&#xff0c;学期的有序管理具有重要意义。它不仅是教学活动有序开展的指挥棒&#xff0c;更是连接学校管理者、教师与学生之间沟通的桥梁&#xff0c;承载着规划、跟踪与管理学期内各项事务的重要使命。 学期管理功能的首要任务…...

ISP代理和双ISP代理:区别和优势

随着互联网技术的不断发展和普及&#xff0c;网络代理服务成为众多用户保护隐私、提高网络性能、增强安全性的重要工具。其中&#xff0c;ISP代理和双ISP代理是两种常见的网络代理服务形式。本文将详细探讨ISP代理和双ISP代理的区别和优势&#xff0c;以便用户更好地了解并选择…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生&#xff0c;系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler&#xff0c;它是Thread的子类&#xff08;就是package java.lang;里线程的Thread&#xff09;。本文将利用它将设备信息、报错信息以及错误的发生时间都…...