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

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

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

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

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

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

顺序表(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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

磐维数据库panweidb单节点服务器在centos7.9安装(研发环境)

一、系统环境优化 1.1 关闭SELINUX # 修改配置文件 cat /etc/selinux/config | grep -i SELINUX SELINUXdisabled# 关闭SELINUX setenforce 0 1.2 内核参数优化 vi /etc/sysctl.conf 添加# panweidb net.ipv4.tcp_max_tw_buckets 10000 net.ipv4.tcp_tw_reuse 1 net.ipv4.t…

ssm+springboot+java高校图书馆图书借阅座位预约管理系统系统

陕理工图书馆管理系统包括多个功能模块&#xff1a;图书类别管理模块、图书管理模块、读者管理模块、借阅管理模块、预约管理、推荐管理。管理员登入后&#xff0c;维护图书借阅的信息。本文介绍了使用Java技术开发陕理工图书馆管理系统的设计与实现过程&#xff0c;首先对实现…

【源码分析】【netty】FastThreadLocal 为什么快?

写在前面 接下来几篇文章&#xff0c;我们来聊一聊 netty 相关的。这里作者想先从 FastThreadLocal 开始说&#xff0c;而不是可能大家更熟悉的 reactor 啊&#xff0c;责任链设计啊&#xff0c;ByteBuf 啊&#xff0c;池化啊等等。不过虽然说 FastThreadLocal 熟知程度不如其…

2023年湖北建筑架子工报名流程?报名需要什么资料?考试一次过?

2023年湖北建筑架子工报名流程&#xff1f;报名需要什么资料&#xff1f;考试一次过&#xff1f; 建筑架子工证是建筑行业必备的证书之一&#xff0c;它是证明持有人可以在建筑工地上从事搭建脚手架、模板等施工工作的重要证明。启程别告诉你架子工的报名流程和资料。 百度搜一…

示范性微电子院校“抢人”,芯片赛道黄不了!

经常看到有同学问&#xff0c;“国内高校微电子专业最好的是哪所高校?”“想搞数字ic设计去哪所大学好呢&#xff1f;” 其实国内28所示范性微电子学院都是非常不错的选择。 2015年&#xff0c;九所示范性微电子院校名单公布&#xff0c;包括了清华大学、北京大学、复旦大学…

【7 Vue3 – Composition API】

1 认识Composition API Options API的弊端 setup函数 2 setup函数的参数 3 setup简单使用 1 注意不再有响应式数据 要做到响应式数据需要在数据定义时使用ref包装数据,并且在使用时,使用value解包 2 注意template要使用的数据或者函数,必须要return 返回才能被使用 <templa…

软考A计划-软件设计师笔记

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

MT4期货软件怎么使用?有哪些MT4期货软件使用知识?

现在MT4软件在投资市场上应用广泛&#xff0c;当然也包括期货交易市场&#xff0c;但有不少投资者不知道为什么一定要选择MT4期货软件&#xff0c;其实选择MT4期货软件的理由有很多&#xff0c;MT4作为一款交易软件&#xff0c;不仅能够为投资者提供准确的市场信息&#xff0c;…

02SpringCloud Nacos注册中心和配置中心与Sentinel服务熔断和流控

Nacos注册中心和配置中心 Nacos 是 Alibaba 开发的用于微服务管理的平台&#xff0c;核心功能&#xff1a;服务注册与发现和集中配置管理。 Nacos 作为服务注册发现组件&#xff0c;可以替换Spring Cloud 应用中传统的服务注册于发现组件&#xff0c;如&#xff1a;Eureka、C…

Ai作图可控性演进——从SD到MJ

背景 Ai作图从Diffusion模型开始&#xff0c;作图进入稳步发展快车道。然后用过diffusion系列作图的同学对产图稳定性&#xff0c;以及可控性都会颇有微词。diffusion系列作图方法在宏观层面上确实能够比较好的做出看上去还不错的图。然后当你细抠细节时候&#xff0c;发现这东…

如何在Windows 11更新后解决C盘已满的问题?

Windows 11比Windows 10需要占用C盘更多的空间&#xff0c;在升级到Windows 11后&#xff0c;如果升级后出现问题&#xff0c;安装程序可以帮你退回到Windows 10。无论怎样&#xff0c;在升级到Windows 11后&#xff0c;系统会自动制作以前的数据的副本&#xff0c;这会占用大量…

win7下java环境搭建以及jdk环境变量配置

很多人在搭建页游、手游时候经常遇到JAVA闪退&#xff0c;基本都是环境变量或者路径错误导致的。本章节主要讲解在win7系统环境下&#xff0c;java环境变量配置方法&#xff0c;java环境配置正确&#xff0c;才可以对apk程序进行反编译运行页游手游。其他操作系统环境变量大同小…

Mesh形变算法

前言&#xff1a; 作者正好因为动画、模拟仿真等等的重大需求需要预先研发离散形的模型Mesh的形变算法&#xff0c;并且要验证、研究适用的范围、特别是性能等等&#xff0c;摸着石头过河别喷&#xff0c;毕竟我主要是渲染、动画、引擎的对于计算几何、三维重建不是很熟悉&…

一体化医学影像平台PACS源码,影像存档与传输系统源码

PACS影像存档与传输系统源码 PACS即影像存档与传输系统&#xff0c;是医学影像、数字化图像技术、计算机技术和网络通讯技术相结合的产物&#xff0c;是处理各种医学影像信息的采集、存储、报告、输出、管理、查询的计算机应用程序。 是基于DICOM标准的医学影像管理系统&…

大龄、零基础,想转行做网络安全。怎样比较可行?这届粉丝可真难带

昨晚上真的给我气孕了。 对于一直以来对网络安全兴趣很大&#xff0c;想以此作为以后的职业方向的人群。 不用担心&#xff0c;你可以选择兼顾工作和学习&#xff0c;以步步为营的方式尝试转行到网络安全领域。 那么&#xff0c;网络安全到底要学些什么呢&#xff1f; &…

Kyligence 客户案例招商银行批发业务分析平台获评金融数字化最佳实践案例

近日&#xff0c;“2023 爱分析金融数字化最佳实践案例”评选结果正式揭晓。Kyligence 携手招商银行申报的“招商银行‘火眼’批发业务分析平台”项目经过领先性、案例创新性、应用成熟度、价值创造等维度综合评选&#xff0c;最终获评“金融数字化最佳实践案例”。 招商银行“…

c++输入输出文件操作stream

系列文章目录 C IO库 文章目录 系列文章目录前言一、文件IO概述coutcin其他istream类方法 文件输入和输出内核格式化总结 前言 一、文件IO 概述 c程序把输入和输出看作字节流。输入时&#xff0c;程序从输入流中抽取字节&#xff1a;输出时&#xff0c;程序将字节流插入到输…

进攻中型SUV,蔚来/小鹏的智能化「满配」能否撬动需求

251.29万辆&#xff0c;这是2022年中国市场&#xff08;不含进出口&#xff09;乘用车中型SUV交出的答卷&#xff0c;交付量仅次于紧凑型SUV&#xff0c;排名细分市场第二。在这份成绩单中&#xff0c;有几个数字特别醒目。 1、31.64万辆&#xff0c;这是排名这个细分市场交付量…

BFT 最前线 | 张一鸣成立个人基金;马斯克:AI是双刃剑;阿里首席安全科学家离职;卡内基梅隆究团队:解决农业虫卵问题的机器人

文 | BFT机器人 名人动态 CELEBRITY NEWS 01 字节跳动创始人张一鸣 在香港成立个人投资基金 在卸任CEO两年后&#xff0c;字节跳动创始人张一鸣在香港成立了一家个人投资基金。香港公司注册处网站显示&#xff0c;该基金名为Cool River Venture&#xff0c;性质是私人股份有限…

connect reset/timeout/reject 排查

异常排查 问题描述问题处理初步分析http配置即服务整体情况整体排查服务重启gcCPUJVM 暂存疑问点总结启动参数要配全监控体系健全科学使用jar包降配参数是参数得动态变 问题描述 最初出现的时候&#xff0c;是在每天的早上8-10这个时间范围内&#xff0c;服务A上的有一个接口时…