今天学习了makefile的用法,使用valgrind 内存泄露检测工具判断空间是否泄露,同时学习了单向链表的定义,创建,头插法,遍历,查找元素,替换元素以及尾插法。
Makefile工程管理工具
1. 作用:
指定代码编译的规则
2. 规则:
要生成的目标文件:依赖的文件
编译命令’
3. makefile的使用
1. 在工程目录下直接输入:make
2. 在当前目录下查找makefile或者Makefile
3. 默认生成第一个目标
4. makefile中的变量
1. 特殊变量:
$@: 要生成的文件
$^: 所有依赖的文件(中间以空格隔开)
$<: 第一个依赖的文件
2. 自定义变量:变量名=值
5. makefile中变量的赋值:
1. = 直接赋值
2. := 覆盖赋值(原来有值覆盖为新值)
3. += 在原来的内容后面拼接新的内容
4. ?= 如果原来没值,就赋值为新值,如果原来有值保留原来的值
6. makefile中的伪目标
makefile中要生成多个目标,需要设定伪目标
.PHONY:
伪目标:依赖的文件
处理命令
生成伪目标使用:make 伪目标名称
单向链表功能实现:
主函数:
#include<stdio.h>
#include"linklist.h"
int main(void)
{
list_node_t *plist = NULL;
plist = create_linklist();
printf("头插法\n");
insert_head_linklist(plist, 1);
insert_head_linklist(plist, 2);
insert_head_linklist(plist, 3);
insert_head_linklist(plist, 4);
insert_head_linklist(plist, 5);
insert_head_linklist(plist, 3);
insert_head_linklist(plist, 3);
show_linklist(plist);
delete_linklist(plist, 3);
show_linklist(plist);
if (is_exist_linklist(plist, 4))
{
printf("元素中含有4\n");
}
else
{
printf("元素中没有4\n");
}
printf("将元素3换为6\n");
replace_linklist(plist, 3, 6);
show_linklist(plist);
printf("尾插法\n");
append_linklist(plist, 1);
append_linklist(plist, 2);
append_linklist(plist, 3);
append_linklist(plist, 4);
show_linklist(plist);
return 0;
}
单向链表功能函数:
#include"linklist.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
list_node_t *create_linklist(void)
{
list_node_t *ptmpnode;
ptmpnode = malloc(sizeof(list_node_t));
if (NULL == ptmpnode)
{
return NULL;
}
ptmpnode->pnext = NULL;
return ptmpnode;
}
int insert_head_linklist(list_node_t *phead, datatype tmpdata)
{
list_node_t *ptmpnode = NULL;
ptmpnode = malloc(sizeof(list_node_t));
if (NULL == ptmpnode)
{
return -1;
}
ptmpnode->data = tmpdata;
ptmpnode->pnext = phead->pnext;
phead->pnext = ptmpnode;
return 0;
}
int show_linklist(list_node_t *phead)
{
list_node_t *ptmpnode = NULL;
ptmpnode = phead->pnext;
while (ptmpnode != NULL)
{
printf("%d ", ptmpnode->data);
ptmpnode = ptmpnode->pnext;
}
printf("\n");
return 0;
}
int delete_linklist(list_node_t *phead, datatype tmpdata)
{
list_node_t *ptmpnode = NULL;
list_node_t *pprenode = NULL;
pprenode = phead;
ptmpnode = phead->pnext;
while (ptmpnode != NULL)
{
if (ptmpnode->data == tmpdata)
{
pprenode->pnext = ptmpnode->pnext;
free(ptmpnode);
ptmpnode = pprenode->pnext;
}
else
{
ptmpnode = ptmpnode->pnext;
pprenode = pprenode->pnext;
}
}
return 0;
}
int is_exist_linklist(list_node_t *phead, datatype tmpdata)
{
list_node_t *ptmpnode = NULL;
ptmpnode = phead->pnext;
while (NULL != ptmpnode)
{
if (tmpdata == ptmpnode->data)
{
return 1;
}
ptmpnode = ptmpnode->pnext;
}
return 0;
}
int replace_linklist(list_node_t *phead, datatype olddata, datatype newdata)
{
list_node_t *ptmpnode = NULL;
ptmpnode = phead->pnext;
while (NULL != ptmpnode)
{
if (olddata == ptmpnode->data)
{
ptmpnode->data = newdata;
}
ptmpnode = ptmpnode->pnext;
}
return 0;
}
int append_linklist(list_node_t *phead, datatype tmpdata)
{
list_node_t *ptmpnode = NULL;
list_node_t *pptmpnode = NULL;
pptmpnode = malloc(sizeof(list_node_t));
if (NULL == pptmpnode)
{
return -1;
}
ptmpnode = phead->pnext;
while(ptmpnode->pnext != NULL)
{
ptmpnode = ptmpnode->pnext;
}
ptmpnode->pnext = pptmpnode;
pptmpnode->data = tmpdata;
pptmpnode->pnext = NULL;
return 0;
}
单向链表功能函数头文件:
#ifndef _LINKLIST_H_
#define _LINKLIST_H_
typedef int datatype;
typedef struct list_node
{
datatype data;
struct list_node *pnext;
}list_node_t;
extern list_node_t *create_linklist(void);
extern int insert_head_linklist(list_node_t *phead, datatype tmpdata);
extern int show_linklist(list_node_t *phead);
extern int delete_linklist(list_node_t *phead, datatype tmpdata);
extern int is_exist_linklist(list_node_t *phead, datatype tmpdata);
extern int replace_linklist(list_node_t *phead, datatype olddata, datatype newdata);
extern int append_linklist(list_node_t *phead, datatype tmpdata);
#endif
makefile工程管理:
代码运行结果: