当前位置: 首页 > 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. 系统变量

$^: 所有依赖
$<:第一个依赖
$@:生成的目标

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

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

eg:

#自定义变量
#需要生成的目标
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.双向链表

相较于单向链表节点内多了一个前驱指针,使得其可以直接访问其前一个节点,便于遍历。

代码练习

Doulink_t *doulink()
{Doulink_t *pdlink = malloc((sizeof(Doulink_t)));if (NULL == pdlink){printf("error\n");}pdlink->phead = NULL;pdlink->clen = 0;return pdlink;
}int is_empty_doulink(Doulink_t *pdlink)
{return NULL == pdlink->phead;
}int insert_doulink_head(Doulink_t *pdlink, Data_type_t data)
{Dnode_t *pnode = malloc(sizeof(Dnode_t));if (NULL == pnode){return -1;}pnode->data = data;pnode->pnext = NULL;pnode->ppre = NULL;if (is_empty_doulink(pdlink)){pdlink->phead = pnode;}else{pnode->pnext = pdlink->phead;pdlink->phead->ppre = pnode;pdlink->phead = pnode;}pdlink->clen++;return 0;
}void printfstu(Data_type_t stus)
{printf("%d %s %d\n", stus.id, stus.name, stus.score);
}void doulink_for_each(Doulink_t *pdlink, int dir)
{if (is_empty_doulink(pdlink)){return;}Dnode_t *pdtmp = pdlink->phead;if (dir){while (pdtmp){printfstu(pdtmp->data);pdtmp = pdtmp->pnext;}}else{while (pdtmp->pnext){pdtmp = pdtmp->pnext;}while (pdtmp){printfstu(pdtmp->data);pdtmp = pdtmp->ppre;}}puts("");return;
}// 尾插
void insert_doulink_end(Doulink_t *pdlink, Data_type_t data)
{Dnode_t *ptmp = malloc(sizeof(Dnode_t));if (NULL == ptmp){printf("error\n");return;}ptmp->data = data;ptmp->pnext = NULL;ptmp->ppre = NULL;if (is_empty_doulink(pdlink)){insert_doulink_head(pdlink, data);}else{Dnode_t *pnode = pdlink->phead;while (pnode->pnext){pnode = pnode->pnext;}pnode->pnext = ptmp;ptmp->ppre = pnode;}pdlink->clen++;
}// 头删
void delete_doulink_head(Doulink_t *pdlink)
{if (is_empty_doulink(pdlink)){return;}Dnode_t *ptmp = pdlink->phead;if (ptmp->pnext == NULL){pdlink->phead = NULL;free(ptmp);}else{Dnode_t *p = ptmp;pdlink->phead = p->pnext;p->pnext = NULL;free(ptmp);}pdlink->clen--;
}// 尾删
void delete_doulink_end(Doulink_t *pdlink)
{if (is_empty_doulink(pdlink)){return;}Dnode_t *ptmp = pdlink->phead;if (NULL == ptmp->pnext){delete_doulink_head(pdlink);}else{while (ptmp->pnext){ptmp = ptmp->pnext;}ptmp->ppre->pnext = NULL;free(ptmp);}pdlink->clen--;
}// 销毁
void delete_doulink_empty(Doulink_t *pdlink)
{while (pdlink->phead){delete_doulink_head(pdlink);}free(pdlink);
}// 查找
Dnode_t *find_doulink(Doulink_t *pdlink, char *name)
{if (is_empty_doulink(pdlink)){return NULL;}Dnode_t *ptmp = pdlink->phead;while (ptmp){if (strcmp(name, ptmp->data.name) == 0){break;}ptmp = ptmp->pnext;}if (ptmp){return ptmp;}return NULL;
}// 修改成绩
Dnode_t *modify_grdes(Doulink_t *pdlink, char *name, int score)
{Dnode_t *ptmp = find_doulink(pdlink, name);if (ptmp){ptmp->data.score = score;return ptmp;}return NULL;
}// 删除指定节点
void delete_specify_nodes(Doulink_t *pdlink, unsigned int n)
{if (n > pdlink->clen){printf("error\n");return;}if (1 == n){delete_doulink_head(pdlink);}else if (n == pdlink->clen){delete_doulink_end(pdlink);}else{Dnode_t *ptmp = pdlink->phead;int i;for (i = 1; i < n && ptmp->pnext; ++i){ptmp = ptmp->pnext;}ptmp->ppre->pnext = ptmp->pnext;ptmp->pnext->ppre = ptmp->ppre;free(ptmp);}pdlink->clen--;
}

http://www.dtcms.com/a/316201.html

相关文章:

  • 使用YOLOv8-gpu训练自己的数据集并预测
  • 多传感器融合
  • 2025暑期作业
  • 企业如何用现代数仓架构挖掘新业务盈利点?AllData产品从目标、路径、结果给出答案
  • 分布式文件系统06-分布式中间件弹性扩容与rebalance冲平衡
  • 集成学习与随机森林:从原理到实践指南
  • 解决VScode无法打开本地文件夹及远程连接后无反应的问题
  • Maven和Gradle在构建项目上的区别
  • 范式集团与海博思创成立合资公司,杀入“AI+储能”赛道
  • 机器学习之KNN、贝叶斯与决策树算法
  • 【题解】P3172 [CQOI2015] 选数(倍数莫反做法)
  • 深圳多奥500KG磁力锁(DAIC-MJ-500S)技术解析与产品优势报告,应用到门禁系统坚若磐石!
  • 计算机网络 第2章通信基础(竟成)
  • Pycaita二次开发基础代码解析:参数化模板创建与设计表驱动建模
  • 【Java面试题】注解,异常相关知识
  • Go语言的gRPC教程-错误处理
  • Android AppSearch 深度解析:现代应用搜索架构与实践
  • Elasticsearch向量库
  • 【web应用】前后端分离项目基本框架组成:Vue + Spring Boot 最佳实践指南
  • 深度解析 TCP 三次握手与四次挥手:从原理到 HTTP/HTTPS 的应用
  • 微服务—OpenFeign
  • Spring中七种Propagation类的事务属性详解
  • 研发团队看板协作中的自动化实践:集成CI/CD与任务流转
  • 007TG洞察:高效运营Telegram私域流量:技术挑战与自动化解决方案探索
  • 中科米堆CASAIM自动化三维扫描系统自动测量压铸件尺寸
  • 【原创】基于gemini-2.5-flash-preview-05-20多模态模型实现短视频的自动化二创
  • 从 “看懂图” 到 “读懂视频”:多模态技术如何用文本反哺视觉?
  • 原型模式在C++中的实现与面向对象设计原则
  • 二维数点问题 1
  • 学习日志28 python