数据结构——Makfile与双向链表
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编译的四个步骤:
1.预处理:处理和#相关的指令
gcc -E main.c -o main.i
2.编译:将源程序转换为汇编指令
gcc -S main.i -o main.s
3.汇编:将汇编指令生成二进制指令
gcc -c main.s -o main.o
4.链接:处理多文件及函数的链接关系
gcc main.o -o app
双向链表:
创造一个双向链表:
DLink_t *create_doulink()
{
DLink_t *pdlink= malloc(sizeof(DLink_t));
if (NULL == pdlink)
{
printf("malloc error");
return NULL;
}
pdlink->phead = NULL;
pdlink->clen = 0;
return pdlink;
}
判断一个双向链表是否为空链表:
int is_empty_doulink(DLink_t *pdlink)
{
return NULL == pdlink->phead;
}
向双向链表的头部插入一个结点:
int insert_doulink_head(DLink_t *pdlink, Data_type_t data)
{
DNode_t *pnode = malloc(sizeof(DNode_t));
if (NULL == pnode)
{
printf("malloc error");
return -1;
}
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++;
return 0;
}
遍历双向链表:
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 %d\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 %d\n", ptmp->data.id, ptmp->data.name, ptmp->data.score);
ptmp = ptmp->ppre;
}
}
printf("\n");
}
在双向链表的尾部插入一个结点:
int insert_doulink_tail(DLink_t *pdlink, Data_type_t data)
{
DNode_t *pnode = malloc(sizeof(DNode_t));
if (NULL == pnode)
{
printf("malloc error\n");
return -1;
}
pnode->data = data;
pnode->ppre = NULL;
pnode->pnext = NULL;
if (is_empty_doulink(pdlink))
{
pdlink->phead = pnode;
}
else
{
DNode_t *ptmp = pdlink->phead;
while (ptmp->pnext != NULL)
{
ptmp = ptmp->pnext;
}
ptmp->pnext = pnode;
pnode->ppre = ptmp;
}
pdlink->clen++;
return 0;
}
删除双向链表的头结点:
int delete_doulink_head(DLink_t *pdlink)
{
if (is_empty_doulink(pdlink))
{
return -1;
}
DNode_t *pdel = pdlink->phead;
pdlink->phead = pdel->pnext;
if (pdlink->phead != NULL)
{
pdlink->phead->ppre = NULL;
}
free(pdel);
pdlink->clen--;
return 0;
}
删除双向链表的尾结点:
int delete_doulink_tail(DLink_t *pdlink)
{
if (is_empty_doulink(pdlink))
{
return -1;
}
DNode_t *ptmp = pdlink->phead;
if (1 == pdlink->clen)
{
free(ptmp);
pdlink->phead = NULL;
}
else
{
while (ptmp->pnext != NULL)
{
ptmp = ptmp->pnext;
}
ptmp->ppre->pnext = NULL;
free(ptmp);
}
pdlink->clen--;
return 0;
}
更多推荐



所有评论(0)