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--;
}
注:以上函数均没有主函数