数据结构与算法·第2章【线性表】

news2024/11/27 18:37:55

线性结构具有以下基本特征:

有唯一的一个被称为首元素(或头元素)的元素,没有直接前驱;有唯一的一个被称为尾元素(或尾节点)的元素,没有直接后继。

数据元素之间存在一对一的线性关系,即除首末元素外,每一个数据元素均只有一个直接前驱和一个直接后继。

线性结构的各个数据元素在逻辑上是线性排列的,即所有数据元素都排列在一条线段上,故称为线性结构。

线性表是以下数据结构的总称

顺序表(SqList)

非循环链表尾结点的指针域保持为NULL

基本操作

在这里插入图片描述
大概看看即可
其中ListInsert(&L,i,e)是插入到 i i i之前的位置
第一个元素的位置是i=1,最后一个元素的位置是L.length

结构体定义

在这里插入图片描述

其中,listsize是容量SqList总共能装多少个元素,length是有多少个元素

部分算法的具体实现

初始化
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
插入主要注意超限后,需要realloc

在这里插入图片描述
在这里插入图片描述
合并两条顺序表

链表(LinkList)

在这里插入图片描述
还是建议带上头结点头指针指向头结点
优点:

  • 链表第一个元素不用特殊处理
  • 空表不用特殊处理

结构体定义

typedef struct  LNode {
      ElemType      data;  // 数据域
      struct LNode   *next;  // 指针域
} LNode, *LinkList;  
LNode *head;     // 定义一个头结点指针
LinkList L = head;   // 定义一个链表L并将头结点指针赋给它

部分算法的具体实现

Status ListDelete_L(LinkList L, int i, ElemType &e) {
p = L;    j = 0;
while (p->next && j < i-1) {  p = p->next;   ++j; } // 寻找第 i 个结点,并令 p 指向其前趋
if  (!(p->next) || j > i-1) 
    return ERROR;  // 删除位置不合理
q = p->next;   p->next = q->next;  // 删除并释放结点
e = q->data;   free(q);
return OK;
}

注意 p − > n e x t p->next p>next为待删除元素,因为循环条件是 j < i − 1 j<i-1 j<i1

void CreateList_L(LinkList &L, int n) {
    // 逆序输入 n 个数据元素,建立带头结点的单链表
L = (LinkList) malloc (sizeof (LNode));
L->next = NULL;    // 先建立一个带头结点的单链表
for (i = n; i > 0; --i) {
  p = (LinkList) malloc (sizeof (LNode));//生成新结点
  scanf(&p->data);    // 输入元素值
    p->next = L->next; L->next = p; // 插入到表头
}
}

逆序插入早插的在后面
p − > n e x t = L − > n e x t p->next=L->next p>next=L>next

LinkList  CreateList_tail()
{  //用尾插法创建单链表,返回单链表的头指针
   char ch;
   LinkList head,r;// 头指针和尾指针
   ListNode *s;//工作指针
   head=(LinkList)malloc(sizeof(ListNode));//生成头结点
   head->next=NULL;
   r=head;//空表时尾指针也指向头结点
   ch=getchar();//读入第1个字符
   while(ch!='$')
   {  
       s=( ListNode*)malloc(sizeof(ListNode));//生成新结点
       s->data=ch;
       r->next=s;
       r=s;
       ch=getchar();
   }
    r->next=NULL;
    return head;
} 

尾指针插入

双向链表

循环链表——尾结点的后继指向头结点注意是头结点
对于双向链表来说:头节点的前驱指向尾结点,尾结点的后继指向头结点

结构体定义

typedef struct  DuLNode {
    ElemType         data;   // 数据域
    struct DuLNode   *prior;  // 指向前驱的指针域
    struct DuLNode  *next;  // 指向后继的指针域
} DuLNode, *DuLinkList;

静态链表

#define MAXSIZE   1000  //链表的最大长度
typedef struct {
    ElemType    data;
    int    cur;
}component, SLinkList [ MAXSIZE ];

分别是存储节点数据的 d a t a data data 和存储下一个节点在数组中下标的 c u r cur cur最后一个元素的cur为0,即最后一个元素的下一个结点是头结点

部分算法

int LocateElem_ SL ( SLinkList S, ElemType e )   {
     //在静态单链线性表L中查找第1个值为e的元素。若找到,则返回它在L中的位序,否则返回0。
     i=S[0].cur;      //i指示表中第一个结点
     while ( i && S[i].data!=e ) i = S[i].cur; //在表中顺链查找
     return i;
} // LocateElem_ SL

在这里插入图片描述

多项式

typedef struct {      // 项的表示
    float  coef;          // 系数
    int   expn;           // 指数
} term, ElemType;  

基本操作

在这里插入图片描述
在这里插入图片描述

具体实现

void AddPolyn (polynomial &Pa, polynomial &Pb) {
   ha = GetHead (Pa); hb = GetHead (Pb);  //ha和hb分别指向Pa和Pb的头结点
   qa = NextPos ( Pa, ha);  qb = NextPos ( Pb, hb); //pa和pb分别指向La和Lb中当前结点
   while ( qa && qb ){   // La和Lb均非空  
      a = GetCurElem ( qa ); b = GetCurElem ( qb );  //a和b为两表中当前比较元素
      switch (*cmp(a, b)) { 
      case -1: {       // 多项式PA中当前结点的指数值小     
         ha=qa; qa = NextPos ( Pa, qa); break; 
      case 0: {                            // 两者的指数值相等
        sum= a.coef + b.coef ;
        if ( sum != 0.0 ) {  //修改多项式PA中当前结点的系数值
            SetCurElem (qa, sum); ha=qa;}
        else { DelFirst (ha, qa);    FreeNode (qa);}//删除多项式PA中当前结点
            DelFirst(hb, qb); FreeNode(qb);  
            qb=NextPos( Pb, hb); qa = NextPos ( Pa, ha);  
            break;
       case 1: { //多项式PB中当前结点的指数值小
             DelFirst (hb, qb); InsFirst (ha, qb);
             qb =NextPos ( Pb, qb); 
             ha = NextPos ( Pa, qa);   break; 
         }
     }
     if (!ListEmpty (Pb))  Append (Pa, qb);//链接Pb中剩余结点
     FreeNode (hb);      // 释放Pb的头结点
} // AddPolyn

这个实现有点复杂的,可以好好看看

习题

2.19

已知线性表中的元素以值递增有序排列,并以单链表③作存储结构。试写一高效的算法,删除表中所有值大于 mink 且小于 maxk 的元素(若表中存在这样的元素)同时释放被删结点空间,并分析你的算法的时间复杂度(注意: mink maxk 是给定的两个参变量,它们的值可以和表中的元素相同,也可以不同)。

在这里插入图片描述

注意算法题,在一开始需要特判ERROR的情况
函数类型为Status

2.22

试写一算法,对单链表实现就地逆置。

在这里插入图片描述
这个算是比较基础的逆置算法,需要仔细看看,有些其他题也会用到类似算法

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

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

相关文章

python 实现单链表

链表 链表是一种在存储单元上非连续、非顺序的存储结构。数据元素的逻辑顺序是通过链表中的指针链接次序实现。 链表是由一系列的结点组成&#xff0c;结点可以在运行时动态生成。每个结点包含两部分&#xff1a;数据域与指针域。数据域存储数据元素&#xff0c;指针域存储下一…

Yapi内网部署[CentOS7]

mongo安装 # 下载MongoDB https://www.mongodb.com/try/download/community4.2.24 RedHat/CentOS7.0 tgz# 安装MongoDB mkdir -p /home/jpge/devp-tools/tools cd /home/jpge/devp-tools/tools wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.24.tgz…

线性代数:线性方程求解、矩阵的逆、线性组合、线性独立

本文参考www.deeplearningbook.org一书第二章2.3 Identity and Inverse Matrices 2.4 Linear Dependence and Span 本文围绕线性方程求解依次介绍矩阵的逆、线性组合、线性独立等线性代数的基础知识点。 一、线性方程 本文主要围绕求解线性方程展开&#xff0c;我们先把线性…

揭秘Redis持久化原理,探索fork与Copy-on-Write的魔法!

大家好&#xff0c;我是小米&#xff0c;今天我将和大家一起探索Redis持久化原理中的两个关键概念&#xff1a;fork和Copy-on-Write。这两个概念对于理解Redis的数据持久化机制至关重要。让我们一起来揭开这些技术的神秘面纱吧&#xff01; Redis持久化简介 在开始之前&#…

组合数学第四讲

Generating Function&#xff08;生成函数&#xff09; 这里是一个普通生成函数例子&#xff0c;生成函数一般适用于根据递推关系式求出比较复杂的通项公式的 关键点&#xff1a; 1.项可转换成G(x)-,因为生成函数规定是从0到∞的 2.,当|x|<1时&#xff0c;最终可收敛为。这里…

基础算法(六):回溯算法

前言 Hello大家好&#xff0c;停了半个多月算法学习的荔枝又变菜了&#xff0c;最近决定认认真真地重新学习回溯&#xff0c;无意间看到Carl哥的代码随想录&#xff0c;感动之余也是跟着一步步走&#xff0c;后悔上车晚了呜呜呜~~~。之前自己摸索确实有点难受&#xff0c;在这篇…

YUM安装LNMP架构配置命令与搭建论坛

LNMP架构配置命令与搭建论坛 LNMP简介安装须知安装 Nginx配置yum源yum安装nginx并查看版本号开启服务并且设为开机自启 安装 MySQL 5.7 (mariadb)移除软件包下载安装mysql安装MySQL报错问题解决方案&#xff1a; 开启服务并设为开机自启在日志文件中找出root用户的初始密码登录…

数据结构 --- 树

1、二叉树 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 每个结点最多有两棵子树&#xff0c;即二叉…

CAPL(vTESTStudio) - CAPL控制RS232继电器

目录 为什么要使用CAPL控制继电器? 一、RS232继电器选择 二、继电器通信协议

AList 一个支持多种存储的文件列表程序,使用 Gin 和 Solidjs。

一个支持多种存储&#xff0c;支持网页浏览和 WebDAV 的文件列表程序&#xff0c;由 gin 和 Solidjs 驱动。 特点 使用简单 AList 从一开始就设计为易于安装&#xff0c;并且可以在所有平台上使用。 多种存储 AList 支持多个存储提供商&#xff0c;包括本地存储、阿里云盘、O…

大数据治理入门系列:数据治理

在信息经济时代&#xff0c;数据是企业的一大关键资产。为了制定科学、有效、合理的决策&#xff0c;企业需要收集大量的数据并进行各种数据分析&#xff0c;为决策提供依据。在此过程中&#xff0c;收集数据的速度、数据的质量和可靠性、对数据的分析过程、合适的分析工具等&a…

三十四、数学知识——约数(试除法 + 约数个数 + 约数之和 + 欧几里得算法)

约数相关算法主要内容 一、基本思路1、定义2、试除法——求一个数的所有约数3、约数个数4、约数之和5、欧几里得算法——辗转相除法&#xff08;求解最大公约数&#xff09; 二、Java、C语言模板实现三、例题题解 一、基本思路 1、定义 约数&#xff1a; 约数是指一个数&…

利用百度API进行植物识别

植物识别_拍照识别植物-百度AI开放平台百度AI植物识别,支持识别超过2万种通用植物和近8千种花卉&#xff0c;接口返回植物的名称&#xff0c;并获取百科信息&#xff0c;适用于拍照识图类APP中https://ai.baidu.com/tech/imagerecognition/plant 偶然看到的&#xff0c;不过真…

STM32F103C8T6+2.4寸SPI TFT触摸屏代码+标准库 项目开发

目录 模块清单&#xff1a; 模块介绍&#xff1a; 1&#xff1a;STM32F103C8T6 2&#xff1a;2.4寸SPI TFT触摸屏 项目结果展示 2.4寸 TFT SPI显示触摸屏 2.4寸 SPI TFT 显示触摸屏代码下载链接&#xff1a; (1条消息) 2.4寸SPITFT显示触摸屏资源-CSDN文库 模块清单&#x…

Vue后台管理系统【附源码】

登录 – 完成 路由拦截 – 完成 商品管理&#xff08;增加、编辑、搜索、删除&#xff09; – 完成 角色管理&#xff08;增加、编辑、搜索、删除、权限管理&#xff09; – 完成 交易订单&#xff08;增加、编辑、搜索、删除&#xff09; – 完成 用户管理&#xff08;增加、编…

在Centos Stream 9上Docker的实操教程 - 实操准备篇

在Centos Stream 9上Docker的实操教程 - 实操准备篇 认识Docker准备Centos Stream 9安装Docker更新仓库绕不开的HelloWorld结语 认识Docker 什么都要实操了&#xff0c;你还不知道Docker是什么&#xff1f;网上关于Docker的介绍一搜一大把&#xff0c;博主就不必浪费时间去侃侃…

ESP32-OTA

文章目录 1. 什么是OTA&#xff1f;2. OTA的基本原理3. ESP32远程OTA步骤&#xff1a;3.1 将需要升级的程序放在该目录下3.2 启动HTTP服务器3.3 配置3.4 烧录程序3.5 上电测试ESP32端 4. 问题&#xff1a;5. 通过命令控制OTA6. 参考&#xff1a; 1. 什么是OTA&#xff1f; OTA…

如何用 GPT-4 帮你写游戏(以24点游戏举例)

目录 给我一个24点游戏 游戏规则 GPT给的代码 ​改进 再改进 最近呢掀起了一阵GPT-4的热潮&#xff0c;很多人都想用GPT-4&#xff0c;这里呢我就打一个广告&#xff08;嘿嘿&#xff09;&#xff0c;如果不知道国内如何使用GPT的&#xff0c;可以看看这个博客&#xff1a;G…

STC89C52+DHT20设计的环境温湿度检测仪

一、项目背景 本项目基于STC89C52单片机和DHT20温湿度传感器,实现了一款环境温湿度检测仪。通过传感器采集环境的温度和湿度数据,利用IIC接口的OLED显示屏显示出来,便于用户实时监测环境温湿度状态。 在现代社会,人们对环境温湿度的要求越来越高。无论是工作场所还是居住…