单链表的基本操作实现:初始化、尾插法、头插法、输出单链表、求表长、按序号查找、按值查找、插入结点、删除结点。

1.参考学习博文(写的相当好的文章):

http://t.csdnimg.cn/AipNl

2.关于我的总结:

定义单链表:

typedef struct LNode
{Elemtype data;struct LNode* next;
}LNode;

data用来存放元素值,next用来指向后继结点,

typedef是自定义结构体,单链表的结点类型为LNode

typedef struct LNode{//单链表的结构定义int data;//定义int类型的数据域struct LNode *next; //定义指针域
}LNode,*linklist;

这个地方会出现两个让人比较迷的东西:结构指针LNode和linklist。本质上而言,这两种类型是等价的。通常用linklist说明指针变量,强调它是某个单链表的头指针变量,定义为linklist L,L表示头指针。LNode用来定义单链表中结点的指针,例如LNode *p,p为结点的指针变量,p也可以定义为头结点。但是在方法的编写时,这两种定义会混合使用,非常容易迷惑我们的思维。我都只使用LNode来定义。

                                                                                                出处:http://t.csdnimg.cn/AipNl

 3.关于我的疑问:

按序号查找元素时,元素的值,用e返回,为什么e要用引用型变量&e

int Getelem_L(LNode* L, int i, int &e)

4.实战代码:

#define _CRT_SECURE_NO_WARNINGS
typedef int Elemtype;
#define ERROR -1
#include<stdio.h>
#include <iostream>
using namespace std;//定义结构体储存俩个元素:data存放元素值,next指向后继节点。
typedef struct LNode
{Elemtype data;struct LNode* next;
}LNode;//初始化单链表
void InitList(LNode* & L)
{L = new LNode;L->next = NULL;
}//建立单链表
//头插法
//void CreateList_H(LNode*& L, int n)
//{
//	LNode* p;
//	for (int i = n; i > 0; --i)
//	{
//		p = new LNode;
//		cin >> p->data;
//		p->next = L->next;
//		L->next = p;
//	}
//}//尾插法
void CreateList_R(LNode*& L, int n)
{LNode* r = L,*p;for (int i = 0; i < n; ++i){p = new LNode;cin >> p->data;p->next = NULL;r->next = p;r = p;}
}//输出单链表
void DispList(LNode* L)
{LNode* p = L->next;printf("打印单链表:\n");while (p != NULL){printf("%d ", p->data);p = p->next;}printf("\n");
}//求单链表的长度
int ListLength_L(LNode* L)
{int  i = 0;LNode* p;p = L->next;while (p) {i++;p = p->next;}return i;
}//按序号查找单链表中的元素(从p=L->next依次扫描,j=1,p每次移动j加1,当j==i时,则找到)
int Getelem_L(LNode* L, int i, int &e)
{LNode *p = L->next;int j = 1;while (p && j < i){p = p->next;++j;}if (!p || j > i)return ERROR;e = p->data;return e;
}//按值查找(从第一个结点依次和e比较,找到返回位置或地址,未找到则返回0或NULL)
int LocateLem_L(LNode* L, int e)
{int i = 1;LNode* p = L->next;while (p && p->data != e){p = p->next;i++;}if (p == NULL)return(0);elsereturn i;
}//单链表的插入操作(在L中第i个元素之前插入e)
void ListInsert_L(LNode*& L, int i, int e)
{LNode* p = L;LNode* s;int j = 0;while (p && j < i - 1)  //查找到第i-1个元素{p = p->next;++j;}s = new LNode;   //创建新结点s,将data域置为es->data = e;s->next = p->next;//将新结点插入结点p之后p->next = s;
}//单链表的删除操作(找到p指向的a(i-1),保存ai,令p->next指向a(i+1),p->next=p->next->next,最后释放结点ai的空间)
void ListDelete_L(LNode*& L, int i, int& e)
{LNode* p = L;LNode* q;          //创建一个新结点q用来临时保存被删除的元素int j = 0;while (p->next && j < i - 1)  //查到第i-1个元素,p指向第i-1个元素{p = p->next;++j;}if (!(p->next) || j > i - 1)  //如果查不到第i-1个元素或者查的元素超过范围,则不进行接下来的操作return;q = p->next;      //q指向第i个元素p->next = q->next;   //p指向第i+1个元素e = q->data;      //e保存结点q的元素delete q;  //释放q的空间printf("删除的元素是:%d", e);
}int main()
{LNode* L;//初始化单链表InitList(L);//尾插法printf("please input five numbers\n");CreateList_R(L, 5);printf("-----------------------------------\n");//输出单链表DispList(L);printf("-----------------------------------\n");//求表长printf("单链表的长度为:%d\n", ListLength_L(L));printf("-----------------------------------\n");//按序号查找单链表中的元素printf("你要查找的元素序列是:");int i,e;cin >> i;printf("\n");printf("要查找的元素是:%d\n",Getelem_L(L, i, e));printf("-----------------------------------\n");//按值查找printf("请输入要查找的值:");cin >> e;printf("\n");printf("该元素的位置是:%d\n", LocateLem_L(L, e));printf("-----------------------------------\n");//插入结点int a=0 , b=0;printf("请输入要插入的位置:");cin >> a;printf("请输入要插入元素的值:");cin >> b;ListInsert_L(L, a, b);printf("\n");DispList(L);//输出单链表printf("-----------------------------------\n");//删除元素printf("请输入要删除的元素位置:\n");int c = 0,d=0;cin >> c;ListDelete_L(L, c,d);printf("\n");DispList(L);//输出单链表printf("-----------------------------------\n");
return 0;
}

5.实战效果演示(已跑代码,准确运行)

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

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

相关文章

【算法】反转链表

本题来源---《反转链表》 题目描述&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输…

前端怎样做权限控制的?

在做系统时&#xff0c;我们常常因为使用该系统或软件的用户不同&#xff0c;要给到不同角色不同的模块权限控制。那前端是怎样做权限控制的&#xff1f;下面我将为你提供一些实际操作的例子&#xff0c;帮助你更具体地理解如何实施系统权限控制。 例子1&#xff1a;基于角色的…

vue2+el-row制作一个无间距网格

:gutter"0"无间距 :span""总为24份&#xff0c;根据自身需要设置每个网格项的宽度 <div class"thirdTabs"><!-- 第一行 --><el-row :gutter"0" class"thirdTabs-row-1"><el-col :span"4" c…

医学图像三维重建与可视化系统 医学图像分割 区域增长

医学图像的三维重建与可视化&#xff0c;这是一个非常有趣且具有挑战性的课题&#xff01;在这样的项目中&#xff0c;可以探索不同的医学图像技术&#xff0c;比如MRI、CT扫描等&#xff0c;然后利用这些图像数据进行三维重建&#xff0c;并将其可视化以供医生或研究人员使用。…

C++中的继承与多态

一、继承&#xff1a; 1.什么是继承&#xff1f; 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象…

golang map总结

目录 概述 一、哈希表原理 哈希函数 哈希表和哈希函数的关系 哈希表的优势 哈希冲突 什么是哈希冲突 如何处理哈希冲突 链表法 开放寻址法 哈希表常见操作过程 存储数据 检索数据 删除数据 常用的哈希算法 哈希表的应用场景 二、golang map map的内部结构 h…

c++智能指针(4)-- shared_ptr

概述 场景一: 希望指向多个指针管理一片空间 unique_ptr它是不允许两个智能指针管理一片空间的&#xff0c;所以其禁止直接拷贝和赋值(转化为右值可以)。 auto_ptr虽然其允许我们多个智能指针管理一片空间&#xff0c;但是这样的操作对于auto_ptr来说是不安全的&#xff0c;因…

Docker Volume (存储卷)

什么是存储卷? 存储卷就是将宿主机的本地文件系统中存在的某个目录直接与容器内部的文件系统上的某一目录建立绑定关系。这就意味着&#xff0c;当我们在容器中的这个目录下写入数据时&#xff0c;容器会将其内容直接写入到宿主机上与此容器建立了绑定关系的目录。在宿主机上…

选课成绩管理系统

文章目录 员工管理系统一、项目演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目&#xff08;9.9&#xffe5;&#xff09; 员工管理系统 一、项目演示 课程管理系统 二、项目介绍 基于springbootvue的前后端分离选课成绩管理系统 该系统可做课程管理…

rpi-ws281x库测试介绍

彩色RGB灯测试-rpi-ws281x库使用 1 rpi-ws281x库介绍 rpi-ws281x 是一个针对 Raspberry Pi 的库&#xff0c;用于控制WS281X 系列 LED 灯带&#xff08;例如 WS2812B&#xff09;的颜色和亮度。它提供了一个 Python 接口&#xff0c;让你可以轻松地通过 Raspberry Pi 控制这些…

基础算法之二分算法

前言 本次博客&#xff0c;将要介绍二分算法的基本原理以及如何使用&#xff0c;深入浅出 二分可以针对整型以及浮点型接下来对其讲解希望对小白有所帮助吧 整型的二分法 一般要在一个数组中猜出一个数是否存在我们可以遍历一遍整个数组&#xff0c;判断是否存在&#xff0…

使用Windows11自带的WSL安装Ubuntu Linux系统教程

WSL介绍 WSL全称Windows Subsystem for Linux&#xff0c;它是Windows10带来的新特性&#xff0c;用于Windows系统上的Linux子系统。也就是说&#xff0c;可以在Windows系统中获取Linux系统&#xff0c;这个过程无需通过虚拟机&#xff0c;而是直连计算机硬件。 简而言之&#…

Linux--进程间的通信-命名管道

前文&#xff1a; Linux–进程间的通信-匿名管道 Linux–进程间的通信–进程池 命名管道的概念 命名管道是一种进程间通信&#xff08;IPC&#xff09;机制&#xff0c;运行不同进程之间进行可靠的、单向或双向的数据通信。 特点和作用&#xff1a; 跨平台性&#xff1a;在W…

ResNet最新变体!性能反超Transformer,模型准确率达98.42%

目前ResNet&#xff08;残差网络&#xff09;有两大主流创新思路&#xff1a;一是与其他技术或模型结合&#xff0c;比如前文讲到的ResNetTransformer&#xff1b;二是在原始设计的基础上进行改进。 尽管ResNet通过残差学习有效改善了深层网络的训练和性能&#xff0c;但同时它…

【LeetCode热题100】【堆】数据流的中位数

题目链接&#xff1a;295. 数据流的中位数 - 力扣&#xff08;LeetCode&#xff09; 不停插入元素要求找到每个状态的中位数&#xff0c;用两个堆&#xff0c;把中位数左边的数记为left&#xff0c;右边的数记为right&#xff0c;一个大顶堆记录小于等于中位数的left&#xff…

永磁同步电机无感FOC(扩展卡尔曼滤波EKF位置观测控制)

文章目录 1、前言2、扩展卡尔曼滤波器原理2.1 预测阶段&#xff08;时间更新阶段&#xff09;2.2 校正阶段&#xff08;状态更新阶段&#xff09; 3、永磁同步电机EKF的模型4、永磁同步电机EKF的无位置状态观测仿真4.1 核心模块&#xff08;在滑膜、龙伯格、磁链等观测器基础上…

数据库-Redis(10)

目录 46.Redis内存淘汰算法有哪些? 47.Redis内存用完了会发生什么? 48.Redis如何做内存优化?

三角洲期刊投稿发表论文

《三角洲》杂志是由国家新闻出版总署批准&#xff0c;南通市委宣传部主管&#xff0c;南通日报社、南通市文学艺术界联合会主办的正规文学类期刊。适用于发表高品质文学学术作品&#xff0c;科研机构的专家学者以及高等院校的师生等具有原创性的学术理论、工作实践、科研成果和…

openEuler-23.03下载

下载地址&#xff1a;openEuler下载 | 欧拉系统ISO镜像 | openEuler社区官网 下载版本&#xff1a;openEuler-23.03-x86_64-dvd.iso

H264标准协议基础3

参考博文 上一篇H264标准协议基础2 1.解码视频帧的poc计算 2.残差4x4 矩阵中的trailingones & numcoeff 2.1查表 trailingones 表达出尾部one(1,-1)系数的个数,按照zigzag扫描出(1,-1)个数,trailingones的最大为3; numcoeff 表达非零值系数的个数,最多为16个…