makefile的使用与双向链表
1.makefile的使用
Makefile :用来管理代码的编译和链接
make工具解释Makefile
makefileMakefile的语法:
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.out2. 系统变量
$^: 所有依赖
$<:第一个依赖
$@:生成的目标时间戳:在编译代码时,只编译修改后的源文件,其他没有修改的,只进行链接即可。
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 appeg:
#自定义变量 #需要生成的目标 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--;
}