首页 > 其他分享 >02专升本数据结构笔记 第二章:线性表

02专升本数据结构笔记 第二章:线性表

时间:2025-01-04 17:59:21浏览次数:3  
标签:02 结点 return 线性表 int 元素 next 专升本

专升本数据结构笔记 第二章:线性表

阿洛学长笔记 love ttz

线性表

任务一 线性表的定义和基本操作(阿洛学长)

一、线性表的定义

线性表是由n(n≥0)个类型相同的数据元素a1,a2,…,an组成的有限序列,数据元素之间是一对一的关系,记作
L=(a1, a2, …, ai-1, ai, ai+1, …, an)

(由n(n≥0)个类型相同的数据元素,组成的有限序列,数据元素之间是一对一的关系,为线性表)

可以理解为有序数组

二、线性表的基本操作

在这里插入图片描述

在这里插入图片描述

任务二 线性表的顺序存储结构(阿洛学长)

线性表的顺序存储是指,在内存中用一组地址连续的存储单元依次存储线性表中的各个数据元素。

采用顺序存储结构的线性表称为顺序表。

一、顺序表的结构特点

假设线性表中有n个数据元素,每个元素占用k个存储单元,其中第一个数据元素a1的存储地址称为线性表的起始位置或基地址,线性表的顺序存储结构如图2-1所示。

在这里插入图片描述

线性表的顺序存储结构是一种随机存取的存储结构。

若已知线性表的起始位置(基地址)和表中每个数据元素所占存储单元的大小k,就可以计算出线性表中任意一个数据元素的存储地址,这种存取元素的方法称为随机存取法

顺序表的存储结构通常用一维数组来描述,用C语言实现线性表的顺序存储结构的类型定义如下:

 #define c 100        //线性表的最大长度

typedef struct
{
ElemType elem [MAXSIZE];    //存储线性表中数据元素的数组
int length;            //线性表的当前长度
}SeqList;

也可以这样来定义: 
    typedef struct

{
ElemType *elem;        //线性表中数据元素的基地址
int length;            //线性表的当前长度
int listsize;            //当前为线性表分配的存储容量
}SeqList;

定义一个顺序表的方法有两种:

方法一:SeqList L,表示将L定义为SeqList类型的变量;

对表中数据元素进行操作应使用L.elem[i]

方法二:SeqList *L,表示将L定义为指向SeqList类型的指针。

对表中数据元素进行操作应使用L->elem[i]

二、顺序表的基本操作

1.初始化顺序表 (构造一个空的顺序表,并分配存储空间)

2.插入数据元素

3.删除数据元素

4.查找数据元素

1.初始化顺序表

初始化顺序表操作是指构造一个空的顺序表,并为其分配存储空间。

其算法描述如下:

 Status InitList (SqList *L)

{    //初始化顺序表
L -> elem = (ElemType *) malloc (MAXSIZE * sizeof (ElemType));
                                                              //分配存储空间
if (! L -> elem)  return OVERFLOW;    //存储空间分配失败
L -> length = 0;            //当前线性表长度为0
L -> listsize = LIST_MAX_SIZE;     //初始化存储容量
return TRUE; }
2.插入数据元素

在n元素和m元素中插入X 总长度为k

初始位置

序列: i i+1 … k

元素: n m … k

插入X后的位置

序列: i i+1 i+2 … k+1

元素: n x m … k+1

(元素往后退1)

在这里插入图片描述

算法描述如下:

  Status ListInsert (SqList *L, int i, ElemType e)

{int j;
if (i < 1 || i > L -> length + 1)
    return FALSE;            //i值不合法,出错处理
if (L -> length = L.listsize)        //当前存储空间满
    return OVERFLOW
for (j = L -> length – 1; j >= i - 1; j --)
    L -> elem [j + 1] = L -> elem[j];
                //第i个位置之后的元素依次向后移
L -> elem[i –1] = e;         //将e插入到第i个位置
L -> length ++;         //表长增1
return TRUE; }

在这里插入图片描述

n个元素移动1次,累计就n*1=n

3.删除数据元素

在n元素和m元素中删除n 总长度为k

初始位置

序列: i i+1 i+2 … k

元素: n x m … k

插入X后的位置

序列: i i+1 i+2 … k+1nc

元素:x m c… k+1

(元素往前加1)

在这里插入图片描述

算法描述如下:

    Status ListDelete (SqList *L, int i)

{//在顺序表L中删除第i个数据元素,其中1≤i≤L->length
int j;
if (i < 1 || i > L -> length)  return FALSE; //i值不合法,出错处理
for (j = i; j < L -> length; j ++)
    L -> elem[j - 1] = L -> elem[j];   
                  //第i个位置之后的元素依次向前移
L -> length --;           //表长减1
return TRUE; } 

在这里插入图片描述

n个元素移动1次,累计就n*1=n

4.查找数据元素

在顺序表中查找值为e的数据元素,并返回该元素在表中的位置。

方法:从第一个数据元素开始,依次将表中的元素与e进行比较,若相等,则返回该元素在表中的位置;否则,查找失败。

算法描述如下:

    int Locate (SqList L, ElemType e)

{//在顺序表中查找值为e的数据元素,查找成功,返回该元素的位置;否则返回0
for (i = 0; i < L.length; i ++)
  if (L.elem[i] == e)
     return i + 1;        //查找成功,返回序号
  return 0; }                              //查找失败,返回0

该算法的时间复杂度为O(n)n

所有元素都与查找元素e进行对比了一次,n*1=n

【例2-1】一个线性表L中的数据元素按升序排列,编写一个算法,实现在线性表中插入一个数据元素item,使得线性表仍然保持升序排列。

算法如下:

void Insert (SqList L, ElemType item)
{ int i;
  int j;
 if (item >= L.elem[L.length - 1]) //item值大于表中最大的数据元素
   L.elem[L.length] = item;     //将item插入到表尾
else{  i = 0;
  while (item >= L.elem[i])     //寻找item的插入位置i
   i ++;
   ListInsert (&L, i, item); }     //将item插入到位置i
   L.length ++; }                  //表长增1

任务三 线性表的链式存储结构 (阿洛学长)

一、单链表的结构特点

二、单链表的基本操作

三、静态链表及其基本操作

四、循环链表及其基本操作

五、双向链表及其基本操作

一、单链表的结构特点

数据域和指针域组成

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

二、单链表的基本操作

1.建立单链表

2.插入数据元素

3.删除数据元素

4.查找数据元素

5.求单链表的长度

1.建立单链表

在这里插入图片描述

     LinkList *Create (LinkList *L)

{//建立一个单链表,将新结点插入表尾
Node *r, *s;
ElemType c;
int i;
*L = (LinkList) malloc (sizeof(Node));    //为头结点分配存储空间
r = *L;                    //r初值指向头结点
for (i = 1; i <= n; i ++)
{READ (c);                //获取一个数据元素
s = (LinkList) malloc (sizeof(Node));    //生成一个新结点 
s -> data = c;        //将要插入数据元素的值赋给新结点的数据域
s -> next = NULL;            //链表末尾结点指针域为空
r -> next = s;                //将新结点插入到当前链表的表尾上
r = s;     }                 //r始终指向链表的当前表尾
return L; }

该算法的时间复杂度为O(n)

2.插入数据元素

在这里插入图片描述

    Status ListInsert (LinkList *L, int i, ElemType e)

{//在单链表L中第i个位置插入一个数据元素e
Node *p, *s;
int j = 0;
p = *L;
while (p != NULL && j < i - 1)
{//找到第i-1个结点
  p = p -> next;
  j ++; }
if (j != i - 1)    return FALSE;        //未找到插入位置,出错处理
s = (LinkList) malloc (sizeof (Node));//生成新结点
s -> data = e;        //将要插入数据元素的值赋给新结点的数据域
s -> next = p-> next;            //插入新结点
p -> next = s;
return TRUE; }

该算法的时间复杂度为O(n)

3.删除数据元素

在这里插入图片描述

Status ListDelete (LinkList *L, int i, ElemType *e)
{//删除单链表L中的第i个结点,并用e返回被删除的元素
Node *p, *r;
int j = 0;
p = *L;
while (p -> next != NULL && j < i - 1)
{//找到第i-1个结点
p = p -> next;
j ++; }
if (j != i - 1)  return FALSE;    //未找到要删除的结点,出错处理
r = p -> next;            //指针r指向要删除的结点
p -> next = p -> next -> next;    //删除结点r
*e = r -> data;        //将删除结点的值保存在e中
free (r);            //释放被删除结点所占的内存空间
return TRUE; }

该算法的时间复杂度为O(n)

4.查找数据元素
  LinkList GetElem (LinkList L, int i)

{//在单链表L中查找第i个结点,并返回该结点的指针
Node *p;
int j = 0;
p = L;            //指针p初值指向头结点
while ((p -> next != NULL) && (j < i))
{    //逐个结点扫描
  p = p -> next;        //指向下一个结点
  j ++; }                //已扫描过的结点数
return p; }             //返回第i个结点

算法的时间复杂度为O(n)

(2)按值查找

查找单链表中值为e的结点,算法描述如下

    LinkList Locate (LinkList L, ElemType e)

{    //在单链表中查找值为e的结点,并返回该结点的指针
    Node *p;
    p = L -> next;        //指针p初值指向表中第1个结点
    while ((p != NULL) && (p -> data != e))    
          //从表中第1个结点开始逐个比较
        p = p -> next;
    return p; }         //返回值为e的结点
5.求单链表的长度
  int ListLength (LinkList L)
{    //返回单链表的长度
    Node *p;
    int j = 0;        //用来保存单链表的长度
    p = L -> next;        //指针p初值指向表中第1个结点
    while (p != NULL)    //用指针p依次指向表中各个结点
    { p = p -> next;
       j ++; }
    return j; }         //返回单链表的长度
三、静态链表及其基本操作

1.初始化静态链表

2.分配结点

3.回收结点

1.初始化静态链表

在这里插入图片描述

2.分配结点

在这里插入图片描述

3.回收结点

在这里插入图片描述

四、循环链表及其基本操作

将表中最后一个结点的指针域指向头结点,从而形成一个首尾相接的链表,称为循环链表。

在这里插入图片描述

所有结点被链接到一个环上,从循环链表中任一结点出发均可找到表中其他结点。

在这里插入图片描述

五、双向链表及其基本操作

1.插入数据元素

2.删除数据元素

1.插入数据元素

在这里插入图片描述

算法描述如下:

   Status DListInsert (DLinkList *L,int i, ElemType e)
{    //在双向循环链表L中第i个位置插入一个数据元素e
    DNode *s, *p
    if (! (p = GetElem (L, i)))  return FALSE; //插入位置不合法
    s = (DLinkList) malloc (sizeof (DNode) //生成新结点
    if (! s)    return FALSE;
    s -> data = e;        //将e赋给新结点的数据域
    s -> prior = p -> prior;    //新结点的前驱指向p结点的前驱
    p -> prior -> next = s;    //p结点前驱的后继指向新结点
    s -> next = p;        //新结点的后继指向p结点
    p -> prior = s;        //p结点的前驱指向新结点
    return TRUE; }
2.删除数据元素

在这里插入图片描述

算法描述如下:

  Status DListDelete (DLinkList *L,int i, ElemType *e)

{//删除双向链表L中的第i个结点
DNode *p
if (! (p = GetElem (L, i)))  return FALSE;//i值不合法
*e = p -> data;        //将要删除结点的值赋给e
p -> prior -> next = p -> next; //要删除结点前驱的后继指向其后继
p -> next -> prior = p -> prior; //要删除结点后继的前驱指向其前驱
free (p);            //释放p结点
return TRUE;
} 

标签:02,结点,return,线性表,int,元素,next,专升本
From: https://blog.csdn.net/lxttzlove/article/details/144902256

相关文章

  • 我的 2024 年度读书报告
    我的2024年度读书报告一、引言今天是2025年的第四天,回望2024,过去这一年我走得很艰辛、很漫长,但有时暮然回首,又好像就在昨天,时光就这样在不知不觉间悄然溜走了。这一年我读了不少书,并且有刻意在工作之余去看一些与专业无关的书,比如:心理学、经济学以及个人成长等类型的......
  • 2025最新超详细Pycharm安装配置完整教程!
    包含编程籽料、学习路线图、爬虫代码、安装包等!【点击领取】PyCharm的使用非常直观和便捷。它提供了代码编辑、运行、调试等功能,让你的Python编程更加高效。**你可以通过创建新的项目来管理你的代码。**在项目中,你可以创建Python文件,并编写你的代码。PyCharm会自动识别你......
  • 2024.12.27
    职业规划报告邵悦玲石家庄铁道大学,软件工程摘要:随着信息技术的迅猛发展,IT行业已经成为全球经济的重要支柱。越来越多的大学生进入这一行业,面临着技术更新速度快、竞争激烈等挑战。因此,制定一份清晰且务实的职业规划显得尤为重要。本报告通过分析当前IT就业环境,结合大学生在校期......
  • 2024.12.25
    软件企业人才需求与培养策略的研究邵悦玲石家庄铁道大学,软件工程摘要:随着信息技术的飞速发展,软件行业在全球经济中占据了越来越重要的位置。特别是在人工智能、大数据、云计算、区块链等技术的推动下,软件企业对于高端技术人才的需求呈现出爆发式增长。然而,由于技术更新换代的迅......
  • 2024.12.26
    软件企业产品技术管理:创新、挑战与优化策略邵悦玲石家庄铁道大学,软件工程摘要: 本文深入探讨软件企业产品技术管理的多方面内容。首先阐述软件企业产品技术管理的重要性,包括对企业竞争力和可持续发展的关键作用。接着详细分析产品技术管理涵盖的主要内容,如技术研发管理、技术应......
  • 20241403《计算机基础与程序设计》课程总结
    20241403《计算机基础与程序设计》课程总结每周作业链接汇总第一周作业:【内容概要】课程概论第二周作业:【内容概要】①数字化②信息安全③自学教材第三周作业:【内容概要】①掌握门和电路②学习计算机部件③了解冯·诺依曼体系结构④学习C语言基础知识,第四周作业:......
  • 学期(如2024-2025-1) 学号(如:20241300) 《计算机基础与程序设计》第X周学习总结
    20241303《计算机基础与程序设计》课程总结一.(按顺序)每周作业链接汇总第一周作业1.简要内容:①课程概论②工业革命与浪潮之巅③信息与信息安全④计算机系统概论⑤计算机安全⑥计算的限制⑦计算思维2.二维码第二周作业1.简要内容:①数字化②信息安全2.二维码第三周作业......
  • java饲料出售平台论文+源码 2025毕设
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容饲料出售平台研究相关内容一、研究背景随着畜牧业、渔业等相关产业的不断发展,饲料的需求日益增长。当前市场上饲料供应与需求之间的信息对接存在一定的障碍,......
  • java高校班主任班级管理系统论文+源码 2025毕设
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景在当今的高校教育环境中,随着高校规模的不断扩大和学生人数的日益增多,传统的班级管理方式面临着诸多挑战。高校班主任作为班级管理的核心人物,需要......
  • 2025/1/4 【双指针法】 卡码网54. 替换数字 知识点:str.isdigit()
    https://kamacoder.com/problempage.php?pid=1064双指针法,从后向前遍历: 借用一个list,从后向前遍历,碰到数字就换“number”存到对应索引上:defnumTostr(s:str):s_list=list(s)i=0forcharins:if'0'<=char<='9':s_list[i]=......