数据结构

269 阅读5分钟

数据结构


线性表

线性表是具有相同数据类型的 n(n >= 0)个数据元素的有限序列。

  1. 顺序存储结构,称为顺序表

    • 在长度为n的线性表A的第i个位置插入一个新数据元素item
    • 删除长度为n的线性表A的第i个数据元素
    • 确定元素item在长度为n的线性表A中的位置
    • 删除表中出现的重复元素
    • 在线性表中元素进行排序
  2. 链式存储结构,称为线性链表或单链表,链接点的构造 | data | link |

    • 建立一个线性链表
    • 求线性链表的长度
    • 测试线性链表是否为空表
    • 确定元素item在线性链表中的位置
    • 在非空线性链表的第1个链接点前插入一个数据信息为item的链接点
    • 在非空线性链表的末尾插入一个数据信息为item的链接点
    • 在线性链表中由指针q指出的链接点后面插入一个数据信息为item的链接点
    • 在线性链表中第i个链接点后面插入一个数据信息为item的链接点
    • 在按值有序链接的线性链表中插入一个数据信息为item的链接点
    • 从非空线性链表中删除q所指的链接点
    • 销毁一个线性链表
    • 删除线性链表中数据域值为item的所有链接点
    • 逆转一个线性链表
    • 将两个非空线性链表链接成一个线性链表
    • 将两个按值有序链接的非空线性链表合并为一个按值有序链接的线性链表
    • 复制一个线性链表
    • 利用线性链表进行数据排序
  3. 循环链表

  4. 双向链表

    • 在带有头结点的双向循环链表中第1个数据域内容为x的结点右边插入一个数据信息为item的新结点
    • 从带有头结点的双向循环链表中删除第1个数据域内容为x的结点

数组

数组(Array)是有序的元素序列。

  1. 矩阵 对称矩阵,对角矩阵,稀疏矩阵(三元组表,转置算法)

    • Image.png

堆栈(先进后出)

堆栈是一种只允许在表的一端进行插入和删除操作的线性表。允许操作的一端称为栈顶,栈顶元素的位置由一个称为栈顶指针的变量(top)给出;另一端称为栈底。

  1. 顺序堆栈

    • 初始化一个堆栈 top = -1;
    • 测试堆栈是否为空 return top == -1;
    • 测试堆栈是否已满 return top == M-1;
    • 去当前栈顶元素
    • 插入(进栈)
    • 删除(出栈)
  2. 链式堆栈

    • 链接堆栈初始化 top = NULL;
    • 测试链接堆栈是否为空 return(top == NULL);
    • 取当前栈顶元素 item = top->data
    • 链接堆栈的插入
    • 链接堆栈的删除

队列(先进先出)

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

  1. 顺序队列

    • 初始化一个队列 front = -1; rear = -1;
    • 测试队列是否为空 return front == rear;
    • 取当前队头元素 item = QUEUE[front + 1];
    • 队列的插入(进队)
    • 队列的删除(出队)
  2. 循环队列(front=rear=0)

    • 循环队列是否为满 (rear + 1) % M == front
    • 循环队列是否为空 front == rear
    • 循环队列的插入
    • 循环队列的删除
  3. 链接队列

    • 初始链接队列 front = rear = NULL;
    • 测试链接队列是否为空 return front = NULL;
    • 取当前队头元素
    • 链接队列的插入
    • 链接队列的删除
    • 链接队列的销毁

广义表

广义表,又称列表,也是一种线性存储结构。

广义表中既可以存储不可再分的元素,也可以存储广义表

LS = (a1,a2,…,an)

其中,LS 代表广义表的名称,an 表示广义表存储的数据。广义表中每个 ai 既可以代表单个元素,也可以代表另一个广义表。

原子和子表:

通常,广义表中存储的单个元素称为 "原子",而存储的广义表称为 "子表"。

  • 求广义表的长度
  • 求广义表的深度
  • 复制广义表

多元多项式的表示

串的基本概念:

串(字符串): 是零个或多个字符组成的有限序列。记作: S=“a1a2a3…”,其中S是串名,ai(1≦i≦n)是单个,可以是字母、数字或其它字符。

串值: 双引号括起来的字符序列是串值。  

串长: 串中所包含的字符个数称为该串的长度。  

空串(空的字符串): 长度为零的串称为空串,它不包含任何字符。  

空格串(空白串): 构成串的所有字符都是空格的串称为空白串。注意:空串和空白串的不同,例如“ ”和“”分别表示长度为1的空白串和长度为0的空串。  

子串(substring): 串中任意个连续字符组成的子序列称为该串的子串,包含子串的串相应地称为主串。  

子串的序号: 将子串在主串中首次出现时的该子串的首字符对应在主串中的序号,称为子串在主串中的序号(或位置)。  

特别地,空串是任意串的子串,任意串是其自身的子串。  

串相等: 如果两个串的串值相等(相同),称这两个串相等。换言之,只有当两个串的长度相等,且各个对应位置的字符都相同时才相等。

串的基本操作:

  • 给串变量赋值
  • 测试一个串是否为空串
  • 测试两个串是否相等
  • 两串连接
  • 求串的长度
  • 求子串
  • 求子串在主串的位置
  • 串的替换
  • 串的赋值
  • 串的插入
  • 串的删除

串的存储结构:

  • 顺序存储结构
  • 链式存储结构

树与二叉树


树(tree)是包含 n (n >= 1) 个结点,条边的有穷集,其中:

(1)每个元素称为结点(node);

(2)有一个特定的结点被称为根结点或树根(root)。