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

makefile使用及双向链表

1.makefile

Makefile :用来管理代码的编译和链接
make工具解释
名称:Makefile、makefile

Makefile的语法:

gcc main.c fun.c -o a.out  -I$(INC) -L$(LIB)
目标文件:a.out
依赖文件:main.c fun.c

-I : 指定头文件所在位置
-L:指定使用到的库所在的位置


语法规则:

目标文件:依赖文件
编译方法


Makefile中的变量:

1. 自定义变量
定义:
变量名=值
引用:
$(变量名)
OBJ=a.out
$(OBJ)   ----->a.out

2. 系统变量
$^: 所有依赖
$<:第一个依赖
$@:生成的目标

时间戳:在编译代码时,只编译修改后的源文件,其他没有修改的,只进行链接即可。

eg:

#a.out:main.c link.c
#	gcc main.c link.c -o a.out#自定义变量
#需要生成的目标
OBJ=a.out#生成目标依赖的二进制文件
SRC=main.o
SRC+=link.o
#编译器
CC=gcc
#头文件所在位置
INC=../include
#库所在位置
LIB=../lib#生成目标文件的编译规则
$(OBJ):$(SRC)$(CC) $^ -o $@ -I$(INC) -L$(LIB)#生成二进制文件的编译规则
%.o:%.c$(CC) -c $^ -o $@ -I$(INC) -L$(LIB)#main.o:main.c
#	$(CC) -c $^ -o $@#link.o:link.c
#	$(CC) -c $^ -o $@#伪指令:make clean执行该指令:删除目标文件和一些中间文件
clean:rm $(OBJ) *.o

 2.gcc编译的4个步骤

预处理:处理和#相关的指令
gcc -E main.c -o main.i
编译:将源程序转换成汇编指令
gcc -S main.i -o main.s
汇编:将汇编指令生成二进制指令
gcc -c main.s -o main.o
链接:处理多文件及函数的链接关系
gcc main.o -o app

3.双向链表的基本操作

(1)创建一个双向链表

DLink_t *create_doublelink()
{DLink_t *pdlink = malloc(sizeof(DLink_t));if(NULL == pdlink){printf("malloc, error\n");}pdlink->phead = NULL;pdlink->clen = 0;return pdlink;
}

(2)判断链表是否为空

int is_empty_doulink(DLink_t *pdlink)
{return NULL == pdlink->phead;
}

(3)头插

void insert_doulink_head(DLink_t *pdlink, Data_t data)
{DNode_t *pnode = malloc(sizeof(DNode_t));if(NULL == pnode){printf("malloc error\n");}pnode->data = data;pnode->ppre = NULL;pnode->pnext = NULL;if(is_empty_doulink(pdlink)){pdlink->phead = pnode;}else{pnode->pnext = pdlink->phead;pdlink->phead->ppre = pnode;pdlink->phead = pnode;}pdlink->clen++;
}

(4)遍历

void doulink_for_each(DLink_t *pdlink, int dir)
{if(is_empty_doulink(pdlink)){return ;}DNode_t *ptmp = pdlink->phead;if(dir){while(ptmp != NULL){printf("%d , %s , %f \n", ptmp->data.id, ptmp->data.name, ptmp->data.score);ptmp = ptmp->pnext;}}else{while(ptmp->pnext != NULL){ptmp = ptmp->pnext;}while(ptmp != NULL){printf("%d , %s , %f \n", ptmp->data.id, ptmp->data.name, ptmp->data.score);ptmp = ptmp->ppre;}}pdlink->clen++;
}

(5)尾插

void insert_doulink_tail(DLink_t *pdlink, Data_t data)
{DNode_t *pdnode = malloc(sizeof(DNode_t));if(NULL == pdnode){printf("error\n");return ;}pdnode->data = data;pdnode->pnext = NULL;pdnode->ppre = NULL;DNode_t *ptmp = NULL;if(NULL == pdlink->phead){pdlink->phead = pdnode;}else{ptmp = pdlink->phead;while(ptmp->pnext != NULL){ptmp = ptmp->pnext;}ptmp->pnext = pdnode;pdnode->ppre = ptmp;}  pdlink->clen++;
}

(6)头删

void delete_doulink_head(DLink_t *pdlink)
{if(NULL == pdlink->phead){return ;}DNode_t *ptmp = NULL;ptmp = pdlink->phead;if(NULL == ptmp->pnext){pdlink->phead = NULL;free(ptmp);}else{pdlink->phead = ptmp->pnext;pdlink->phead->ppre = NULL;free(ptmp);}pdlink->clen--;
}

(7)尾删

void delete_doulink_tail(DLink_t *pdlink)
{if(NULL == pdlink->phead){return ;}DNode_t *ptmp = pdlink->phead;if(NULL == ptmp->pnext){delete_doulink_head(pdlink);}else{while(ptmp->pnext != NULL){ptmp = ptmp->pnext;}ptmp->ppre->pnext = NULL;free(ptmp);pdlink->clen--;}
}

(8)销毁

void doublelink_destroy(DLink_t *pdlink)
{if(NULL == pdlink->phead){free(pdlink);return ;}else{DNode_t *ptmp = pdlink->phead;DNode_t *p = ptmp;while(p->pnext != NULL){p = ptmp->pnext;free(ptmp);ptmp = p;}free(p);free(pdlink);}
}

(9)查找

DNode_t *find_doulink(DLink_t *pdlink, char s[20])
{DNode_t *ptmp = pdlink->phead;while(ptmp != NULL){if(strcmp(s, ptmp->data.name) == 0){return ptmp;}ptmp = ptmp->pnext;}return NULL;
}

(10)修改

void change_doulink(DLink_t *pdlink, float oldscore, float newscore)
{DNode_t *ptmp = pdlink->phead;while(ptmp != NULL){if(oldscore == ptmp->data.score){ptmp->data.score = newscore;break;}ptmp = ptmp->pnext;}
}

(11)删除第k个元素

void delete_doulink_k(DLink_t *pdlink, int k)
{if(is_empty_doulink(pdlink) || k <= 0){return ;}DNode_t *ptmp = pdlink->phead;DNode_t *p = NULL;if(k > pdlink->clen){return ;}else{if(1 == k){delete_doulink_head(pdlink);}else if(pdlink->clen == k){delete_doulink_tail(pdlink);}else{for(int i = 1;i <  k;++i){if(NULL == ptmp){return ;}p = ptmp;ptmp = ptmp->pnext;}if(ptmp != NULL){p->pnext = ptmp->pnext;ptmp->pnext->ppre = p; }free(ptmp);}}pdlink->clen--;
}

注:以上函数均没有主函数

http://www.lryc.cn/news/611301.html

相关文章:

  • 在X86架构Linux中创建虚拟根目录并下载指定架构(如aarch64)的软件包(含依赖)
  • 数字图像处理(冈萨雷斯)第三版:第四章——频率域滤波(学前了解知识)——主要内容和重点
  • 深信服GO面试题及参考答案(下)
  • 数据结构基础:链表(2)——双向链表、循环链表、内核链表
  • GoLand 项目从 0 到 1:第五天 —— 角色权限中间件实现与事务控制
  • 前端工程化:Vue3(二)
  • 贝叶斯统计从理论到实践
  • 自动牙龈边缘识别软件设计与实现
  • Android AppSearch 深度解析:现代应用搜索架构与实践
  • 消息队列疑难问题(RocketMQ)
  • 认识爬虫 —— bs4提取
  • 阿里招AI产品运营
  • 永磁同步电机的矢量控制
  • RK3568下使用Qt 绘制实现实时坐标曲线
  • 【Spring Cloud】-- 注册中心
  • PowerShell 入门2: 使用帮助系统
  • 异或游戏 运算符优先级问题
  • GB28181监控平台LiveGBS如何配置GB28181对接海康、大华解码器上墙,将GB28181平台是视频给硬件解码器解码上墙
  • cJSON库应用
  • C语言的常见错误与调试
  • uniapp renderjs 逻辑层,视图层互相传递数据封装
  • 背包初步练习
  • 计算机视觉面试保温:CLIP(对比语言-图像预训练)和BERT技术概述
  • Linux逻辑卷管理操作指南
  • 论文解读:Mamba: Linear-Time Sequence Modeling with Selective State Spaces
  • JSP相关Bug解决
  • AutoSar AP LT规范中 建模消息和非建模消息都可以使用LogInfo() API吗?
  • 达芬奇31-40
  • stm32F407 硬件COM事件触发六步换相
  • AI赋能复合材料与智能增材制造:前沿技术研修重磅