本文概要
本篇文章主要介绍数据结构中单向链表各种操作,适合有C语言基础的同学,文中描述和代码示例很详细,干货满满,感兴趣的小伙伴快来一起学习吧!
🌟🌟🌟个人简介🌟🌟🌟
☀️大家好!我是新人博主朦胧的雨梦,希望大家多多关照和支持😝😝😝
🌖大家一起努力,共同成长,相信我们都会遇到更好的自己👊👊👊
🌗期待我的文章能给各位带来知识的收获和解决问题的灵感🤩🤩🤩
🌟大家的三连是我不断更新的动力😘😘😘
学习目标🏆
1.了解单向链表的结构特点;
2.掌握单向链表的创建;
3.掌握单向链表的各种操作。
✨一.单向链表
🌲1.单向链表的定义
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。乍一看的意思就像是乍一看,每个字都认识,连在一起就成这样了:
其实,很简单,我用一张图来解释单向链表的结构:
是不是一下就清楚什么是单向链表了,关于头指针head和终端结点:
-
单链表中每个结点的存储地址是存放在其前趋结点Pnext域中,而开始结点无前趋,故应设头指针head指向开始结点。链表由头指针唯一确定,单链表可以用头指针的名字来命名。
-
终端结点无后继,故终端结点的指针域为空,即NULL。
✨二.单向链表的创建
1.首先,我们需要定义一个结构体来装着元素和指向下一个元素节点的指针
#include<stdio.h>
//定义结构体
struct Mystruct
{
int data;
struct Mystruct *pnext;
};
2.接下来,我们创建一个无空头的链表,首先定义头尾指针(方便对链表进行
操作)
#include<stdio.h>
//定义结构体
struct Mystruct
{
int data;
struct Mystruct *pnext;
};
int main(void)
{
//定义头尾指针
struct Mystruct *phead = NULL;
struct Mystruct *pend= NULL;
return 0;
}
3.以尾添加(尾插)为例,因为需要改变指针的指向,必须传递二级指针,现在写出我们的第一个链表
void end_add(struct Mystruct **phead,struct Mystruct **pend,int add_data)
{ //参数合法性检测
if (NULL == phead || NULL == pend)
return;
//申请新节点
struct Mystruct* new_pdode = (struct Mystruct*)malloc(sizeof(struct Mystruct));
//检测是否申请成功
if (NULL == new_pdode)
{
printf("空间申请失败");
return;
}
//新节点赋值
new_pdode->data = add_data;
new_pdode->pnext = NULL;
//连接
//无节点的情况
if (NULL == *phead && NULL == *pend)
{
*phead = new_pdode;
}
//有节点情况
else
{
(*pend)->pnext = new_pdode;
}
*pend = new_pdode;
}
✨三.单向链表的各种操作
1.增加元素
上面讲了尾插,所以就该讲头插了:
void head_add(struct Mystruct** phead, struct Mystruct** pend, int adddata)
{
//参数合法性检测
if (NULL == phead || NULL == pend)
return;
//创造新节点
struct Mystruct* new_pdode = (struct Mystruct*)malloc(sizeof(struct Mystruct));
//合法性检测
if (NULL == new_pdode)
{
printf("空间申请失败");
return;
}
//新节点赋值
new_pdode->data = adddata;
new_pdode->pnext = NULL;
//连接
//无节点的情况
if (NULL == *phead && NULL == *pend)
{
*pend = new_pdode;
}
//有节点的情况
else
{
new_pdode->pnext = *phead;
}
*phead = new_pdode;
}
2.查找元素
1.根据下标查找元素
struct Mystruct* index_find(struct Mystruct* phead, int index)
{
//参数合法性检测
if (NULL == phead || index < 0)
return NULL;
//记录头指针
struct Mystruct* p = phead;
for (int i = 0; i < index; i++)
{
p = p->pnext;
}
return p;
}
2.根据数据查找元素
void data_find(struct Mystruct* phead, int designated_data)
{
//参数合法性检测
if (NULL == phead)
return;
//记录头指针
struct Mystruct* ptemp = phead;
while (ptemp != NULL)
{
if (ptemp->data == designated_data)
{
printf("找到了");
break;
}
ptemp = ptemp->pnext;
}
return;
}
3.修改元素数据
根据下标修改元素数据
void index_change(struct Mystruct *phead,int index, int change_data)
{
//参数合法性检测
if (index < 0)
return;
//调用下标查找函数
struct Mystruct* p = index_find(phead, index);
//更改数据
p->data = change_data;
}
4.删除元素
void freelist(struct Mystruct* phead)
{
//记录头指针
struct Mystruct* pt = phead;
//开始删除
while (pt != NULL)
{
struct Mystruct* p = pt;
pt = pt->pnext;
free(p);
}
}
✨四.结语
单向链表的操作非常重要,对于新手来说。可能需要重复捋几遍思路,一旦掌握就会觉得非常简单,相信大家通过这篇文章已经可以掌握了单向链表的操作,今天就分享到这里,谢谢大家的观看,有什么想法记得评论区告诉我!拜拜~✨ ✨ ✨
💫往期好文推荐
TOP🥇.AI工具究竟是帮手还是对手?❤️❤️❤️🏆🏆🏆❤️❤️❤️
TOP🥈.Python爬虫 | 利用python爬虫获取想要搜索的数据(某du)❤️❤️❤️🏆🏆🏆❤️❤️❤️文章来源:https://www.toymoban.com/news/detail-432163.html
TOP🥉.ChatGPT | 一文详解ChatGPT(学习必备)❤️❤️❤️🏆🏆🏆❤️❤️❤️
文章来源地址https://www.toymoban.com/news/detail-432163.html
到了这里,关于带你玩转单向链表(学习必备)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!