2.3单链表的基本使用及其cpp示例

2.3线性表的链式表现与实现

2.3.1.1单链表
【特点:
*用一组任意的存储单元存储线性表的数据元素
*利用指针实现用不同相邻的存储单元存放逻辑上相邻的元素
*每个元素ai,除存储本身信息外,还存储其直接后继的元素(后一个元素的地址)
*结点:数据元素ai的存储映像
{数据域:数据元素本身
指针域:指示直接后继的存储位置

【头指针、头结点、第一个元素结点
*头指针:以线性表的第一个数据元素a1的存数地址作为线性表的地址,称为线性表的头指针

*头结点:为了操作方便,在第一个结点前虚加一个“头结点”,指向头结点的指针为链表的头指针(相当于第一个呀元素的结点)

代码:

typedef struct LNode{ElemType data;struct LNode*next;
}LNode,*LinkList    //LNode是结构体的别名,LinkList为指针变量
//相当于:typedef LNode *LinkList

2.3.1.2 单链表存储结构实现

格式: data | next

【p指向数据域
(*p).data=10;
或:p->data=10; //表示p指向结点的数据域

(*p).next=10
或 p->next //表示p指向结点的指针域

*生成一个LNode型新结点:
p=(LinkList)malloc(sizeof(LNode));

*系统回收p的结点
free(p)

*单链表特点:
1)是它是一种动态结构,整个存储空间为多个链表共用
2)不需预先分配空间
3)指针占用额外存储空间
4)不能随机存取,查找速度慢

【基本操作:
1)GetElem(L,i,&e) //第i个元素用e带回结果
2)ListInsert(&L,i,e) //插入
3)ListDelete(&L,i,e) //删除
4)CreateList_L(&L,n) //创建线性表

2.3.1.3单链表的查找

【操作:
1)GetElem(L,i,&e)

【基本思想:
1)令p为指针变量,首先指向第一个结点,变量 j为计数器
2)依次向后查找,循环结束条件:p为空或j>=i;
3)找到用e返回第i个值

【代码:


Status GetElem_L(LinkList L,int i,ElemType&e)
{  //L是链表的头指针(对带头结点的链表),以e返回dii个值
p=L->next;
j=1;while (p&&j<i)
{p=p->next;  ++j;if(!p||j>i)return ERROR;e=p->data;  //取第i个值
return OK;
}

2.3.1.4单链表的插入操作

2)ListInsert(&L,i,e)
在线性表第i个元素之前插入一个元素e

【思路:在第i项的前加一个接结点,i-1项的地址域和e的数据域连接


int ListInsert_L(LinkList&L,int i,int e)
{
LNode*p,*s;int j;   //或:LinkList p,s;    等同
p=L;j=0; //计数器
while(p&&j<i-1)
{p=p->next;++j;}
if(!p||j>i-1)
return ERROR;
s=LinkList()malloc(sizeof(LNode)); //新结点
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}

2.3.1.5 单链表的删除

【思路:删除第i个元素,并保存到元素e中

【代码:

int ListDelete_L(LinkList&L,int i,ElemType&e)
{
LNode*p,*q;int j;
p=L;j=0;
while(p->next||j<i-1)       //????我觉得应该是(!p||j>i-1)
{p=p->next;++j}
if(p->next==NULL||j>i-1)
return ERROR;    //删除位置不合理
q=p->next;  //q指向被删除结点
p->next=q->next;  //
e=q->data;   //取出第i个结点的数据域
free(q);    // 释放dii个结点的内存
return OK;
}   

2.3.1.6单链表的建立

【头插法建立有头结点的单链表

【图】
L=(Linklist)malloc(sizeof(LNode)) //sizeof后面跟数据类型(LNode)
L->next=NULL

【图】
p=(LinkList)malloc(sizeof(LNode))
scanf("%f",&(p->data)); //

【整个代码:

void CreateList_L(LinkList &L,int n)
{
LNode*p;int i;
L=(LinkList)malloc(sizeof(Lnode));
L->next=NULL;
for(i=n;i>0;--i)
{ p=(Listlink)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=L->next;
l->next=p     //这里的=都可以理解为“给了,到,指向”
}
}

2.3.1.7有序单链表的合并

例:线性表LA和LB中数据元素按照废帝剑有序排列,将LA和LB合并为一个新的LC,且LC中的数据元素仍按照递减有序排列

在这里插入图片描述
【代码:


void MergeList_L(LinkList&La,LinkList&Lb,LinkList&Lc)
{// 归并La和Lb得到Lc,Lc也按照降序排列
LinkList pa,pb,pc;
pa=La->next;pb=Lb->next;
Lc=pc=La;  //用La的头结点作为Lc的头结点
while(pa&&pb)
{
if(pa->data<=pb->data)
{
pc->next=pa; pc=pa;pa=pa->next;
}
else
{
pc->next=pb;pc=pb;pb=pb->next;
}
pc->next=pa?pa:pb;  //若a不为空则指向pa,否则指向pb
free(Lb);
}

2.3.1.8静态链表

定义:用数组描述的链表叫静态链表

目的:为在不设指针类型的高级程序语言中使用链表结构

存储结构:

#define MAXSIZE 100 //静态链表最大长度
typedef struct{
ElemType data;
int cur;  //游标,代替指针的结点,表示数组中的位置
}component,SLinkList[MAXSIZE]

在这里插入图片描述

2.3.2循环链表

循环链表是单链表的变形

循环链表最后一个结点link指针部位NULL,而是指向表的前端

为简化操作,在循环链表往往插入头结点

特点:
只要知道表中一结点的地址,就可以搜索到所有其他结点的地址

操作的时间复杂度:
表尾插入,时间复杂度:O(1)
表尾删除:O(n)
表头插入,同表尾
表头删除:O(1)

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

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

相关文章

TVM:简介

TVM&#xff1a;简介概述 Apache TVM 是一个用于 CPU、GPU 和机器学习加速器的开源机器学习编译器框架。它旨在使机器学习工程师能够在任何硬件后端上高效地优化和运行计算。本教程的目的是通过定义和演示关键概念&#xff0c;引导您了解 TVM 的所有主要功能。新用户应该能够从…

2.3.3单链表的双向链表

2.3.3双向链表 插入、删除 指在前驱和后驱方向都能游历&#xff08;遍历&#xff09;的线性链表 双向链表的每个结点有两个指针域 【结构】&#xff1a;prior data next 双链表通常采用带头结点的循环链表形式 可理解为首位相接的数据“圈”&#xff0c;每个结点都可以向前…

nvidia-smi 命令详解

nvidia-smi 命令详解 简介 nvidia-smi - NVIDIA System Management Interface program nvidia smi&#xff08;也称为NVSMI&#xff09;为来自 Fermi 和更高体系结构系列的 nvidia Tesla、Quadro、GRID 和 GeForce 设备提供监控和管理功能。GeForce Titan系列设备支持大多数…

2.4一元多项式的表示及相加,含cpp算法

2.4一元多项式的表示及相加 n阶多项式的表示&#xff1a; n阶多项式有n1项 指数按升幂排序 【 优点&#xff1a; 多项式的项数可以动态增长&#xff0c;不存在存储溢出的问题插入&#xff0c;删除方便&#xff0c;不移动元素 【表示&#xff1a; 有两个数据域&#xff0c;一…

TVM:使用Tensor Expression (TE)来处理算子

TVM&#xff1a;使用Tensor Expression (TE)来处理算子 在本教程中&#xff0c;我们将聚焦于在 TVM 中使用张量表达式&#xff08;TE&#xff09;来定义张量计算和实现循环优化。TE用纯函数语言描述张量计算&#xff08;即每个表达式都没有副作用&#xff09;。当在 TVM 的整体…

4-数据结构-串的学习

4.1串类型的定义 1.串&#xff1a;&#xff08;或字符串&#xff09; 串是由多个字符组成的有限序列&#xff0c;记作&#xff1a;S‘c1c2c3…cn’ (n>0) 其中S是串的名字&#xff0c;‘c1c2c3…cn’ 是串值 ci是串中字符 n是串的长度&#xff0c;表示字符的数目 空串&a…

Linux下rm误删恢复 extundelete

Linux下rm误删恢复 extundelete 误删之后要第一时间卸载&#xff08;umount&#xff09;该分区&#xff0c;或者以只读的方式来挂载&#xff08;mount&#xff09;该分区&#xff0c;否则覆写了谁也没办法恢复。如果误删除的是根分区&#xff0c;最好直接断电&#xff0c;进入…

5-数据结构-数组的学习

5.1数组的定义 定义&#xff1a; 由一组类型相同的数据元素构成的有序集合&#xff0c;每个数据元素称为一个数据元素&#xff08;简称元素&#xff09;&#xff0c;每个元素受n&#xff08;n>1&#xff09;个线性关系的约束&#xff0c;每个元素在n个线性关系中的序号i1、…

timm 视觉库中的 create_model 函数详解

timm 视觉库中的 create_model 函数详解 最近一年 Vision Transformer 及其相关改进的工作层出不穷&#xff0c;在他们开源的代码中&#xff0c;大部分都用到了这样一个库&#xff1a;timm。各位炼丹师应该已经想必已经对其无比熟悉了&#xff0c;本文将介绍其中最关键的函数之…

C--数据结构--树的学习

6.2.1二叉树的性质 1.二叉树 性质&#xff1a; 1.若二叉树的层次从1开始&#xff0c;则在二叉树的第i层最多有2^(i-1)个结点 2.深度为k的二叉树最多有2^k -1个结点 &#xff08;k>1&#xff09; 3.对任何一颗二叉树&#xff0c;如果其叶结点个数为n0,度为2的非叶结点个数…

TVM:使用 Schedule 模板和 AutoTVM 来优化算子

TVM&#xff1a;使用 Schedule 模板和 AutoTVM 来优化算子 在本文中&#xff0c;我们将介绍如何使用 TVM 张量表达式&#xff08;Tensor Expression&#xff0c;TE&#xff09;语言编写 Schedule 模板&#xff0c;AutoTVM 可以搜索通过这些模板找到最佳 Schedule。这个过程称为…

TVM:使用 Auto-scheduling 来优化算子

TVM&#xff1a;使用 Auto-scheduling 来优化算子 在本教程中&#xff0c;我们将展示 TVM 的 Auto-scheduling 功能如何在无需编写自定义模板的情况下找到最佳 schedule。 与基于模板的 AutoTVM 依赖手动模板定义搜索空间不同&#xff0c;auto-scheduler 不需要任何模板。 用…

C语言—sort函数比较大小的快捷使用--algorithm头文件下

sort函数 一般情况下要将一组数从的大到小排序或从小到大排序&#xff0c;要定义一个新的函数排序。 而我们也可以直接使用在函数下的sort函数&#xff0c;只需加上头文件&#xff1a; #include<algorithm> using namespace std;sort格式&#xff1a;sort(首元素地址&…

散列的使用

散列 散列简单来说&#xff1a;给N个正整数和M个负整数&#xff0c;问这M个数中的每个数是否在N中出现过。 比如&#xff1a;N&#xff1a;{1,2,3,4}&#xff0c;M{2,5,7}&#xff0c;其中M的2在N中出现过 对这个问题最直观的思路是&#xff1a;对M中每个欲查的值x&#xff0…

关于C++中的unordered_map和unordered_set不能直接以pair作为键名的问题

关于C中的unordered_map和unordered_set不能直接以pair作为键名的问题 在 C STL 中&#xff0c;不同于有序的 std::map 和 std::set 是基于红黑树实现的&#xff0c;std::unordered_map 和 std::unordered_set 是基于哈希实现的&#xff0c;在不要求容器内的键有序&#xff0c…

AI编译器与传统编译器的联系与区别

AI编译器与传统编译器的区别与联系 总结整理自知乎问题 针对神经网络的编译器和传统编译器的区别和联系是什么&#xff1f;。 文中提到的答主的知乎主页&#xff1a;金雪锋、杨军、蓝色、SunnyCase、贝壳与知了、工藤福尔摩 笔者本人理解 为了不用直接手写机器码&#xff0…

python学习1:注释\变量类型\转换函数\转义字符\运算符

python基础学习 与大多数语言不同&#xff0c;python最具特色的就是使用缩进来表示代码块&#xff0c;不需要使用大括号 {} 。缩进的空格数是可变的&#xff0c;但是同一个代码块的语句必须包含相同的缩进空格数。 &#xff08;一个tab4个空格&#xff09; Python语言中常见的…

Python、C++ lambda 表达式

Python、C lambda 表达式 lambda函数简介 匿名函数lambda&#xff1a;是指一类无需定义标识符&#xff08;函数名&#xff09;的函数或子程序。所谓匿名函数&#xff0c;通俗地说就是没有名字的函数&#xff0c;lambda函数没有名字&#xff0c;是一种简单的、在同一行中定义函…

python 学习2 /输入/ 输出 /列表 /字典

python基础学习第二天 输入输出 xinput("输入内容") print(x)input输出&#xff1a; eval :去掉字符串外围的引号&#xff0c;按照python的语法执行内容 aeval(12) print(a)eval输出样式&#xff1a; 列表 建立&#xff0c;添加&#xff0c;插入&#xff0c;删去…

Linux、Mac 命令行快捷键

Linux、Mac 命令行快捷键 Linux 命令行编辑快捷键&#xff0c;参考了好多个&#xff0c;应该算是比较全的了&#xff0c;Linux 和 Mac 的都有&#xff0c;笔者本人比较常用的也已经红色标出来了&#xff0c;如有错误或遗漏&#xff0c;欢迎留言指出。 光标移动及编辑&#xff…