当前位置: 首页 > 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.lryc.cn/news/610508.html

相关文章:

  • Docker Compose管理新范式:可视化控制台结合cpolar提升容器编排效率?
  • Docker使用的常见问题
  • 解决微信小程序中camera组件被view事件穿透触发对焦以及camera的bindtap事件
  • 性能优化篇:SQL数据库查表速度优化
  • JAVA无人共享球杆柜系统球杆柜租赁系统源码支持微信小程序
  • TortoiseGit配置SSH Key或Putty Key
  • W3D引擎游戏开发----从入门到精通【22】
  • 微信小程序功能实现:页面导航与跳转
  • AI产品经理如何理解和应用Transformer架构,以提升产品的技术能力和用户体验?
  • SpringBoot基础复习
  • 06 基于sklearn的机械学习-欠拟合、过拟合、正则化、逻辑回归、k-means算法
  • 如何基于MQ实现分布式事务
  • 机器学习(13):逻辑回归
  • Go语言 并发安全sync
  • 华为OD机考2025C卷 - 开源项目热度榜单 (Java Python JS C++ C )
  • C语言:构造类型学习
  • python基础:数据解析BeatuifulSoup,不需要考虑前端形式的一种获取元素的方法
  • 笛卡尔坐标
  • RabbitMQ--介绍
  • Windows中Idea或者其他开发工具如何使用Google Sans Code - 码农开源等宽字体
  • 赛灵思ZYNQ官方文档UG585自学翻译笔记:General Purpose I/O (GPIO)通用输入 / 输出
  • 【C++】语法基础篇
  • mybatis知识
  • 第12届蓝桥杯Scratch_选拔赛_初级组_真题2020年9月20日
  • NetBSD notes
  • 数据结构——单向链表部分操作及valgrind安装
  • 网络资源模板--基于Android Studio 实现的消消乐游戏
  • 机器学习05——正则化与逻辑回归
  • Linux Epool的作用
  • ssh连接VirtualBox中的Ubuntu24.04(win11、putty、NAT 模式)