数据结构学习笔记

学习数据结构的目的:针对不同的情况使用不同数据结构,去解决不同的问题

一、线性表

线性表一般有几个函数/(宏定义):

  • 初始化线性表 List_Init()/List_Create()
  • 返回第K元素的数据值 List_getElementData()
  • 返回线性表长度 List_getLength()
  • 插入一个元素到线性表 List_insertData()
  • 删除指定为序第i个元素 List_deleteData()

Tip : 这些操作函数/(宏定义)首先要检验,形参的合法性

利用数组的连续存储空间顺序存放线性表的各个元素

  • 物理上存储空间连续、内存节省空间
  • 初始化、申请数组空间
  • 用过数组访问返回元素的数据值
  • 通过sizeof()和数组类型来获取长度,或者用宏定义来控制
  • 插入元素后,其他后面的元素也要向后移动!!
  • 删除元素后,其他后面的元素也要向前移动!!

利用链表实现数据存储

  • 初始化、申请数组空间
  • 用过数组访问返回元素的数据值
  • 插入和删除、不需要移动数据的元素,只需要修改“链”!!

链表种类
1、单链表
数据结构学习------笔记
2、双向链表
数据结构学习------笔记

二、堆栈

堆栈:可以用链式(Top是链表头)、数组等方式实现堆栈
1、数据出口和入口是同一个
2、数据入栈和出栈特点:先进后出(FILO)
3、需要两个指针分别指向栈顶和栈底的元素

数据结构学习------笔记
一般有几个操作集/(宏定义)

  • 初始化空堆栈、并设置长度位stackMaxSize Stack_Init()/Stack_Create()
  • 判断堆栈S是否已经满了 Stack_isFull()
  • 将数据入栈 ,加入栈顶元素 Stack_pushData()
  • 将数据出栈 ,返回栈顶元素 Stack_popData()
  • 判断堆栈是否为空 Stack_isEmpty()

堆栈表达式求值中缀表达式 -->> 后缀表达式

2+9/3-5 -->> 2 9 3/ + 5 -

当表达式中出现有 ( ) 括号或者 [ ] 中括号时候
算法思路:
(1)初始化一个栈大小为Stack_maxSize
(2)若是出现右括号,则栈中元素不断出栈并进行运算,直至出栈元素为左括号
(3)若果是左括号的话,则压入栈中
(4)若是所有元素都出栈还是匹配不到(左、右)括号

三、队列

队列:顺序存储(数组)/链式存储(链表),受约束的线性表

  • 插入与删除操作:加入元素只能在一端,删除元素只能在另一端
  • 先进先出(先来先服务)(FIFO)
  • 两个指针指向队列头(font)和尾部(rear)
    数据结构学习------笔记
    操作集
    1、创建队列 Queue_Create()
    2、加入队列 Queue_addElement()
    3、删除队列 Queue_delElement()
    4、判断队列是否满了 Queue_isFull()
    5、判断队列是否为空 Queue_isEmty()

四、查找
在某些数据类型中经常要经行查找的操作
查找:根据某个给定关键字K,从集合R中找出关键字与K相同的记录

静态查找:集合的记录固定不变

  • 没有插入与删除、只有查找
    动态查找:集合的记录动态变化
  • 除了查找、集合有插入和删除

顺序查找
1、查找出固定元素后退出
2、查找不出来,到了数组边界时候退出
3、建立一个//哨兵//,就是第一个元素赋值是自己要找的元素。

  • 如果返回值是第一个,没找到元素
  • 返回值不是第一个,找到元素并返回位置

二分查找
1、要求n个数据的集合,必须有序排列(有序比如:从小到大 )
查找范围:
3 22 243 244 255 266 455 677 744 844
1 2 3 4 5 6 7 8 9 10
取中间值,进行比较,当两个指针分别是左边的和右边的相反位置时候,找不到

五、树

1、结点的度(Degree):结点的子树个数
2、树的度:树的所有结点中最大的度数
3、叶结点:度为0的结点
4、父结点:
5、子结点:
6、兄弟结点:具有同一父结点的各结点彼此时兄弟结点
7、路径和长度:

二叉树

  • 树中所有结点的度不大于2的树
  • 一个二叉树第i层最大结点数有2的i-1次方,i≥1
  • 深度为K的二叉树有最大结点总数为:2的K次方 减1,K≥1

二叉树操作集
1、判断二叉树是否为空 Tree_IsEmpty()
2、遍历,按某顺序访问每个结点 Tree_goTraversal()
3、创建一个二叉树 Tree_goCreateBinTree()

特殊二叉树:斜二叉树、完全二叉树、完美二叉树、满二叉树

常用的遍历方法有
void PreOrderTraversal() 先序遍历 – 根、左子树、右子树
void InOrderTraversal() 中序遍历 – 左子树、根、右子树
void PostOrderTraversal() 后序遍历 – 左子树、右子树、根
void LevelOrderTraversal() 层次遍 历 – 从上到下、从左到右

二叉树的存储结构
1、顺序存储结构(数组)

利用数组存储完全二叉树(仅限于完全二叉树,可以补齐成一个完全二叉树)

  • 非根结点的父节点的序号是[ i / 2 ]
  • 结点的左孩子结点的序号是[ 2i ]
  • 结点的右孩子结点的序号是[ 2i + 1 ]

2、链表存储

更新未完…

相关文章: