【C语言】单链表的实现

目录

前言

一、什么是数据结构?

二、单链表

三、单链表的实现(带头节点)

参考资料:


 

前言

 以前曾学过数据结构,但就只是学了一小部分也没有笔记,然后就没然后了。。。,代码也码得太少了,还好现在还有点基础,就尝试写点记录一下,不对的地方欢迎指出。

一、什么是数据结构?

现实生活中产生的各种信息数据,我们要进行记录存储以便对数据的利用,而数据大多都很庞大且复杂,计算机的算力和空间也是有限的,所以数据结构就是研究如何将数据存储到计算机中以提高存储效率

二、单链表

一种链式的存取数据结构,用任意一组地址存储单元表示数据,该数据以节点表示,节点组成:数据域 + 指针域,数据域存放数据,指针域存放下一个节点的地址,这样就形成一条链。单链表明显的优劣势是灵活(动态分配存储空间),插入删除方便,但随机存取耗时较长。

三、单链表的实现(带头节点)

实现仅是贴出代码,并不去详细说明,第一篇就先这样【笑哭】,其实是不太会写,后面在慢慢学习怎么写。

文件结构:main:主程序;operation:主要写链表各种操作;public:为公用的一些函数、宏定义等;Makefile:项目管理

编译器:GCC

下面是部分代码,完整代码链接:https://pan.baidu.com/s/1cQf9ToTZSJbvK26ikRk2qw  提取码:x3uy

/* 头文件包含 */
#include "operation.h"

/*
   操作前:没有链表
   操作后:申请一个节点并初始化
*/
single_list* init_list(void)
{
	single_list *pnode = (single_list *)xmalloc(sizeof(single_list));
	pnode->data = 0;
	pnode->next = NULL;

	return pnode;
}

/*
   操作前:链表存在
   操作后:元素插入操作
*/
Status insert_operate(single_list *plist, elem_type data)
{
	single_list *pnew = (single_list *)xmalloc(sizeof(single_list));
	pnew->data = data;		// 将数据存入新节点数据域 
	pnew->next = plist->next;       // 新节点指针域存放下一个节点地址
	plist->next = pnew;             

	return OK;
}

/*
   操作前:链表存在且不为空
   操作后:得到给定元素的前驱地址
*/
single_list* find_prec_addr(single_list *const plist, elem_type data)
{
	single_list *ptmp = plist;
	while ((NULL != ptmp->next) && (ptmp->next->data != data)) // 第一个节点前驱地址为头节点地址
	{														   
		ptmp = ptmp->next;								       								
	}

	return ptmp;
}

/*
   操作前:空链表存在
   操作后:创建了一个链表(头插法)
*/
Status create_list(single_list *const plist)
{
	elem_type arr[ARRAY_MAX_RANGE];
	for (int cnt = 0; cnt < ARRAY_MAX_RANGE; cnt++)
	{
		arr[cnt] = cnt;
		insert_operate(plist, arr[cnt]);
	}
	/* 手动输入 */
	// elem_type data = 0;
	// printf("Please input data: ");
	// do
	// {
	// 	scanf("%d", &data);
	// 	insert_operate(list, data);
	// } while (getchar() != '\n');

	return OK;
}

/*
   操作前:链表存在且不为空
   操作后:在链表中某个元素前插入一个元素
*/
Status insert_elem(single_list *const plist, elem_type data, elem_type idata)
{
	single_list *addr = find_prec_addr(plist, data);
	if (NULL == addr->next) 	// 找到最后一个没找到,说明查找的元素不在链表中
	{
		printf("No such element!\n");
		return ERROR;
	}
	insert_operate(addr, idata);

	return OK;
}

/*
   操作前:链表存在且不为空
   操作后:删除链表中某个元素
*/
Status delete_elem(single_list *const plist, elem_type data)
{
	single_list *addr = find_prec_addr(plist, data);
	if (NULL == addr->next) 	// 找到最后一个没找到,说明查找的元素不在链表中
	{
		printf("No such element!\n");
		return ERROR;
	}
	single_list *ptmp = addr->next;
	addr->next = ptmp->next;
	free_memory(ptmp);

	return OK;
}

/*
   操作前:链表存在且不为空
   操作后:修改链表中某个元素
*/
Status modify_elem(single_list *const plist, elem_type data, elem_type mdata)
{
	single_list *addr = find_prec_addr(plist, data);
	if (NULL == addr->next) 	// 找到最后一个没找到,说明查找的元素不在链表中
	{
		printf("No such element!\n");
		return ERROR;
	}
	addr->next->data = mdata;

	return OK;
}

/*
   操作前:链表存在且不为空
   操作后:查找链表中某个元素
*/
Status find_elem(single_list *const plist, elem_type data, elem_type *fdata)
{
	single_list *addr = find_prec_addr(plist, data);
	if (NULL == addr->next) 	// 找到最后一个没找到,说明查找的元素不在链表中
	{
		printf("No such element!\n");
		return ERROR;
	}
	*fdata = addr->next->data;

	return OK;
}

参考资料:

1.《数据结构》(C语言版) 严蔚敏&吴伟民

2.《数据结构算法实现及分解》(第二版) 高一凡

3.《数据结构与算法分析》(C语言版) Mark Allen Weies

4.  网络搜索

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值