本文概要

本篇文章主要介绍数据结构中单向链表各种操作,适合有C语言基础的同学,文中描述和代码示例很详细,干货满满,感兴趣的小伙伴快来一起学习吧!

个人简介

☀️大家好!我是新人博主朦胧的雨梦,希望大家多多关照和支持
大家一起努力,共同成长,相信我们都会遇到更好的自己
期待我的文章能给各位带来知识的收获和解决问题的灵感
大家的三连是我不断更新的动力

文章要点速览

  • 本文概要
  • 个人简介
  • 学习目标
  • ✨一.单向链表
    • 1.单向链表的定义
  • ✨二.单向链表的创建
  • ✨三.单向链表的各种操作
    • 1.增加元素
    • 2.查找元素
      • 1.根据下标查找元素
      • 2.根据数据查找元素
    • 3.修改元素数据
      • 根据下标修改元素数据
    • 4.删除元素
  • ✨四.结语
  • 往期好文推荐

学习目标

  1.了解单向链表的结构特点

  2.掌握单向链表的创建

  3.掌握单向链表的各种操作

✨一.单向链表

1.单向链表的定义

  单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。乍一看的意思就像是乍一看,每个字都认识,连在一起就成这样了:

其实,很简单,我用一张图来解释单向链表的结构:

是不是一下就清楚什么是单向链表了,关于头指针head和终端结点

  • 单链表中每个结点的存储地址是存放在其前趋结点Pnext域中,而开始结点无前趋,故应设头指针head指向开始结点。链表由头指针唯一确定,单链表可以用头指针的名字来命名。

  • 终端结点无后继,故终端结点的指针域为空,即NULL

✨二.单向链表的创建

1.首先,我们需要定义一个结构体来装着元素和指向下一个元素节点的指针

#include//定义结构体struct Mystruct {int data;struct Mystruct *pnext; };

2.接下来,我们创建一个无空头的链表,首先定义头尾指针(方便对链表进行
操作)

#include//定义结构体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)❤️❤️❤️❤️❤️❤️

  TOP.ChatGPT | 一文详解ChatGPT(学习必备)❤️❤️❤️❤️❤️❤️