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. 系统变量
$^: 所有依赖
$<:第一个依赖
$@:生成的目标时间戳:在编译代码时,只编译修改后的源文件,其他没有修改的,只进行链接即可。
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--;
}
注:以上函数均没有主函数