提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
# 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考 # 一、链表是什么 链表分为有头链表无头链表:为了方便操作使用有头链表。 链表包括表头加节点,表头存储的为指向下一个节点的地址,每个节点包括数据以及指向下一个节点的地址,这样就可以把这些数据链接在一起。 链表的基本操作包括:增(头插、尾插)、删(头删、尾删)、改、查、展示
1.创建表头和节点
/*链表存放数据类型*/
typedef int data_type;//方便数据进行修改
/*链表节点*/
typedef struct node{
data_type data;
struct node *p_next;
}link_node;
/*创建一个链表表头*/
link_node *creat_linklist(void)
{
link_node * p_tempnode = NULL;
p_tempnode = malloc(sizeof(link_node));
if(NULL == p_tempnode)
{
printf("malloc error\n");
return NULL;
}
memset(p_tempnode,0,sizeof(link_node));
p_tempnode->p_next = NULL;
return p_tempnode;
}
2.头插
int insert_head_linlist(link_node *p_head,data_type data)
{
/*1.创建节点*/
link_node * p_tempnode = malloc(sizeof(link_node)) ;
if( NULL == p_tempnode)
{
printf("malloc error");
return -1;
}
/*2.放入数据*/
p_tempnode->data = data;
/*3.将头节点指向空间给此节点*/
p_tempnode->p_next = p_head->p_next;
/*4.将头节点指向此节点*/
p_head->p_next = p_tempnode;
return 0;
}
3.尾插
int insert_tail_linlist(link_node *p_head,data_type data)
{
/*待插节点*/
link_node* p_insertnode = malloc(sizeof(link_node));
/*零时节点,用于走到链表最后一个节点*/
link_node* p_tempnode = NULL;
if(p_insertnode == NULL )
{
printf("malloc error");
return -1;
}
/*待插节点放入数据,指针至为空*/
p_insertnode->data = data;
p_insertnode->p_next = NULL;
/*临时节点指向头节点*/
p_tempnode = p_head;
/*零时节点走到尾节点*/
while(p_tempnode->p_next )
{
p_tempnode = p_tempnode->p_next;
}
p_tempnode->p_next = p_insertnode;
return 0;
}
4.查找
/*查找返回该节点的地址,如果没有返回空*/
link_node * search_linklist(link_node *p_head,data_type data)
{
link_node * p_tempnode = NULL;
p_tempnode = p_head->p_next;
while(p_tempnode)
{
if(data == p_tempnode->data)
{
return p_tempnode;
}
p_tempnode = p_tempnode->p_next;
}
return NULL;
}
5.修改数据
/*修改链表中出现的所有数据*/
int revise_linklist(link_node * p_head,data_type olddata,data_type newdata)
{
link_node *p_tempnode = NULL;
/*如果新数据和旧数据相等直接返回*/
if(olddata == newdata)
{
return 0;
}
/*当返回的为空时,返回*/
if(NULL == search_linklist(p_head,olddata))
{
return -1;
}
/*当返回的不为空时修改数据*/
while(p_tempnode = search_linklist(p_head,olddata))
{
p_tempnode->data = newdata;
}
return 0;
}
6.删除固定数据节点
int delect_datalinklist(link_node*p_head,data_type data)
{
link_node *p_tempnode = NULL;/*待删除节点*/
link_node *p_pronode = NULL;/*待删除前一个节点*/
p_tempnode = p_head->p_next;/*待删除节点是第一个节点*/
p_pronode = p_head;/*待删除前一个节点是头节点*/
while(p_tempnode)
{
/*当该节点数据与删除数据相同*/
if(data == p_tempnode->data)
{
/*前节点的p_next指向删除节点的下一个节点*/
p_pronode->p_next = p_tempnode->p_next;
free(p_tempnode);/*释放当前节点*/
p_tempnode = p_pronode->p_next;/*待删除节点是前节点的下一个节点*/
}
else
{
p_tempnode = p_tempnode->p_next;
p_pronode = p_pronode->p_next;
}
}
return 0;
}
7.头删
int delect_headnode(link_node * p_head)
{
if(p_head->p_next)
{
link_node *p_tempnode = p_head->p_next;
p_head->p_next = p_tempnode->p_next;
free(p_tempnode);
}
return 0;
}
8.链表销毁
void destroy_linklist(link_node **pp_head)
{
while((*pp_head)->p_next)
{
delect_headnode(*pp_head);
}
free(*pp_head);
*pp_head = NULL;
}
9.显示
int show_linklist(link_node *p_head)
{
/*用一个临时节点,去遍历整个链表*/
link_node * p_tempnode =malloc(sizeof(link_node));
if( NULL == p_tempnode)
{
printf("malloc error");
return -1;
}
/*临时节点为链表首节点*/
p_tempnode = p_head->p_next;
while(p_tempnode)
{
printf("%d ",p_tempnode->data);
/*相当于p++*/
p_tempnode = p_tempnode->p_next;
}
printf("\n");
return 0;
}
二、检查内存泄漏
1.valgrind 使用
valgrind --tool=memcheck --leak-check=full ./a.out
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。