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

news/2024/11/28 13:46:24/

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

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

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

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

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

顺序表(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.ppmy.cn/news/96146.html

相关文章

S32K144开发板

目录 一&#xff0e;S32K144开发板概述 二&#xff0e;产品技术和功能规格 三&#xff0e;开发环境 1.S32K144的开发环境主流是这么三种&#xff1a; 2.开发板Demo工程 四&#xff0e;S32K144开发板实物图 五、汽车大灯硬件架构 一&#xff0e;S32K144开发板概述 S32K14…

canal server 标准化集群搭建(完结)

4.2. 创建 server 所属集群&#xff1a;选择刚才添加的 “集群名称” server 名称&#xff1a; server_1、server_2、server_3 依次类推 server ip&#xff1a;server 的 ip 地址 admin 端口&#xff1a;canal server 与 canal admin 的通信端口&#xff0c;非生产环境从 2…

数字图像和光学图像的区别?

如果您曾经尝试在走路时在手机上拍摄视频&#xff0c;您就会知道保持图像静止是很棘手的。有一些巧妙的技术旨在减少这种摇晃的凸轮效应&#xff0c;并且有两种不同的方法来实现它。 光学图像稳定来自静态摄影领域&#xff0c;使用镜头内部的复杂硬件机制来保持图像静止并实现…

SQLCMD的介绍

1 sqlcmd -S SERVERNAME -U USERNAME -P PASSWORD -i filename.sql 下面的内容是详细介绍sqlcmd的&#xff0c;有兴趣的朋友可以看看 因为公司的业务需要&#xff0c;所以采集了一个2W多条的数据&#xff0c;都是insert语句&#xff0c;生成一个200多M的数据&#xff0c;谁料在…

内外网隔离下,通过网关转发,来部署前后端分离的系统

前言 最近为某银行系统部署了一套商城系统&#xff0c;网络环境比较特别&#xff0c;思路记录下&#xff0c;其中商场系统使用前后端分离模式部署。 该银行网络环境&#xff1a; 外网服务器&#xff1a;外网可以访问到它&#xff0c;不能访问外网。 网关服务器&#xff1a;跟…

【算法证明 二】快速排序的时间复杂度分析

快速排序是一种分治算法。选取主元后&#xff0c;将数组使用 partition 算法根据主元分割成两半&#xff0c;再对两半分别进行排序。假设左半边数量为 q q q&#xff0c;则右半边数量为 n − q − 1 n-q-1 n−q−1。则由如下递归式&#xff0c;得到如下运行时间递归式&#x…

动力电池管理系统(BMS)

BMS技术 目录 BMS技术 一、BMS简介 二、BMS主要功能 1、参数检测 2、剩余电量&#xff08;SOC&#xff09;估计 3、充放电控制 4、热管理 5、均衡控制 6、故障诊断 7、信息监控 8、参数标定 9、CAN总线接口 三、BMS架构组成 1、BMS的拓扑架构 1、1集中式架构的B…

python 实现单链表

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