文章目录

  • 1.数据结构
    • 1.概念
    • 2.衡量代码质量和效率
      • 1.时间复杂度
      • 2.空间复杂度
    • 3.数据结构分类
      • 1.逻辑结构
      • 2.存储结构
      • 3.常见的数据结构
  • 2.链表
      • 1.与顺序表的区别
      • 2.链表分类
        • 1.单向链表
          • 1.定义链表节点类型
          • 2.空链表的创建
          • 3.链表的头插法
          • 4.链表的遍历
          • 5.链表元素删除
  • 3.makefile
  • 习题

1.数据结构

1.概念

程序 ==数据结构 + 算法

  • 描述数据存储和操作的结构

  • 操作数据对象的方法

2.衡量代码质量和效率

在理想情况下,无论代码操作数据量多大,都希望程序代码的运行时间保持恒定。

因此,当代码操作数据量增大的时候,代码运行时间增速缓慢就表明代码的质量和效率高,为了衡量这种数据量和时间的关系,引入时间复杂度和空间复杂度的概念

1.时间复杂度

数据量的增长与程序运行时间的增长所呈现的比例关系就称为时间渐进复杂度函数,也就是时间复杂度

  • 常见的时间复杂度:
    • O(1):程序运行时间维持恒定
    • O(n):数据量和运行时间关系为线性
    • O(logn):数据量少时运行时间增长较快,数据量大时运行时间趋于稳定
    • O(nlogn),O(n2),O(n3),O(2^n)……

2.空间复杂度

数据的增长与程序占据空间的增长所呈现的比例函数关系,称为空间复杂度

3.数据结构分类

1.逻辑结构

  • 线性结构:表(一对一)
  • 非线性结构:树(一对多)、图(多对多)

2.存储结构

  • 顺序存储
  • 链式存储
  • 散列存储
  • 索引存储

3.常见的数据结构

  • 顺序表、链式表
  • 顺序栈、链式栈
  • 顺序队列、链式队列
  • 二叉树、邻接表、邻接矩阵

2.链表

1.与顺序表的区别

  • 顺序表(数组)特点:
    • 存储空间连续,访问元素方便
    • 无法利用小的空间,空间必须连续
    • 顺序表元素必须有限
    • 插入和删除效率低
  • 链表特点:
    • 存储空间可以不连续,访问元素不方便
    • 可以利用一些小的存储空间
    • 链表元素可以没有上限
    • 插入和删除效率高

2.链表分类

1.单向链表

只能通过链表节点找到后一个节点,访问链表元素的方向是单向的

1.定义链表节点类型

代码实现:

typedef int datatype;/*链表节点类型*/
typedef struct node {datatype data;          // 数据域,存放数据struct node *pnext;     // 指针域,指向下一个节点
} linknode;
2.空链表的创建
  • 创建一个空的链表节点
  • data不需要赋值,空白节点不存放数据,主要为了保证链表操作的便利性
  • pnext必须赋值为NULL,表示该节点为最后一个节点
  • 将节点地址返回

代码实现:

linknode *create_empty_linklist(void){linknode *ptmpnode = NULL;ptmpnode = malloc(sizeof(linknode));if(ptmpnode == NULL){printf("filed to malloc");return NULL;}ptmpnode->pnext = NULL;return ptmpnode;
}
3.链表的头插法
  • 申请新的节点空间
  • 将想要存放的数据存放到新申请的数据控件中
  • 将新申请节点的pnext赋值为空白节点的pnext
  • 将空白节点的pnext赋值为新申请节点

代码实现:

int insert_head_linklist(linknode *phead,datatype tmpdata){linknode *ptmpnode = NULL;ptmpnode = malloc(sizeof(linknode));ptmpnode->data = tmpdata;ptmpnode->pnext = phead->pnext;phead->pnext = ptmpnode;return 0;
}
4.链表的遍历

代码实现:

方法一:while(p != NULL){p = p->pnext;}	//多用于遍历链表所有元素
方法二:while(p->next != NULL){p = p->next;}	//多用于找出链表的最后一个节点
void show_linklist(linknode *phead){linknode *ptmpnode = NULL;ptmpnode = phead->pnext;while(ptmpnode != NULL){printf("%d ",ptmpnode->data);ptmpnode = ptmpnode->pnext;}printf("\n");return 0;
}
5.链表元素删除
  • 定义两个指针ptmpnode,pprenode,ptmpnode用来遍历链表查找要删除的元素,pprenode永远指向ptmpnode的前一个节点
  • 当ptmpnode找到要删除的节点元素,让pprenode->pnext赋值为ptmpnode ->ptext
  • 将要删除的元素释放,再将ptmpnode赋值为pprenode->pnext
  • 让ptmpnode判断下一节点元素是否删除,直到该指针指向NULL为止

代码实现:

int delete_linklist(linknode *phead,datatype tmpdata){linknode *ptmpnode = NULL;linknode *pprenode = NULL;pprenode = phead;ptmpnode = phead->pnext;while(ptmpnode != NULL){if(ptmpnode->data == tmpdata){pprenode->pnext = ptmpnode->pnext;free(ptmpnode);ptmpnode = pprenode->pnext;}else{ptmpnode = ptmpnode->pnext;pprenode = pprenode->pnext;}}retuen 0;
}

3.makefile

工程管理工具,主要用来管理代码的编译

  • makefile可以根据文件中的规则来选择符合条件的代码完成编译
  • makefile能够根据依赖关系来决定哪些代码需要编译,哪些代码不需要编译

使用规则:

  • 在工程目录下,新建一个makefile文件
  • 在makefile中编写对应的文件编译规则
  • 在工程目录下使用make调用makefile中的规则完成代码编译
  • 编译代码成功后即可运行可执行程序

语法规则:

要生成的文件:依赖的所有文件
生成命令方式

习题

  1. 封装一个函数返回链表中第一个指定元素节点的地址

    代码实现:

    void search_linklist(linknode *phead, int tmpdata){linknode *ptmpnode = NULL;linknode *pprenode = NULL;ptmpnode = phead->pnext;pprenode = phead;while(ptmpnode != NULL){if(ptmpnode->data == tmpdata){printf("find it! %p\n", ptmpnode);return;}else{ptmpnode = ptmpnode->pnext;pprenode = pprenode->pnext;}}return;}
    
  2. 封装一个函数将链表中指定元素的值更新为新值

代码实现:

void change_linklist(linknode *phead, int tmpdata,int overdata){linknode *ptmpnode = NULL;linknode *pprenode = NULL;ptmpnode = phead->pnext;pprenode = phead;while(ptmpnode != NULL){if(ptmpnode->data == tmpdata){ptmpnode->data = overdata;}ptmpnode = ptmpnode->pnext;pprenode = pprenode->pnext;}return;}
  1. 封装一个函数实现尾插法

代码实现:

void insert_tail_linklist(linknode *phead,int tmpdata){linknode *ptmpnode = NULL;ptmpnode = phead->pnext;while(ptmpnode->pnext != NULL){ptmpnode = ptmpnode->pnext;}linknode *pnewnode = NULL;pnewnode = malloc(sizeof(linknode));ptmpnode->pnext = pnewnode;pnewnode->data = tmpdata;pnewnode->pnext = NULL;return;
}

LL){

       ptmpnode = ptmpnode->pnext;}linknode *pnewnode = NULL;pnewnode = malloc(sizeof(linknode));ptmpnode->pnext = pnewnode;pnewnode->data = tmpdata;pnewnode->pnext = NULL;return;

}

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot+Vue实现校园商铺系统

作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参…

从资源闲置到弹性高吞吐,JuiceFS 如何构建 70GB/s 吞吐的缓存池?

AI 模型的训练与推理对存储系统提出了极为严苛的要求,特别是在高吞吐、高并发以及对海量小文件的高效处理方面,已成为三大主要挑战。尽管基于 Lustre 或 GPFS 的并行文件系统具备出色的性能,但其成本高昂、吞吐能力与容量强耦合,可…

提升JVM性能之CMS垃圾回收器的优化分析与案例剖析

这里写目录标题一、CMS基本介绍二、CMS核心优化策略1. 避免并发模式失败(Concurrent Mode Failure)2. 减少内存碎片3. 调优并发阶段耗时4. 新生代优化配合三、典型案例解析案例1:电商服务频繁Full GC案例2:金融交易系统碎片导致长…

Token系列 - 再谈稳定币

相关政策 2024年12月,欧洲《加密资产市场监管法案》正式成为法律2025年3月,日本细化了加密资产及稳定币的监管调整2025年5月,英国发布了关于稳定币发行、加密资产托管及加密资产公司财务稳健性的监管提案;2025年5月20日&#xff…

【20min 急速入门】使用Demucs进行音轨分离

创建环境 conda create --name mujica python3.10下载加速依赖 先用nvidia-smi检查机器使用的独显版本, 然后从pytorch官网下载对应的GPU版torch, torchaudio 比如我的是12.2, 就下载11.8版本的 pip3 install torch torchvision torchaudio --index-url https://download.p…

字节Seed发布扩散语言模型,推理速度达2146 tokens/s,比同规模自回归快5.4倍

用扩散模型写代码,不仅像开了倍速,改起来还特别灵活!字节Seed最新发布扩散语言模型Seed Diffusion Preview,这款模型主要聚焦于代码生成领域,它的特别之处在于采用了离散状态扩散技术,在推理速度上表现出色…

海洋大地测量基准与水下导航系列之九我国海洋PNT最新技术进展(下)

三、海洋PNT技术装备研发与工程化应用 1.海底基准装备 研制了首批适应海洋环境的多型海底基准站装备,在我国南海海域成功布设了定位精度优于0.25m的海底大地测量试验基准网,实现了我国海底大地测量基准技术零的突破。基准方舱具备稳固、抗压、防腐、防…

入门MicroPython+ESP32:安装逗脑IDE及驱动

本篇文章将手把手带大家入门MicroPython ESP32,重点介绍逗脑IDE的安装过程以及相关驱动的安装。 一、下载逗脑IDE 要开始使用逗脑IDE,首先需要从官网下载最新版本。请访问以下网址进行下载:https://www.itprojects.cn/ide 下载时的界面大…

CentOS上部署Redis及其哨兵(Sentinel)模式

架构:说明我这里是伪集群的,redis 在同一台机器,Sentinel 只有一个,也存在单点故障问题只能当作开发环境使用,要满足生产至少是下面这种架构 ------------------- ------------------- ------------------- …

《软件测试与质量控制》实验报告二 单元测试

目 录 一、实验学时 二、实验目的 三、实验环境 (一)硬件环境: (二)软件环境: 四、实验内容 1、实验方案: 2、实验步骤: 3、设计思路: 1、安装JUnit和Eclemma…

k8s模式部署PolarDB-X

当前文档适配PolarDB-X V2.4.0 版本 环境描述: 部署机(ops)1x2.2x.2x8.116,部署机需要可以访问互联网。使用ansible进行部署,自行安装ansible。需要部署两个k8s集群,分别在其上安装一个polardb-x集群。 部…

Flask + YARA-Python*实现文件扫描功能

以下是一个 完整的 Web API 示例,使用 Flask YARA-Python 实现文件扫描功能,支持上传文件并返回 YARA 规则匹配结果。 ✅ 功能说明 提供一个 /scan 接口,支持文件上传使用预加载的 YARA 规则进行扫描返回 JSON 格式的匹配结果支持多规则、可…

WinForm之NumericUpDown控件

NumericUpDown(数字上下控件)是 WinForm 中专门用于输入和调整数值的控件,它结合了文本框和上下按钮,用户可通过点击按钮或直接输入来设置数值,且能严格限制数值范围(最小值、最大值)和步长&…

一文读懂K8S kubectl 命令,运维小白必看!

一、Kubectl 是什么? Kubectl 是 Kubernetes(简称 K8S)集群的命令行工具,它就像是一把万能钥匙,让我们可以与 K8S 集群进行交互,轻松管理集群中的各种资源,像是 Pod、Service、Deployment 等等。通过向 K8S API 发送 REST 请求,kubectl 实现了对集群资源的增删改查等操…

髋臼方向的定义与测量-I

近期看到关于髋臼方向不同应用场景下的不同定义,觉得特别有意思,但是,原文是影印本,不太方便实用屏幕取词翻译,且一些专业术语也不太好理解。 因此,我将原文和翻译整理了一些,不对的地方&#x…

Python爬虫实战:研究mahotas库,构建图像获取及处理系统

一、引言 (一)研究背景 在信息爆炸的时代,图像作为一种直观、丰富的信息载体,其数量在互联网上呈现指数级增长。这些图像数据涵盖了自然景观、动植物、工业产品等多个领域,为模式识别、机器学习等研究提供了宝贵的数据源。特别是在植物学研究领域,叶片图像包含了丰富的…

【04】海康相机C#开发——VS 在编译时,提示“Files的值“+乱码情况解决办法’ ,C#项目打开编译时报错:Files 的值“IGEF‘,

文章目录C#项目打开,用VS 在编译时编译时报错:Files 的值“乱码; 有的编译器会显示:Files的值“IGEF 以上报错都为同一种错误,.net中的配置文件乱码导致的: 找到项目目录下的“..\obj\Debug\”的文件夹中…

MySQL隐式转换陷阱:从错误查询案例解析索引失效与数据类型匹配

开始之前,先问个问题问题:mysql 数据类型是date ,怎么写查询条件索引有效? ——下面带着疑问看下去。 一、mysql-8.隐式转换导致索引失效或查出不符合where条件结果 今天在执行一条sql语句时候,where条件写错了&#x…

【sklearn(01)】数据集加载、划分,csv文件创建,特征工程,无量纲化

目录sklearn数据集玩具数据集现实世界数据集加载玩具数据集获取现实世界数据集本地csv数据创建csv文件pandas加载csv数据集划分特征工程步骤特征工程APIDictVectorizer 字典列表特征提取APICountVectorizer 文本特征提取API英文文本提取中文文本提取TfidfVectorizer TF-IDF文本…

docker desktop入门(docker桌面版)(提示wsl版本太低解决办法)

参考文章:Docker Desktop Engine Stopped原因分析(docker桌面停止)WSL没装或没更新 文章目录Docker Desktop入门指南1. Docker Desktop简介2. 安装Docker Desktop2.1 系统要求2.2 下载和安装3. 配置Docker Desktop修改默认存储路径4. 运行你的…