有趣的数据结构算法3——单链表尾插法和头插法的实现

2023-11-08

有趣的数据结构算法3——单链表尾插法和头插法的实现

以前学习C语言的时候,对于指针,链表什么的是最害怕的。但是现在……
在这里插入图片描述

什么是单链表

单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。其与顺序数组最大的不同在于,顺序数组在内存中中存放数据的方式是连续存放的,而单链表每一个节点的内存数据是任意存放的。
有无头结点的链表示意图,图片来自百度百科
有无头结点的链表示意图,图片来自百度百科。

头插法的实现

头插法顾名思义就是在插入数据的时候,是从单链表的头部插入的。
假设有一个已经生成的链表,它是长这样的。
完整的单链表示意图
如果我们需要往链表中添加数据,首先要断开头结点和第一个节点的链接。
断开连接
然后让头结点指向新的数据节点,新的数据节点再指向原来头结点指向的节点。
在这里插入图片描述
此时便完成了一个数据的插入。

尾插法的实现

头插法的实现非常方便,但是逻辑思维和普通的顺序存储不同,最后加入的元素反而在链表的头部,使用尾插法则没有相对应的问题,与头插法不同,尾插法需要一个指向尾部的指针,不然每次添加数据都需要遍历整个链表,会导致效率较低。
尾插法示意图
将尾部节点指向新数据。
尾部节点指向新数据
将新节点定义为尾部节点。
新节点定义为尾部节点

头插法实现代码

 #include <stdio.h>
 #include <stdlib.h>
 
 struct Node{ //定义结构体
 	int data;
 	struct Node* Next;
 };
 
 typedef struct Node* Linked_List;	//将结构体指针定义成另外的名称Linked_List
 //如果使用一个*传入的是结构体的指针,其可以改变内部元素,data,Next
 
 void getNode(Linked_List p){		//用于获得Node的data值,被addNode调用
 	printf("请输入数字:");
 	scanf("%d", &p->data);
 }
 
 void addNode(Linked_List* library){
 	Linked_List p, temp;
 
 	p = (Linked_List)malloc(sizeof(Linked_List));	//申请内存空间
 
 	if (p == NULL)
 	{
 		printf("error");
 		exit(1);
 	}
 
 	getNode(p);
 
 	if (*library == NULL){	//如果头结点为空,将头结点指针的对应的地址改为p,因此要用到指针的指针。
 		p->Next = NULL;
 		*library = p;
 	}
 	else{
 		temp = *library;	//利用temp节点更新头插法
 		p->Next = temp;
 		*library = p;
 	}
 }
 
 void scanLibrary(Linked_List library){
 	int i = 0;
 	Linked_List p;
 
 	p = (Linked_List)malloc(sizeof(Linked_List));
 	p = library;
 
 	while (p != NULL){
 		printf("数字%d是%d\n", i, p->data);
 		p = p->Next;
 		i++;
 	}
 	free(p);
 }
 
 void release(Linked_List library){
 	Linked_List temp = library->Next;
 	while (library != NULL){
 		free(temp);
 		library = library->Next;
 	}
 	free(library);
 }
 
 void main()
 {
 	Linked_List head = NULL;
 	int num;
 	printf("请问要输入几个数字:");
 	scanf("%d", &num);
 	for (int i = 0; i<num; i++){
 		addNode(&head);
 	}
 	scanLibrary(head);
 }

尾插法实现代码

 #include <stdio.h>
 #include <stdlib.h>
 
 struct Node{ //定义结构体
 	int data;
 	struct Node* Next;
 };
 
 typedef struct Node* Linked_List;	//将结构体指针定义成另外的名称Linked_List
 //如果使用一个*传入的是结构体的指针,其可以改变内部元素,data,Next
 
 void getNode(Linked_List p){		//用于获得Node的data值,被addNode调用
 	printf("请输入数字:");
 	scanf("%d", &p->data);
 }
 
 void addNode(Linked_List* library, Linked_List* tail){
 	Linked_List p;
 
 	p = (Linked_List)malloc(sizeof(Linked_List));
 	if (p == NULL)
 	{
 		printf("error");
 		exit(1);
 	}
 
 	getNode(p);
 
 	if (*library == NULL){	//如果头结点为空,将头结点指针的对应的地址改为p,因此要用到指针的指针。
 		p->Next = NULL;
 		*library = p;
 
 		*tail = *library;	//此时尾节点等于头结点
 		
 	}
 	else{
 		p->Next = NULL;
 		(*tail)->Next = p;
 		*tail = p;			//尾节点更新
 	}
 	
 }
 
 void scanLibrary(Linked_List library){
 	int i = 0;
 	Linked_List p;
 
 	p = (Linked_List)malloc(sizeof(Linked_List));
 	p = library;
 
 	while (p != NULL){
 		printf("数字%d是%d\n", i, p->data);
 		p = p->Next;
 		i++;
 	}
 	free(p);
 }
 
 void release(Linked_List library){
 	Linked_List temp = library->Next;
 	while (library != NULL){
 		free(temp);
 		library = library->Next;
 	}
 	free(library);
 }
 
 void main()
 {
 	Linked_List head = NULL,tail = NULL;
 	int num;
 	printf("请问要输入几个数字:");
 	scanf("%d", &num);
 	for (int i = 0; i<num; i++){
 		addNode(&head,&tail);
 	}
 	scanLibrary(head);
 }

GITHUB下载连接

https://github.com/bubbliiiing/Data-Structure-and-Algorithm

希望得到朋友们的喜欢。
有问题的朋友可以提问噢。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有趣的数据结构算法3——单链表尾插法和头插法的实现 的相关文章

  • 国网DLT698.45协议——采集系统、数据交换(一)

    国网DLT698 45协议 采集系统 数据交换 面向对象协议 对于国网698协议 是一种面向对象的通信协议 用于远程监控和控制电力系统中的设备 面向对象使得对协议的思考更趋向于正常思维 使计算机中描述的抽象世界于现实世界中能够更好的对应起来
  • VirtualBox虚拟机安装64位Linux系统(Ubuntu)

    如果在VirtualBox中安装64位的Linux操作系统时提示如下错误 This kernel needs a x86 64 CPU but only detects an i386 CPU 解决方法如下 第一步 重启计算机 进入Bios
  • 基于ABB工业机器人工作站的设计———毕业设计

    基于ABB工业机器人搬运工作站的设计 通过RobotStudio软件来 模拟机器人灌装液体 混合液体并封装的过程 去年的毕业设计和毕业论文 还一些不了解的老师没见过 还说感觉很高级 感觉这个题目 目前还算是比较新 可以直接拿来用 还有一些关

随机推荐

  • 手机号码的正则表达式

    手机号码的正则表达式可以是这样的 13 0 9 14 5 7 15 0 3 5 9 17 0 3 5 8 18 0 9 166 198 199 147 d 8 这个正则表达式可以匹配大多数中国大陆的手机号码 包括 13 14 15 17 1
  • java.net.SocketException: Software caused connection abort: recv failed 异常分析

    关键字 recv failed java net SocketException Software caused connection abort recv failed at java net SocketInputStream sock
  • SMTP端口选择

    SMTP Port 25 465 587 or 2525 how to choose the right SMTP Port 原文地址 https pepipost com blog 25 465 587 2525 choose the r
  • 如何有理有据地给元宇宙泼一盆冷水?

    从来没有一个词像 元宇宙 一样如此虚无缥缈 如此镜花水月却受到如此热烈的追捧 元宇宙和之前的科技概念不同 以前 在科技圈的一个概念至少是明确而又具体的 比如 区块链 5G 3D打印 然而 元宇宙不是 它虚幻缥缈而错综复杂 一如 浑元形意拳
  • TypeScript基本类型、类、封装、继承、泛型、接口、命名空间

    简介 前几篇介绍了Vue3的Composition API Vue Router pinia Vue3能更好支持TS 因此 本节将介绍TS 详细描述了TS的优缺点 安装 如何配置自动编译 tsconfig json的常用配置 使用webpa
  • HTML-CSS(四十一)animation动画

    animation属性 animation name 设置动画的名字 自定义的 animation duration 动画的持续时间 animation delay 动画的延迟时间 animatio iteration count 动画的重
  • 集合学习总结

    集合 1 java集合框架概述 1 集合 數組都是多個數據存儲操作的結構 簡稱java容器 說明 主要指的存儲是內存層面的存儲 不涉及到持久化的存儲 可以分為Collection和Map兩種 Collection接口 單列數據 定義了存取一
  • (GAE)Google App Engine入门程序——helloworld

    参考资料 http blog xuming net gae tutorial 官网例子 https developers google com appengine docs python gettingstartedpython27 hel
  • 编译器优化–4--消除无用和不可达代码

    编译器优化 4 消除无用和不可达代码 概述 有时候 程序包含的一些计算不具有外部可见的效应 如果编译器能够确定给定操作不会影响程序的结果 那么它完全可以消除该操作 大多数程序员都不会有意编写这种代码 但是 这种代码在大多数程序中作为编译器中
  • CSDN高校俱乐部介绍-CSDN高校俱乐部-专题视频课程

    CSDN高校俱乐部介绍 6621人已学习 课程介绍 本课程旨在让更多学生了解CSDN高校俱乐部的服务宗旨 活动形式和人才选拔模式 作为服务于当代大学生学习与成长的IT技术学习型组织 俱乐部有别于一般技术类社团 在活动内容 活动形式以及行业对
  • 嵌入式Linux驱动开发(I2C专题)(七)

    使用GPIO操作I2C设备 IMX6ULL 参考资料 Linux文档 Linux 5 4 Documentation devicetree bindings i2c i2c gpio yaml Linux 4 9 88 Documentat
  • ssm框架使用MybatisPlus在配置sqlSessionFactory时报“Cannot resolve class ‘MybatisSqlSessionFactoryBean‘”

    在百度搜索在配置时class引入的是 com baomidou mybatisplus spring MybatisSqlSessionFactoryBean 引入后报错 改成class com baomidou mybatisplus e
  • layui文档,最新文档地址,官网已经下线

    最新文档地址 官网已经下线了 http layui shagua wiki layuidoc doc index html
  • linux(ubuntu) git目录下设置显示内容

    gt vim bashrc 添加并退出 GIT PS1 SHOWDIRTYSTATE false GIT PS1 SHOWCOLORHINTS false PROMPT COMMAND git ps1 u h w gt source bas
  • 网络地址与直接广播地址有关计算

    一 已知IP地址和子网掩码 1 网络地址 网络号 IP 子网掩码 2 直接广播地址 网络地址 网络号不变 主机号变全1 3 主机号 IP 取反 子网掩码 网络号全0 4 子网内第一个可用IP地址 网络号 1 网络地址 1 5 主机数 2 n
  • C++ explicit关键字浅析

    explicit关键字 今天在看std thread的时候 发现他的构造函数是这样的 explicit thread Fn fn Args args explicit这个关键字很眼熟 因为在Qt中默认的构造函数也是用的这个关键字 expli
  • Unity 2D像素游戏序列帧动画制作规范

    一 问题背景 笔者遇到了很多很多跟美术策划协作的问题 首先声明本文不考虑SpriteAltas 也不绝对正确 仅供参考 错误可以在评论区指出我进行修改以免误导 我们可以清楚的看到跳跃后会出现角色跟碰撞器大小不一样的情况 这个时候如果我去碰右
  • 软件开发中的SD、SE、QA和RD是什么意思?

    2019独角兽企业重金招聘Python工程师标准 gt gt gt QA QA即英文QUALITY ASSURANCE 的简称 中文意思是品质保证 其在ISO8402 1994中的定义是 为了提供足够的信任表明实体能够满足品质要求 而在品质
  • “卷爆了“的IT互联网行业,为啥至今还有人头铁往里冲?

    细数互联网过往的发展史 造就了成千上万的企业家 创业者 众多职场人趋之若鹜地选择互联网行业 想从这个领域捞一桶金 但不知道从什么时候开始 一篇篇关于互联网红利消失 流量枯竭的文章接踵而至 现在转行互联网 做什么看起来都是那么困难 很多从业者
  • 有趣的数据结构算法3——单链表尾插法和头插法的实现

    有趣的数据结构算法3 单链表尾插法和头插法的实现 什么是单链表 头插法的实现 尾插法的实现 头插法实现代码 尾插法实现代码 GITHUB下载连接 以前学习C语言的时候 对于指针 链表什么的是最害怕的 但是现在 什么是单链表 单链表是一种链式