20c语言——链表

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


# 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考 # 一、链表是什么 链表分为有头链表无头链表:为了方便操作使用有头链表。 链表包括表头加节点,表头存储的为指向下一个节点的地址,每个节点包括数据以及指向下一个节点的地址,这样就可以把这些数据链接在一起。 链表的基本操作包括:增(头插、尾插)、删(头删、尾删)、改、查、展示

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提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值