数据结构线性表

简介: 数据结构线性表

存储结构

顺序存储结构(顺序表)

  • 概念:
    在逻辑上相邻的元素在物理上也相邻
  • 特点:1. 随机访问 2. 占用连续的存储空间 3.存储密度高 4. 插入删除不方便
  • 操作:

    1. 插入 :从目标位置开始,将元素向后移动一个位置,空出一个位置
    2. 删除:从目标位置开始,将后面的向前移动一个位置
    3. 查找:顺序遍历查找
    

链式存储结构(链表)

  • 链表的特点

    不支持随机访问
    节点存储空间的利用率相较于顺序表较低
    支持存储空间的动态分配
  • 单链表

    1. 判断是否为空:请添加图片描述
    2. 插入操作:
      请添加图片描述
    3. 删除一个节点:
p为待删除的节点的前一个节点
q=p->next;
p->next=p->next->next;
free(q);

  • 双链表

    在单链表的基础上添加一个指针域,指向当前节点的前驱,和循环链表可不一样,循环链表可以理解为一个圈。

  • 循环链表

    1. 循环单链表
      请添加图片描述
    2. 循环双链表、
      请添加图片描述
  • 静态链表
    静态链表是一个结构体数组:
    数组中每一个节点:data是数据,还有一个指针分量,指向下一个节点

==后进先出,先进后出,一端操作==

栈的存储结构

栈的顺序存储结构(顺序栈)

栈空:st.top==-1
栈满:st.top==maxSize-1

定义一个栈,并初始化:
int stack[maxSize]; int top =-1;

元素x进栈:
stack[++top]=x;

元素x出栈
x=stack[top--];

栈的链式存储结构(链式栈)

栈空:lst->next=NULL;

链栈的初始化代码:
lst=(LNode*)malloc(sizeof(LNode));
lst->next=NULL;

进栈:(头插法)
p->next=lst->next;lst->next=p;

出栈:
p=lst->next;x=p->data;lst->next=p->next;free(p);
  • 数学性质
    当n个元素以某种顺序进栈,并且可在任意时刻出栈,所得元素排列数目N:
    在这里插入图片描述

栈的应用

括号匹配问题

思路:
扫描这个表达式,遇到左括号入栈,遇到右括号判断栈顶元素是否为左括号,如果是左括号,则弹出左括号。一直扫描,如果最终栈空,则说明表达式的括号是匹配的,如果栈无法清空,则表示括号是不匹配的

后缀表达式

  1. 中缀表达式转后缀表达式:
    手算:

     1. 首先给中缀表达式的所有运算单位加上括号
     2. 把运算符号移动到对应的括号后,去掉括号
    
    机算:
    

    在这里插入图片描述
    优先级:* / 优先级相同

    1. 后缀表达式的计算:

队列

先进先出,后进后出,可进行插入的一端叫队尾,可进行删除的一端叫队头(出队在队首,入队在队尾)==

队列的存储结构

队列的顺序存储

实现思想:

用取模运算将存储空间在逻辑上变为环状
用静态数组存放队列元素
front指针指向队首元素的位置
rear指针指向队尾元素的 下一个位置

操作

初始化
rear==front

入队
rear=(rear+1)%maxsize

出队
front=(front+1)%maxsize

队长
(rear+maxsize-front)%maxsize

判断队列空or满

法一:
牺牲一个存储单元
满:(rear+1)%maxsize==front
空:rear==front

法二:
增加成员size
满:size==maxsize
空:size==0

法三:
增加成员tag
tag=0表示因为删除导致的rear==front
tag=1表示因为加入导致的rear==front
空:(rea==front)&&tag=0
满:(rear==front)&&tag=1

队列的链式存储

实现思想:

front指向头结点
rear指向队尾结点

操作

初始化
rear==front;front->next=null

判空
rear==front

判满:不会满

入队
加入队尾,rear->next=s;rear=s;

出队:删除链表头
注意要判断删除前是否只有一个元素
如果只有一个元素,删除之后rear==front
如果还有其他元素,直接free();

队列的应用

  • 树的层次遍历
  • 图的广度优先搜索
  • 缓冲区
  • FIFO页面替换算法
目录
相关文章
|
11天前
|
存储 算法 测试技术
【C++数据结构——线性表】求集合的并、交和差运算(头歌实践教学平台习题)【合集】
本任务要求编写程序求两个集合的并集、交集和差集。主要内容包括: 1. **单链表表示集合**:使用单链表存储集合元素,确保元素唯一且无序。 2. **求并集**:遍历两个集合,将所有不同元素加入新链表。 3. **求交集**:遍历集合A,检查元素是否在集合B中存在,若存在则加入结果链表。 4. **求差集**:遍历集合A,检查元素是否不在集合B中,若满足条件则加入结果链表。 通过C++代码实现上述操作,并提供测试用例验证结果。测试输入为两个集合的元素,输出为有序集合A、B,以及它们的并集、交集和差集。 示例测试输入: ``` a c e f a b d e h i ``` 预期输出:
35 7
|
11天前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
29 5
|
11天前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】顺序表的基本运算(头歌实践教学平台习题)【合集】
本文档介绍了线性表的基本运算任务,涵盖顺序表和链表的初始化、销毁、判定是否为空、求长度、输出、查找元素、插入和删除元素等内容。通过C++代码示例详细展示了每一步骤的具体实现方法,并提供了测试说明和通关代码。 主要内容包括: - **任务描述**:实现顺序表的基本运算。 - **相关知识**:介绍线性表的基本概念及操作,如初始化、销毁、判定是否为空表等。 - **具体操作**:详述顺序表和链表的初始化、求长度、输出、查找、插入和删除元素的方法,并附有代码示例。 - **测试说明**:提供测试输入和预期输出,确保代码正确性。 - **通关代码**:给出完整的C++代码实现,帮助完成任务。 文档
26 5
|
7月前
|
存储 C语言
数据结构中的线性表链式存储介绍及其基本操作
链式存储是线性表的一种重要存储方式,它通过节点和指针的结构,实现了灵活的动态存储管理。本文介绍了单向链表的基本操作,并提供了相应的C语言代码示例。理解和掌握链表的操作对学习和应用数据结构具有重要意义。希望这篇博客能帮助你更好地理解线性表的链式存储。
163 2
|
3月前
|
存储 Java
数据结构第二篇【关于java线性表(顺序表)的基本操作】
数据结构第二篇【关于java线性表(顺序表)的基本操作】
55 6
|
3月前
|
存储
【数据结构】线性表和顺序表
【数据结构】线性表和顺序表
35 1
|
2月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之王道第2.3章节之线性表精题汇总二(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
IKU达人之数据结构与算法系列学习×单双链表精题详解、数据结构、C++、排序算法、java 、动态规划 你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
7月前
|
算法
数据结构和算法学习记录——线性表之双向链表(上)-结点类型定义、初始化函数、创建新结点函数、尾插函数、打印函数、尾删函数
数据结构和算法学习记录——线性表之双向链表(上)-结点类型定义、初始化函数、创建新结点函数、尾插函数、打印函数、尾删函数
60 0
|
3月前
01(数据结构考研)线性表相关操作代码
01(数据结构考研)线性表相关操作代码
96 0
|
3月前
|
存储 C语言
数据结构之线性表的初始化及其操作
数据结构之线性表的初始化及其操作
58 0

热门文章

最新文章