C语言:Makefile工具使用+双向链表应用(创建+插入+删除+查找+修改+销毁+遍历)
link.c文件link .h文件int id;int score;}DNode_t;int clen;}DLink_t;#endifmain.c文件return -1;return 0;
一、Makefile的使用
1.make工具解释
- Makefile的语法:
gcc main.c fun.c -o a.out -I$(INC) -L$(LIB)
目标文件:a.out
依赖文件:main.c fun.c
-I: 指定头文件所在位置
-L: 指定使用到的库所在的位置
- 语法规则
目标文件:依赖文件
编译方法
2.Makefile中的变量
- 自定义变量
定义:
变量名=值
引用:
$(变量名)
OBJ = a.out
$(OBJ)——> a.out
- 系统变量
$^ : 所有依赖
$< :第一个依赖
$@:生成的目标
3.时间戳
定义:在编译代码时,只编译修改后的源文件,其他没有修改,只进行链接即可。
应用:%.o : %.c
$(cc) -c $^ -o $@
- gcc编译的四个步骤
4.示例
二、双向链表应用
1.声明,定义,创建
- link.c文件
#include "doulink.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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;
}
- link .h文件
#ifndef __DOULINK_H__
#define __DOULINK_H__
typedef struct stu
{
int id;
char name[32];
int score;
}Data_type_t;
typedef struct dounode
{
Data_type_t data;
struct dounode *ppre;
struct dounode *pnext;
}DNode_t;
typedef struct doulink
{
DNode_t *phead;
int clen;
}DLink_t;
#endif
- main.c文件
#include <stdio.h>
#include "doulink.h"int main(void)
{Data_type_t stus[5] = {{1, "zhangsan", 99},
{2, "lisi", 100}, {3, "wangwu", 90},
{4, "maliu", 56}, {5, "tianqi", 66}};DLink_t *pdlink = create_doulink();
if (NULL == pdlink)
{
return -1;
}insert_doulink_head(pdlink, stus[0]);
insert_doulink_head(pdlink, stus[1]);
insert_doulink_head(pdlink, stus[2]);
insert_doulink_tail(pdlink, stus[3]);
insert_doulink_tail(pdlink, stus[4]);
return 0;
}
2.头插数据
- 程序
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;
}
3.尾插数据
- 程序示例
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;
}
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 %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");
}
5.头删数据
- 示例程序
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;
}
6.尾删程序
- 示例程序
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;
}
7.销毁数据程序
- 示例程序
void destroy_doulink(DLink_t *pdlink)
{
while(is_empty_doulink(pdlink))
{
delete_doulink_head(pdlink);
}
free(pdlink);
}
更多推荐
所有评论(0)