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

C语言 数据结构与算法 I

C语言-数据结构与算法

C语言基础

因为之前写算法都是用C++,也有了些C++基础,变量常量数据类型就跳过去吧。

首先是环境,学C++时候用Clion,C语言也用它写吧~

新建项目,选C执行文件,语言标准。。。就先默认C99吧,反正是测试环境,应该问题不大

image-202308231731119510

直接运行一手

image-202308213173157961

嗯。。JB家的新UI。。真是。。。。。。。一言难尽

指针

好像最开始学C++开始,就一直没玩明白指针,毕竟一用数组链表就直接上STL库,也不太用得到指针

新的学习阶段,从指针开始!

1

#include <stdio.h>int main() {int a = 123;int * p = &a;printf("a:%d\n", a);printf("*p:%d\n", *p);printf("a的地址:%p\n", &a);printf("指针p指向的地址:%p\n", p);printf("指针p自身的地址:%p\n", &p);return 0;
}

image-202308215144721227

如果你的Clion输出乱码,按照以下顺序配置即可解决:

文件——设置——编辑器——文件编码,都改成UTF-8

image-202310825145205006

然后点击确定,回到代码页面,点击最下方UTF-8,选择GBK

1

再点击转换,重新运行即可解决

image-202302825145348845

结构体

使用typedef可以给结构体指定别名

#include <stdio.h>
#include <string.h>
typedef struct Book {char isbn[50];char name[20];int price;
}B;int main() {// 声明struct Book b;// 初始化b.price = 20;strcpy(b.name, "笑场");// 声明同时初始化struct Book a = {"122333123", "冷玚", 45};B c = {"122334233123", "乡土中国", 65};return 0;
}

属性声明的同时进行变量声明

struct Book {char isbn[50];char name[20];int price;
} stu;

属性声明的同时进行变量声明及初始化

struct Book {char isbn[50];char name[20];int price;
} stu = {"1531", "宇宙超度指南", 46};

如果只需要声明一次,可以省略结构体标记

struct {char isbn[50];char name[20];int price;
} stu = {"1531", "宇宙超度指南", 46};

链表

image-20230906083438591

链表结构体定义

typedef struct node {int data;struct node *next;
} node;

image-20230906090559534

创建单链表

node *createList() {node *head = (node *) malloc(sizeof(node));if (head == NULL) return NULL; // 若内存申请失败,指针会为空(一般情况下不会申请失败)head->data = 0;head->next = NULL;return head;
}

头结点:头指针指向的结点

首元结点:头结点后面的第一个结点

插入新结点

image-20230906093917082

插入新结点的时候要注意,一定先抓住后边的那个结点,再修改前边的那个结点的指针指向。

(必须时刻有指针指向后边结点的位置,不能让后边的结点丢了😉)

删除指定位置结点

node *deleteNode(node *head, int pos) {node *currentNode = head;// 如果插入位置比链表长,为非法操作。(头结点data存储链表长度)if (pos > currentNode->data) return NULL;for (int i = 0; i < pos; ++i) {currentNode = currentNode->next;}node *temp = currentNode->next;currentNode->next = currentNode->next->next;// 释放内存free(temp);// 链表长度减一head->data--;return head;
}

输出链表

void printList(node *head) {// 跳过头结点数据node *currentNode = head->next;while (currentNode != NULL) {if (currentNode->next == NULL) {// 是最后一个结点的话不输出箭头printf("%d", currentNode->data);} else {printf("%d->", currentNode->data);}currentNode = currentNode->next;}printf("\n");
}

测试链表相关方法

#include <stdio.h>
#include <stdlib.h>typedef struct node {int data;struct node *next;
} node;// 创建单链表
node *createList() {node *head = (node *) malloc(sizeof(node));if (head == NULL) return NULL;head->data = 0;head->next = NULL;return head;
}// 插入新结点
node *insertNode(node *head, int data, int pos) {node *currentNode = head;// 如果插入位置比链表长,为非法操作。(头结点data存储链表长度)if (pos > currentNode->data) return NULL;for (int i = 0; i < pos; ++i) {currentNode = currentNode->next;}// 新建结点node *newNode = (node *) malloc(sizeof(node));newNode->data = data;// 牵住当前位置下一个结点newNode->next = currentNode->next;// 牵住当前位置上一个结点currentNode->next = newNode;// 链表长度加一head->data++;return head;
}// 删除结点
node *deleteNode(node *head, int pos) {node *currentNode = head;// 如果插入位置比链表长,为非法操作。(头结点data存储链表长度)if (pos > currentNode->data) return NULL;for (int i = 0; i < pos; ++i) {currentNode = currentNode->next;}node *temp = currentNode->next;currentNode->next = currentNode->next->next;// 释放内存free(temp);// 链表长度减一head->data--;return head;
}// 遍历列表
void printList(node *head) {// 跳过头结点数据node *currentNode = head->next;while (currentNode != NULL) {if (currentNode->next == NULL) {// 是最后一个结点的话不输出箭头printf("%d", currentNode->data);} else {printf("%d->", currentNode->data);}currentNode = currentNode->next;}printf("\n");
}int main() {node *l = createList();insertNode(l, 1, 0);insertNode(l, 2, 1);insertNode(l, 3, 0);printList(l);deleteNode(l, 1);printList(l);return 0;
}

image-20230906110134438

相关文章:

C语言 数据结构与算法 I

C语言-数据结构与算法 C语言基础 因为之前写算法都是用C&#xff0c;也有了些C基础&#xff0c;变量常量数据类型就跳过去吧。 首先是环境&#xff0c;学C时候用Clion&#xff0c;C语言也用它写吧~ 新建项目&#xff0c;选C执行文件&#xff0c;语言标准。。。就先默认C99吧…...

PHP指定时间戳/日期加一天,一年,一周,一月

PHP指定时间戳加上1天&#xff0c;1周&#xff0c;1月&#xff0c;一年其实是不需要用上什么函数的&#xff01;指定时间戳本身就是数字整型&#xff0c;我们只需要再计算1天&#xff0c;1周它的秒数相加即可&#xff01; 博主搜索php指定时间戳加一天一年&#xff0c;结果许多…...

前端框架 vue-admin-template的搭建运行

一介绍 1.1 下载地址 vue-element-admin是基于element-ui 的一套后台管理系统集成方案。 GitHub - PanJiaChen/vue-element-admin: :tada: A magical vue admin https://panjiachen.github.io/vue-element-admin 1.2 node.js的安装 地址下载node.js 1.6版本 CNPM Binari…...

Git—版本控制系统

git版本控制系统 1、什么是版本控制2、常见的版本控制工具3、版本控制分类3.1、本地版本控制3.2、集中版本控制 SVN3.3、分布式版本控制 Git 4、Git与SVN的主要区别5、Git环境配置6、启动Git7、常用的Linux命令8、Git配置9、设置用户名与邮箱&#xff08;用户标识&#xff0c;必…...

【MySQL基础|第一篇】——谈谈SQL中的DDL语句

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】&#x1f388; 本专栏旨在分享学习MySQL的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 前言&#xff…...

移动安全测试框架-MobSF WINDOWS 环境搭建

安装python python-3.11.5-amd64.exe 安装Win64OpenSSL-3_1_2.exe 安装VisualStudioSetup.exe github下载安装包 https://github.com/MobSF/Mobile-Security-Framework-MobSF/archive/refs/heads/master.zip GitHub - MobSF/Mobile-Security-Framework-MobSF: Mobile Secur…...

QT连接OpenCV库完成人脸识别

1.相关的配置 1> 该项目所用环境&#xff1a;qt-opensource-windows-x86-mingw491_opengl-5.4.0 2> 配置opencv库路径&#xff1a; 1、在D盘下创建一个opencv的文件夹&#xff0c;用于存放所需材料 2、在opencv的文件夹下创建一个名为&#xff1a;opencv3.4-qt-intall 文…...

使用 ElasticSearch 作为知识库,存储向量及相似性搜索

一、ElasticSearch 向量存储及相似性搜索 在当今大数据时代&#xff0c;快速有效地搜索和分析海量数据成为了许多企业和组织的重要需求。Elasticsearch 作为一款功能强大的分布式搜索和分析引擎&#xff0c;为我们提供了一种优秀的解决方案。除了传统的文本搜索&#xff0c;El…...

视频图像处理算法opencv在esp32及esp32s3上面的移植,也可以移植openmv

opencv在esp32及esp32s3上面的移植 Opencv简介 OpenCV是一个基于Apache2.0许可&#xff08;开源&#xff09;发行的跨平台计算机视觉和机器学习软件库&#xff0c;可以运行在Linux、Windows、Android和Mac OS操作系统上&#xff0c;它轻量级而且高效——由一系列 C 函数和少量…...

2. postgresql并行扫描(1)——pg强制走并行扫描建表及参数配置

转载自&#xff1a;https://developer.aliyun.com/article/700370 1. 参数设置 1.1 postgresql.conf中修改 # 1、总的可开启的WORKER足够大 max_worker_processes 128# 2、所有会话同时执行并行计算的并行度足够大 max_parallel_workers64# 3、单个QUERY中并行计算NODE开…...

【C++】动态内存管理

【C】动态内存管理 new和delete用法内置类型自定义类型抛异常定位new 刨析new和delete的执行与实现逻辑功能执行顺序newdelete 功能实现operator new与operator delete malloc free与new delete的总结 在我们学习C之前 在C语言中常用的动态内存管理的函数为&#xff1a; mallo…...

MATLAB R2023a完美激活版(附激活补丁)

MATLAB R2023a是一款面向科学和工程领域的高级数学计算和数据分析软件&#xff0c;它为Mac用户提供了强大的工具和功能&#xff0c;用于解决各种复杂的数学和科学问题。以下是MATLAB R2023a Mac的一些主要特点和功能&#xff1a; 软件下载&#xff1a;MATLAB R2023a完美激活版 …...

垃圾回收 - 标记压缩算法

压缩算法是将标记清除算法与复制算法相结合的产物。 1、什么是标记压缩算法 标记压缩算法是由标记阶段和压缩阶段构成。 首先&#xff0c;这里的标记阶段和标记清除算法时提到的标记阶段完全一样。 接下来我们要搜索数次堆来进行压缩。压缩阶段通过数次搜索堆来重新填充活动对…...

Vue中过滤器如何使用?

过滤器是对即将显示的数据做进⼀步的筛选处理&#xff0c;然后进⾏显示&#xff0c;值得注意的是过滤器并没有改变原来 的数据&#xff0c;只是在原数据的基础上产⽣新的数据。过滤器分全局过滤器和本地过滤器&#xff08;局部过滤器&#xff09;。 目录 全局过滤器 本地过滤器…...

【爬虫】7.4. 字体反爬案例分析与爬取实战

字体反爬案例分析与爬取实战 文章目录 字体反爬案例分析与爬取实战1. 案例介绍2. 案例分析3. 爬取 本节来分析一个反爬案例&#xff0c;该案例将真实的数据隐藏到字体文件里&#xff0c;即使我们获取了页面源代码&#xff0c;也无法直接提取数据的真实值。 1. 案例介绍 案例网…...

Linux cat 的作用

Linux中的cat命令用于连接文件并打印到标准输出设备&#xff08;通常是终端&#xff09;。 它的主要作用有以下几点&#xff1a; 查看文件内容&#xff1a;cat命令可用于查看文本文件的内容&#xff0c;将文件的内容从第一行到最后一行打印到终端。 合并文件&#xff1a;cat命…...

Windows中的命令行提示符里的Start命令执行路径包含空格时的问题

转载&#xff1a;电脑知识收藏夹 Blog Archive Windows中的命令行提示符里的Start命令执行路径包含空格时的问题 当使用Windows 中的命令行提示符执行这段指令时(测试Start命令执行带空格的路径的程序或文件问题)&#xff0c;第一行Start会成功执行&#xff0c;跳出记事本程…...

【基础计算机网络1】认识计算机网络体系结构,了解计算机网络的大致模型(上)

前言 今天&#xff0c;小编我也要进入计算机网络的整个内容&#xff0c;虽然这个计算机网络的内容在考研部分中占比比较小&#xff0c;有些人不把这一部分当成重点&#xff0c;这种想法是错误的。我觉得考研的这四个内容都是非常重要的&#xff0c;我们需要进行全力以赴的对待每…...

学校宿舍智能水电表管理系统:为节约资源保驾护航

随着科技的不断发展&#xff0c;越来越多的学校开始重视宿舍管理的智能化。其中&#xff0c;智能水电表管理系统作为一项重要的基础设施&#xff0c;已经逐渐被各大高校引入。本文将围绕学校宿舍智能水电表管理系统展开详细介绍&#xff0c;让我们一起来了解一下这个节约资源、…...

EasyFalsh移植使用方法

参考&#xff1a;https://blog.csdn.net/Mculover666/article/details/105510837 注意&#xff1a; 这里说的修改默认环境变量后修改环境变量版本号就自动重新写入到flash这句话是有问题的&#xff0c;要开启上面【#define EF_ENV_AUTO_UODATE】宏定义后才会实现该功能&#…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

【C++】纯虚函数类外可以写实现吗?

1. 答案 先说答案&#xff0c;可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...