线性表的链式表示【单链表】

目录

单链表的优缺点

单链表结点的定义

头插法新建链表

尾插法新建链表

按位查找

按值查找

i 位置插入元素

单链表的删除


单链表的优缺点

优点缺点

1. 插入和删除操作不需要移动元素,只需要修改指针

2. 不需要大量的连续存储空间

1. 单链表附加指针域,也存在浪费存储空间的缺点。

2. 查找操作需要从表头开始遍历,依次查找,不能随机存取。

单链表结点的定义

typedef int ElemType;
typedef struct LNode{ElemType data;//数据域struct LNode *next;//指针域
}LNode, *LinkList;

注意

LNode*是结构体指针,和LinkList完全等价。

头插法新建链表

代码

#include <stdio.h>
#include <stdlib.h>//malloc需要typedef int ElemType;
typedef struct LNode{ElemType data;struct LNode *next;
}LNode, *LinkList;void list_head_insert(LNode* &L) {L = (LinkList) malloc(sizeof(LNode));//申请头节点空间,头指针指向头结点L -> next =NULL;ElemType x;scanf("%d", &x);LNode *s;//用来指向申请的新结点while(x != 9999){s = (LinkList) malloc(sizeof(LNode));s -> data = x;s -> next = L -> next;//s的next指向原本链表的第一个结点L -> next = s;//头结点的next,指向新结点scanf("%d",&x);}
}void print_list(LinkList L){L = L -> next;while(L != NULL){printf("%3d", L -> data);L = L -> next;}printf("\n");
}int main(){LinkList L;//L是链表头指针,LinkList是结构体指针类型list_head_insert(L);//输入数据可以为3,4,5,6,7,9999,头插法新建链表print_list(L);//打印链表return 0;
}

效果

注意

#include <stdlib.h>//malloc需要

尾插法新建链表

代码

#include <stdio.h>
#include <stdlib.h>//malloc需要typedef int ElemType;
typedef struct LNode{ElemType data;struct LNode *next;
}LNode, *LinkList;void list_tail_insert(LNode* &L) {L = (LinkList) malloc(sizeof(LNode));//申请头节点空间,头指针指向头结点L -> next =NULL;ElemType x;scanf("%d", &x);LNode *s, *r = L;//s是用来指向申请的新结点,r始终指向链表尾部while(x != 9999){s = (LinkList) malloc(sizeof (LNode));//为新结点申请空间s -> data = x;r -> next = s;//新结点给尾结点的nextr = s;//r指向新的尾部scanf("%d",&x);}r -> next = NULL;//让尾结点的next为NULL
}void print_list(LinkList L){L = L -> next;while(L != NULL){printf("%3d", L -> data);L = L -> next;}printf("\n");
}int main(){LinkList L;//L是链表头指针,LinkList是结构体指针类型list_tail_insert(L);//输入数据可以为3,4,5,6,7,9999,头插法新建链表print_list(L);//打印链表return 0;
}

效果

按位查找

注意

        判断查找位置是否合法

代码

#include <stdio.h>
#include <stdlib.h>//malloc需要typedef int ElemType;
typedef struct LNode{ElemType data;struct LNode *next;
}LNode, *LinkList;void list_tail_insert(LNode* &L) {L = (LinkList) malloc(sizeof(LNode));//申请头节点空间,头指针指向头结点L -> next =NULL;ElemType x;scanf("%d", &x);LNode *s, *r = L;//s是用来指向申请的新结点,r始终指向链表尾部while(x != 9999){s = (LinkList) malloc(sizeof (LNode));//为新结点申请空间s -> data = x;r -> next = s;//新结点给尾结点的nextr = s;//r指向新的尾部scanf("%d",&x);}r -> next = NULL;//让尾结点的next为NULL
}void print_list(LinkList L){L = L -> next;while(L != NULL){printf("%3d", L -> data);L = L -> next;}printf("\n");
}LinkList GetElem(LinkList L,int SearchPos){int i = 0;if(SearchPos < 0){return NULL;}while(L !=  NULL && i < SearchPos){L = L -> next;i++;}return L;}int main(){LinkList L,search;//L是链表头指针,search是指针,LinkList是结构体指针类型list_tail_insert(L);//输入数据可以为3,4,5,6,7,9999,头插法新建链表print_list(L);//打印链表//按位查找search = GetElem(L,2);if(search != NULL){printf("Succeeded in searching by serial number\n");printf("%d\n",search -> data);}return 0;
}

效果

按值查找

代码

#include <stdio.h>
#include <stdlib.h>//malloc需要typedef int ElemType;
typedef struct LNode{ElemType data;struct LNode *next;
}LNode, *LinkList;void list_tail_insert(LNode* &L) {L = (LinkList) malloc(sizeof(LNode));//申请头节点空间,头指针指向头结点L -> next =NULL;ElemType x;scanf("%d", &x);LNode *s, *r = L;//s是用来指向申请的新结点,r始终指向链表尾部while(x != 9999){s = (LinkList) malloc(sizeof (LNode));//为新结点申请空间s -> data = x;r -> next = s;//新结点给尾结点的nextr = s;//r指向新的尾部scanf("%d",&x);}r -> next = NULL;//让尾结点的next为NULL
}void print_list(LinkList L){L = L -> next;while(L != NULL){printf("%3d", L -> data);L = L -> next;}printf("\n");
}LinkList LocateElem(LinkList L,ElemType SearchVal){while(L){if(L -> data == SearchVal){//吐过找到对应的值,就返回那个结点的地址return L;}L = L -> next;}return NULL;
}
int main(){LinkList L,search;//L是链表头指针,search是指针,LinkList是结构体指针类型list_tail_insert(L);//输入数据可以为3,4,5,6,7,9999,头插法新建链表print_list(L);//打印链表//按值查找search = LocateElem(L,6);if(search != NULL){printf("Search by value succeeded\n");printf("%d\n",search -> data);}return 0;
}

效果

i 位置插入元素

代码

#include <stdio.h>
#include <stdlib.h>//malloc需要typedef int ElemType;
typedef struct LNode{ElemType data;struct LNode *next;
}LNode, *LinkList;void list_tail_insert(LNode* &L) {L = (LinkList) malloc(sizeof(LNode));//申请头节点空间,头指针指向头结点L -> next =NULL;ElemType x;scanf("%d", &x);LNode *s, *r = L;//s是用来指向申请的新结点,r始终指向链表尾部while(x != 9999){s = (LinkList) malloc(sizeof (LNode));//为新结点申请空间s -> data = x;r -> next = s;//新结点给尾结点的nextr = s;//r指向新的尾部scanf("%d",&x);}r -> next = NULL;//让尾结点的next为NULL
}void print_list(LinkList L){L = L -> next;while(L != NULL){printf("%3d", L -> data);L = L -> next;}printf("\n");
}LinkList GetElem(LinkList L,int SearchPos){int i = 0;if(SearchPos < 0){return NULL;}while(L !=  NULL && i < SearchPos){L = L -> next;i++;}return L;}bool ListFrontInsert(LinkList L,int i,ElemType InsertVal){LinkList p = GetElem(L,i -1 );if(NULL == p){return false;}LinkList q;q = (LinkList) malloc(sizeof (LNode));q -> data = InsertVal;q -> next =  p -> next;p -> next = q;return true;
}int main(){LinkList L,search;//L是链表头指针,search是指针,LinkList是结构体指针类型list_tail_insert(L);//输入数据可以为3,4,5,6,7,9999,头插法新建链表bool ret;ret = ListFrontInsert(L,2,99);print_list(L);//打印链表return 0;
}

注意

从函数调用位置,跳转到函数定义位置,ctrl + 鼠标左键点击

效果

单链表的删除

代码

#include <stdio.h>
#include <stdlib.h>//malloc需要typedef int ElemType;
typedef struct LNode{ElemType data;struct LNode *next;
}LNode, *LinkList;void list_tail_insert(LNode* &L) {L = (LinkList) malloc(sizeof(LNode));//申请头节点空间,头指针指向头结点L -> next =NULL;ElemType x;scanf("%d", &x);LNode *s, *r = L;//s是用来指向申请的新结点,r始终指向链表尾部while(x != 9999){s = (LinkList) malloc(sizeof (LNode));//为新结点申请空间s -> data = x;r -> next = s;//新结点给尾结点的nextr = s;//r指向新的尾部scanf("%d",&x);}r -> next = NULL;//让尾结点的next为NULL
}void print_list(LinkList L){L = L -> next;while(L != NULL){printf("%3d", L -> data);L = L -> next;}printf("\n");
}LinkList GetElem(LinkList L,int SearchPos){int i = 0;if(SearchPos < 0){return NULL;}while(L !=  NULL && i < SearchPos){L = L -> next;i++;}return L;}bool ListDelete(LinkList L,int i){LinkList p = GetElem(L,i-1);//拿到要删除结点的前一个if(NULL == p){return false;}LinkList q = p -> next;//拿到要删除的结点指针p -> next = q -> next;//断链free(q);//释放被删除结点的空间return true;
}int main(){LinkList L,search;//L是链表头指针,search是指针,LinkList是结构体指针类型list_tail_insert(L);//输入数据可以为3,4,5,6,7,9999,头插法新建链表bool ret;ret = ListDelete(L,4);print_list(L);//打印链表return 0;
}

效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/249606.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【昕宝爸爸小模块】日志系列之什么是分布式日志系统

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你&#x1f44d;点赞、&#x1f5c2;️收藏、加❤️关注哦。 本文章CSDN首发&#xff0c;欢迎转载&#xff0c;要注明出处哦&#xff01; 先感谢优秀的你能认真的看完本文&…

基于单片机温度控制系统的研究

摘 要&#xff1a;笔者基于单片机的温度控制系统&#xff0c;从单片机选择、传感器选择、系统框架设计等方面概述了单片机的温度控制系统内涵&#xff0c;分析了其运行原理&#xff0c;列举了单片机温度控制系统设计的实操方法&#xff0c;从硬件系统、软件系统、温度检测方法…

第一节课,用户管理--后端初始化,项目调通。二次翻工2

一、网址来源&#xff1a; 快速开始 | MyBatis-Plus (baomidou.com) 进程&#xff1a; ​ 二、[此处不看]添加测试类&#xff0c;看下效果 2.1 参考 一、第一节课&#xff0c;用户管理--后端初始化&#xff0c;项目调通-CSDN博客 ​ 2.2 新建 SampleTest ​ 2.3 复…

基于springboot汽车租赁系统源码和论文

首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包括软件架构模式、整体功能模块、数据库设计。本项…

【漏洞复现】中移铁通禹路由器弱口令漏洞

Nx01 产品简介 中移禹路由器支持宽带拨号、动态IP和静态IP三种上网模式,一般中国移动宽带的光猫都是智能光猫也就是光猫带路由器功能,中移禹路由器作为二级路由使用。 Nx02 漏洞描述 中移禹路由器存在默认口令(admin)&#xff0c;攻击者可利用该漏洞获取敏感信息。 Nx03 产品…

docker镜像详解

文章目录 一、什么是docker镜像 二、为什么需要镜像 三、镜像相关命令详解 3、1 命令清单 3、2 命令详解 四、镜像实战 4、1 镜像操作案例 4、2 离线迁移镜像 4、3 镜像存储的压缩与共享 &#x1f64b;‍♂️ 作者&#xff1a;Ggggggtm &#x1f64b;‍♂️ &#x1f440; 专栏…

RabbitMQ 死信队列应用

1. 概念 死信队列&#xff08;Dead Letter Queue&#xff09;是在消息队列系统中的一种特殊队列&#xff0c;用于存储无法被消费的消息。消息可能会因为多种原因变成“死信”&#xff0c;例如消息过期、消息被拒绝、消息队列长度超过限制等。当消息变成“死信”时&#xff0c;…

喝汽水问题

答案&#xff1a; #include <stdio.h> int main() {int num 0; //可以喝汽水的次数int mon 20; //钱int cup 0; //瓶子数for (mon 20; mon > 0; mon--) //每次花1元钱买汽水喝{num; //可以喝汽水的次数加1cup; //瓶子数加1if (cup 2) //如果瓶子…

cuda基础教程(一)

文章目录 0. CURA Runtime API1. CUDA人工智能编程1.1. CUDA介绍1.2. 课程内容 2. 异构计算和并行计算2.1. 什么是并行计算2.2. 什么是异构计算 3. CUDA介绍3.1. GPU的性能指标3.2. 什么是CUDA3.3. 如何学习CUDA 4. 系统GPU查询5. Linux系统6. CUDA安装7. 查询GPU信息8. CUDA编…

故障诊断 | 一文解决,GRU门控循环单元故障诊断(Matlab)

文章目录 效果一览文章概述专栏介绍模型描述源码设计参考资料效果一览 文章概述 故障诊断 | 一文解决,GRU门控循环单元故障诊断(Matlab) 专栏介绍 订阅【故障诊断】专栏,不定期更新机器学习和深度学习在故障诊断中的应用;订阅

Java:搭建eladmin复习mvn、springboot、vue等

目录 1.源码平台后端&#xff1a; 2.源码平台前端&#xff1a; 3.操作系统&#xff1a;centos7.9 4.mysql:5.7.x 安装 5.redis:5.0.X 6.maven&#xff1a;3.8 7.java:1.8&#xff1a; 8.nodejs:16.x 9.通过mvn打包eladmin后端 10.npm打包前端项目进行部署 11.访问测试…

永磁同步电机速度环闭环控制

文章目录 1、速度环分析2、电机参数3、PI计算4、模型仿真4.1 模型总览4.2 实际转速与参考转速对比4.3 转矩波形4.4 相电流采样波形 模型下载地址&#xff1a; 链接: 速度闭环模型&#xff08;速度电流双闭环&#xff09; 1、速度环分析 2、电机参数 Udc24 V Rs0.6 LdLq1.4e-3…

二、人工智能之提示工程(Prompt Engineering)

黑8说 岁月如流水匆匆过&#xff0c;哭一哭笑一笑不用说。 黑8自那次和主任谈话后&#xff0c;对这个“妖怪”继续研究&#xff0c;开始学习OpenAI API&#xff01;关注到了提示工程(Prompt Engineering)的重要性&#xff0c;它包括明确的角色定义、自然语言理解&#xff08;…

Redis 布隆过滤器

布隆过滤器 这一篇文章主要是记录布隆过滤器的使用和认识 主要参考了如下的blog https://blog.csdn.net/weixin_42972832/article/details/131211665 他讲的还不错 简单的来说,布隆过滤器,实际上就像是一个集合,拿redis的key来举例来说,布隆过滤器的设置就是去过滤不属于redi…

mybatisplus-多数据源配置

1. 流程 pom文件yml配置多数据源具体服务添加注解DS(“***”) 1.pom文件 <!--mybatis plus 起步依赖--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.0</vers…

VS之调用程序对DLL中全局变量的使用

接上篇《VS生成C动态链接库DLL》&#xff0c;能够生成DLL&#xff0c;且能调用后&#xff0c;遇到一个问题&#xff0c;即在DLL程序中定义了一些全局变量&#xff0c;应用程序需要使用&#xff0c;本以为可以直接使用&#xff0c;没想到&#xff0c;还是需要设置才可以&#xf…

【Node.js基础】Node.js的介绍与安装

文章目录 前言一、什么是Node.js&#xff1f;二、安装Node.js2.1 Windows系统2.2 macOS系统2.3 Linux系统 三、运行js代码总结 前言 随着互联网技术的不断发展&#xff0c;构建高性能、实时应用的需求日益增长。Node.js作为一种服务器端运行时环境&#xff0c;以其事件驱动、非…

leetcode-704.二分查找

题目 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], target 9输出: 4 解释: 9 …

05MARL经典算法 基于联合动作价值函数

文章目录 前言一、动态规划值迭代算法二、TD差分联合动作学习1.Nash Q-learning2.Correlated Q-Learning 三、JAL的限制总结 前言 用于记录MARL当中的经典算法 基础的MARL算法有三种类型&#xff1a;学习联合动作价值函数、学习智能体的显示模型根据过去的动作预测未来的动作、…

uniapp瀑布流实现

1. 图片瀑布流&#xff1a; 不依赖任何插件&#xff0c;复制即可见效&#xff1a; <template><view class"page"><view class"left" ref"left"><image class"image" v-for"(item,i) in leftList" :k…