C:数据相关操作

41、C语言数据结构:树与相关操作详解 本文详细讲解了C语言中的数据结构,特别是树结构的相关概念和操作,包括链表、栈、队列、二叉树的基本实现与遍历方法。此外,还介绍了内存分配、去重、搜索等实用技巧,并通过多个练习题帮助读者加深理解。最后,文章提供了一些实际应用,例如超市模拟和中缀表达式转换等。 阅读详情

C数据相关操作

一、交换两个数据

方法二省去了中间变量。

  1. 方法一
void SwapData(int &a,int &b)
{
	int temp=0
	temp = *a;
	*a = *b;
	*b = temp;
}

2.方法二

void SwapData(int &a,int &b)
{
	*a = *a+*b;
	*b = *a-*b;
	*a = *a-*b;
}

二、数组对称交换

输入:buf[]={1,2,3,4,5} 输出:buf[]={5,4,3,2,1}

/****************************************
 * @brief : 数组对称交换
 * @param : 输入数组
 * @param : 输入数据长度
 * @return: none
*****************************************/
void InversionArray(int *buff, int len)
{
    int i=0;
    for(i=0; i<len/2; i++)
    {
        buff[i] = buff[i] + buff[len-i-1];
        buff[len-i-1] = buff[i]-buff[len-i-1];
        buff[i] = buff[i] - buff[len-i-1];
    }
}

三、字符串对称交换

输入:"abcdefg" 输出:gfedcba

/****************************************
 * @brief : 字符串对称交换
 * @param : 输入/输出 字符串
 * @return: true/false
*****************************************/
int InversionString(unsigned char *str)
{
	unsigned int i=0,len=0;
	if(str == NULL)
	{
		return false;
    }
    len=0;
    while (str[len] != '\0')
    {
        len++;
    }
    //注意:len为字符串的长度,但是下标是以str[0]开始计算
    //所以字符串最后一个有效数据为str[len-i-1]
	for(i=0; i<len/2; i++)
	{
		str[i] = str[i]+str[len-i-1];
		str[len-i-1] = str[i]-str[len-i-1];
		str[i] = str[i]-str[len-i-1];
	}
	return true;
}

四、数字转字符串

输入:int num=12234 输出:"12234"

/****************************************
 * @brief : 数字转字符串
 * @param : 输入数字(long)
 * @param : 输出字符串
 * @return: true/false
*****************************************/
int NumberToString(long number, unsigned char *string)
{
    int i=0, j=0;
    if(number<0)            //判断是否为负数
    {
        number = -number;   //转换为正数
        *string = '-';      //增加负号
        string++;           //字符串向后移动
    }
	if(number==0)
	{
		*string = '0';
		*++string = '\0';
		return true;
	}
    while(number)           //按序写入字符串
    {
        string[j++] = number%10+'0';
        number /= 10;
    }
    for(; i<j/2; i++)         //对称交换
    {
        string[i] = string[i]+string[j-i-1];
        string[j-i-1] = string[i]-string[j-i-1];
        string[i] = string[i]-string[j-i-1];
    }
    string[j] = '\0';       //结尾增加结束符
    return true;
}

五、获取字符串中第一组数字

输入:char *string="abc1234de23f" 返回:(long)1234

/****************************************
 * @brief : 获取字符串中第一组数字
 * @param : 输入字符串
 * @return: 返回数字
*****************************************/
long StringToNumber(char *string)
{
    long number = 0;
    if(string == NULL)
    {
        return 0;
    }
    while (*string != '\0')
    {
        if(*string>='0' && *string<='9')
        {
            while ( (*string!='\0') && (*string>='0') && (*string<='9') )
            {
                number *= 10;
                number += *string-'0';
                string ++;
            }
            return number;
        }
        string++;
    }
    return 0;
}

六、数组转HEX字符串

输入:unsigned int buf[]={21150,11234,250,2};输出:"529e 2be2 00fa 0002"

/***********************************************
 * @brief : 数组转HEX格式字符串
 * @param : 输入待转换的数组(可修改为8、16、32位数组)
 * @param : 数组长度
 * @param : 返回字符串指针
 * @param : HEX单位字节对齐方式
 * @return: false/true
************************************************/
int ArrayToHexString(unsigned int buf[], unsigned int len, unsigned char *string, char align)
{
    int i=0,j=0;
    if(string == NULL)
    {
        return false;
    }
    while (i < len)
    {
        //一个字节的数据用HEX表示,需要占用两个字节
        string += align*2;          //指针移到本次数据地址 尾部
        for(j=0; j<align*2; j++)    //从后往前写入HEX数据
        {
            string--;
            if( (buf[i]&0xF) < 10)
            {
                *string = (buf[i]&0xF)+'0';
            }
            else
            {
                *string = (buf[i]&0xF)-10+'a';
            } 
            buf[i] >>= 4;
        }
        string += align*2;  //指针再次移到本次数据地址 尾部
        *string = ' ';      //插入空格
        string++;           //插入空格地址需要往前移动
        i++;                
    }
    *string = '\0';         //添加结束符
    return true;
}

备注链接:

七、关于sizeof(指针步进)

1、sizeof 是运算符,等价于&运算符。
2、sizeof 是在编译阶段展开运算的,在程序运行期间相当于常数。
3、sizeof 实现的原理是指针的步进。

#define 	mysizeof(L_Value)       ((char*)(&L_Value + 1) - (char*)(&L_Value))

同理,可以很方便的得到数组长度(注意不是元素个数):

1、buff 是数组首元素的地址,步进单位为单个元素长度。
2、&buff 是数组地址,步进单位为整个数组长度。
3、地址指针是void *的,强制转换后进行计算。注意(char *)和(int *)结果不同。
4、64位系统下,int型占用4个字节,int *进行加减运算时,步进单位是4字节,所以计算结果是2。

{
	unsigned char buff[] = {1,2,3,4,5,6,7,8};
	int buff_len = 0;
	buff_len = (char *)(&buff+1) - (char *)(&buff);				//buff_len = 8;
	buff_len = (char *)(buff+1) - (char *)(buff);				//buff_len = 1;
    buff_len = (int *)(&buff+1) - (int *)(&buff);				//buff_len = 2;
}

上面得到的是数组的长度,那么如何得到数组的元素个数呢?

{
	long buff[] = {1,2,3,4,5,6};
	int  len = 0;
	len = sizeof(buff)/sizeof(buff[0]);		//len = 6;
}

八、指针常量和常量指针

①、常量指针

定义:指向常量的指针。
1、本质上是指针,指向的值是常量,故不能通过这个指针修改变量的值。
2、但指针并非常量,指针可以指向其他的地址。
形式:

const int *p;
int const *p;
②、指针常量(常指针)

定义:指针类型的常量。
1、本质上是常量,这个常量的内容是指针,即一个地址。
2、指针是常量,但对应地址里面的值并非常量,所以指针指向的值可以改变。
形式:

int* const p;
两种如何理解?

看名称后两个字:

常量指针:本质是指针。因为它还可以指向其他任意一个地址。const只不过限定了该地址的值不
能被改变。
指针常量:本质是常量。指针是这个常量的类型修饰符。

看const修饰符的位置:

常量指针:const int *p和int const *p,const实质上修饰的是*p。即值是常量。
指针常量:int const* p,const实质上修饰的是p,即地址是常量。

指向常量的常指针
const int* const p;

即p指向的值是一个常量,且p本身是一个指针常量,即p不能再指向其他地址。

大语言模型应用指南:幻觉和偏见问题 大语言模型应用指南:幻觉和偏见问题 1. 背景介绍 1.1 大语言模型的发展历程 1.1.1 早期的语言模型 1.1.2 Tr 阅读详情

相关推荐

DC-DC BUCK电路 PCB 布局布线 5 要点:以 XL4015 12V转5V 为例解析噪声控制

本文以XL4015 12V转5V降压电路为例,详细解析DC-DC BUCK电路PCB布局布线的5个关键要点,重点探讨噪声控制策略。通过功率回路最小化、热管理与接地优化、电感电容布局、反馈网络防干扰设计以及实测验证技巧,帮助工程师实现高效稳定的电源设计,显著降低输出纹波和电磁干扰。

weixin_29165725的博客 368

C++常见十六进制数组转换char数组方法

C++在编写通讯协议解析过程中,通常需要对十六进制进行解析,经常用到位运算,同时结合unsigned char型数据或者char数组解析出自己想要的十进制数字,这里总结了一下常用的十六进制转换十进制或char数组的思路。

手写不期而遇的博客 4609

智能车竞赛循迹控制:基于状态机的直道、弯道、十字路口处理策略

在嵌入式系统与自动控制领域,PID控制算法是实现精确运动控制的基础。其原理是通过比例、积分、微分三个环节的线性组合,对系统误差进行实时校正,从而实现对目标值的快速、稳定跟踪。这项技术的核心价值在于为各类自动控制系统提供了稳定、可靠且易于实现的解决方案,广泛应用于机器人、无人机、工业自动化等场景。在智能车循迹这类特定应用中,赛道环境复杂多变,单一的PID控制器难以应对直道、弯道、十字路口等不同赛道元素的控制需求。此时,有限状态机(FSM)作为一种高效的**决策框架**,能够根据实时感知的赛道特征(如边线曲率、

weixin_34034261的博客 282

unsigned char 的使用

我们在new一个buffer的时候要尽量使用unsigned char而不是简单的char,因为由于位移运算符号的特殊性质,会根据首个bit的0或者1自动添加,如果是char就会产生很多错误,所以作为buffer我们要使用unsigned char。

Coder 7052

扫码器USB键盘报告描述符数据格式解析

Byte0用于判断Shift是否按下,当按下时Byte0的Bit1会置1,即0x02,若未按下,Bit为0,即0x00。0x00 0x00 0x00 0x00 0x00 0x00 0x00--->>未按下Shift。0x00 0x00 0x00 0x00 0x00 0x00 0x00--->>按下Shift。0x00 0x04 0x00 0x00 0x00 0x00 0x00--->>输出A。0x00 0x04 0x00 0x00 0x00 0x00 0x00--->>输出a。

m0_65548585的博客 1141

CCF201803-2 碰撞的小球 python

一些话:已经不知道是第几次做这道题了(大概第三次吧),真的常做常新,每次都有新的细节想法。虽然方法简单粗暴,但好在方便理解,对于我这种菜鸟选手而言。 但在做的过程中,最开始还忽略了输入的小球初始位置有可能是无序的,输出的时候要保持相对位置。CCF真的考验细节,希望上考场时能够认真仔细一点。就酱… #碰撞的小球 #当小球坐标为0或L时,会朝相反方向移动 #当两个小球坐标相等时,会分别转向相反的方向 #计算t秒之后小球的位置 n,L,t = map(int,input().split()) location .

tanya_dre的博客 349

显示十六进制字符数组

1. 将一串十六进制数值,保存到字符数组中,然后以16进制显示。 unsigned char buf[5] ="\x8B\x22\x11\x12"; //结尾\0 CString str; for(int i=0;i<4;i++){ CString s; s.Format("%x ",buf[i]); str += s; } AfxMessageBox(st...

dianyin8310的博客 478

AOSP 8.0.0编译中的ANDROID_DATA缺失问题解决方案

在AOSP编译过程中,环境变量和路径设置的正确性至关重要。遇到相关的错误时,检查并修正环境配置通常是解决问题的关键。希望本文提供的分析和解决方案能帮助你顺利编译AOSP。

m0_74337424的博客 396

char 与unsigned char在嵌入式开发中的区别

嵌入式中数据采集的最小单位为8bit或者8bit的倍数, 在嵌入式中char buf[ ]指的就是字符串,也就是所谓的字符空间,转换成ascii码是有符号数 unsigned char buf[ ]指的是非字符空间,例如传感器采集的数据,一般为无符号数 ...

qq_40501820的博客 612

Docker - 基本概念、与虚拟机的区别、架构、镜像操作、容器操作、数据卷挂载

p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口(配置映射是因为用户只能通过 http 请求访问到服务器,不能直接访问到对应的容器,因此需要服务器端口与容器端口建立映射关系)这里我们有两种启动 redis 的方式,第一种是直接启动 redis ,第二种是以 AOF 持久化的方式启动容器(--appendonly yes),如下图。如果需要持续查看日志信息可以添加 -f 参数,例如:docker logs -f mn ,这里 mn 是自定义容器名称, ctrl + c 可以停止跟踪。

CYK_byte的博客 1万+

人员行为规范检测:YOLOv8+C#实现工厂车间安全监控,违规即报警零延迟

该方案通过YOLOv8的装备检测与姿态估计的动作识别,结合C#的实时管控能力,实现了从“被动巡检”到“主动预警”的转变。相比传统人工,违规响应速度提升10倍,全年可减少90%以上的安全隐患。方案已在3家制造企业落地,支持自定义违规规则(如新增“吸烟”“未系安全带”),可根据车间场景灵活扩展。需要完整的模型训练配置文件(含数据集增强脚本)或C#系统源码(视频处理+报警模块)的,评论区扣“SafetyDetect”,可直接获取部署版本~

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1174

dll劫持

aheadlib工具劫持 可以看见生成了一个cpp文件,然后我们创建一个dll文件 将生成的cpp文件替换到如下文件 添加#include “pch.h” 填加如下代码 /* cs的payload length: 892 bytes */ unsigned char buf[] = "\xfc\x48\x83\xe4\xf0\xe8\xc8\x00\x00\x00\x41\x51\x41\x50\x52\x51\x56\x48\x31\xd2\x65\x48\x8b\x52\x60\x48\x8b

qq_46804551的博客 6946

Python爬虫实战:构建药监局药品批准信息本地查询系统

在医药信息化时代,药品批准信息的快速查询对于医药从业者、研究人员和普通消费者都具有重要意义。国家药品监督管理局(NMPA)提供了官方的药品查询系统,但有时我们需要建立本地数据库以便批量分析或离线查询。本文将详细介绍如何使用Python爬虫技术,结合最新的异步爬虫框架和技术栈,构建一个完整的药监局药品信息本地查询系统。本系统将实现以下功能:自动化爬取药监局官网的药品批准信息数据清洗和结构化存储建立本地查询接口数据定期更新机制pythonimport os"""药品类型枚举"""

2201_76125261的博客 726

数据结构:二叉树的相关操作(C语言)

二叉树的基本遍历操作有四种,即先序遍历,中序遍历,后序遍历以及层序遍历。 首先来说先序,中序,后序遍历。我们知道二叉树是一种递归的定义,因此

m0_73863045的博客 1316

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

数据结构:链队列及其相关操作(c语言实现)

队列就是一个先进先出的限制性结构,用c语言的链表去实现,用两个指针(一个头指针,一个尾指针)实现,队列概念比较简单,实现的链队列的关键是理解其中的指针。(必要时画图可更好理解) 代码如下:(链队列初始化,元素入队,出队,清空队列,返回队首元素,队列长度,判断队列是否为空) #include<stdio.h> #include<string.h> #include<st...

weixin_44756457的博客 441

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【数据结构:堆】——堆及堆的相关操作(C语言)

1、什么是堆? 堆: 如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki <= K2i+1 且 Ki<= K2i+2 (Ki >= K2i+1 且 Ki >= K2i+2) i = 0,1,2…,则称为小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根...

紫阳战君的博客 390

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

c语言数据结构:单链表及其相关基础操作

pos)

m0_73426459的博客 904

数据结构与算法:单链表的相关基本操作(基于C语言)

顾名思义,链表是一种采用链式结构组织的数据,其与数组最大的区别是其在电脑内存中开辟的空间大概率是不连续的,而数组开辟的空间是连续的。

Tai_Monster的博客 557

数据结构源码笔记(C语言):二叉平衡树的相关操作算法

//二叉平衡树的相关运算 #include<stdio.h> #include<malloc.h> #include<string.h> typedef char InfoType; typedef int KeyType; typedef struct node { KeyType key; int bf; InfoType data; struct node *lchild,*rchild; }BSTNode; void LeftProcess(B

半个冯博士 677

数据结构C语言基础代码5:单链表相关操作(全)

C语言链表纯手工实现头插法创建链表、尾插法创建链表、获取链表某位置值、获取某个值所在位置、获取链表长度、链表插入值。

xiuhhhua的博客 437

数据结构:C语言实现二叉树及相关操作(递归,迭代)

#include <stdlib.h> #include <stdio.h> #include <unistd.h> typedef struct node { int item; struct node *left; struct node *right; }node; node *stack[512]; int top = 0; ...

不秃头的程序猿Gabriel的博客 477

12c容器数据库相关操作:登录12c(容器数据库)、如何在oracle 12c中创建普通用户、 ORACLE 12C之CDB与PDB 、修改pdb名称

12c容器数据库相关操作:登录12c(容器数据库)、如何在oracle 12c中创建普通用户、 ORACLE 12C之CDB与PDB 、修改pdb名称.

一个只求实际的程序猿 3977

数据结构C语言基础代码6:双链表相关操作(全)

仅有creatListByhead()和insertNode()、deleElem()进行了修改。

xiuhhhua的博客 157

discuz连接mysql步骤,Discuz!X教程:数据库操作方法

,函数 功能,DB::table($tablename) 获取正确带前缀的表名,转换数据库句柄,,DB::delete($tablename, 条件,条数限制) 删除表中的数据,DB::insert($tablename, 数据(数组),是否返回插入ID,是否是替换式,是否silent) 插入数据操作,DB::update($tablename, 数据(数组)条件) 更新操作,DB::fetch(...

weixin_39612896的博客 287

使用openpyxl向A1:C5按顺序写入一个数组的数据

可以使用如下代码将数组的数据写入A1:C5: import openpyxl # 创建工作簿 wb = openpyxl.Workbook() # 选择活动工作表 ws = wb.active # 定义数组 data = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15]] # 遍历数组,将数据写入工作表 for i in ...

weixin_42592399的博客 190

C++11 并发指南(atomic 类型详解四 C 风格原子操作介绍)

所谓的原子操作,取的就是“原子是最小的、不可分割的最小个体”的意义,它表示在多个线程访问同一个全局资源的时候,能够确保所有其他的线程都不在同一时间内访问相同的资源。也就是他确保了在同一时刻只有唯一的线程对这个资源进行访问。这有点类似互斥对象对共享资源的访问的保护,但是原子操作更加接近底层,因而效率更高。 在以往的C++标准中并没有对原子操作进行规定,我们往往是使用汇编语言,或者是借助第三方的

flyingleo1981的专栏 8678
上一篇: TP4056电池(BAT)引脚输出高电平
下一篇: LM2596数控电路原理分析
萌哒兽
博客等级 码龄10年 192粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值