目录
前言
以前曾学过数据结构,但就只是学了一小部分也没有笔记,然后就没然后了。。。,代码也码得太少了,还好现在还有点基础,就尝试写点记录一下,不对的地方欢迎指出。
一、什么是数据结构?
现实生活中产生的各种信息数据,我们要进行记录存储以便对数据的利用,而数据大多都很庞大且复杂,计算机的算力和空间也是有限的,所以数据结构就是研究如何将数据存储到计算机中以提高存储效率。
二、单链表
一种链式的存取数据结构,用任意一组地址存储单元表示数据,该数据以节点表示,节点组成:数据域 + 指针域,数据域存放数据,指针域存放下一个节点的地址,这样就形成一条链。单链表明显的优劣势是灵活(动态分配存储空间),插入删除方便,但随机存取耗时较长。
三、单链表的实现(带头节点)
实现仅是贴出代码,并不去详细说明,第一篇就先这样【笑哭】,其实是不太会写,后面在慢慢学习怎么写。
文件结构: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. 网络搜索