数据结构复习
前言
写这篇文章的目的呢,主要是当做笔记了,现在都已经大二了数据结构与算法还是比较薄弱,感觉都不能叫菜了(哭,所以就写一篇相当于知识体系的博客吧,内容非常的基础,没什么亮点,也没什么看的价值。
首先我们理一理这个数据结构,从大一开始我们就知道什么栈啊表啊什么的,那在这我们做一个简单的总结吧,简单数据结构首先可以分为表栈队树图,当然我知道这么分很垃,但是总体上大概可以看成这几类,那我们就一种一种来看。
表
首先看表,表这种数据结构很直观,先进先出,也很好理解,这里就记录一下各种不同的表以及实现方式。
顺序表
首先我们先分配出一个数据结构
|
顺序表的存储方式如下,它的特点是只要索引正确,可以立即找到相对应的数值,对比有指针的那位….另外,第i个元素的值为L,elem[i-1],这个细节留意一下。
bool InitList(SqList &L) //构造一个空的顺序表L |
def __init__(self,size): # initialization |
插,删,找
任何一个数据结构都会具备基本的增删改查功能,取值和查找基本相同就不赘述了,这里讲讲插入和删除,首先在顺序表中第i个位置之前插入一个元素e,需要从最后一个元素开始,后移一位,…,直到把第i个元素也后移一位,然后把e放入第i个位置。
bool ListInsert_Sq(SqList &L,int i,int e) |
def addnum(self,value,index): |
而在顺序表中删除第i个元素,需要把该元素暂存到变量e,然后从i+1个元素开始前移,…,直到把第n个元素也前移一位,即可完成删除操作。
bool ListDelete_Sq(SqList &L,int i,int &e) |
def deletenum(self,index): |
链表
链表呢就是有指针的表了,它像链条一样链接起各个元素,特点是插入和删除数据十分方便,但是寻找和读取数据能力欠佳。
单链表
单链表的图示图下:
每一个单独结构可以分成两部分,数据部分和指针部分(也有表达为数据域和指针域的),
首先定义结构以及初始化,初始化的步骤呢就是先无中生有一个头节点,将他的指针域指向空即可。
typedef struct Lnode |
创建单链表
修改指针的顺序原则:先修改没有指针标记的那一端。
头(前)插法
这个呢代表着新的结构体是从头节点后面插入的,且每次插入都是从头节点插入,所以依次插入之后呢,结果会和插入的顺序相反,比如输入的序列是:1,2,3,4,那么实际生成的单链表是4->3->2->1。这里注意头节点是没有数据的噢~
void CreateList_H(LinkList &L)//前插法创建单链表 |
尾插法
尾插法就是指每次插入都从最后一个结构后面插入,插入完毕后修改尾指针指向。
void CreateList_R(LinkList &L)//尾插法创建单链表 |
取值,查找
单链表的取值不可以像顺序表一样直接找到任意一个元素,它只能从第一个节点开始往后依次找,一直找到第n个节点。而查找的话,可以定义一个p指针指向第一个元素节点并比较节点的数据域是否等于value。
bool GetElem_L(LinkList L,int i,int &e)//单链表的取值 |
树
二叉树,树,森林间的转换
树转二叉树
- 树所有相邻兄弟节点之间加虚线
- 树中每个节点只保留与长子(左孩子)的连线,删除与其他孩子的连线
- 以跟节点为轴心,整棵树顺时针转45°。
森林转二叉树
- 每棵树转二叉树
- 第一棵二叉树不动,第二棵树开始,依次把后一棵二叉树的根节点作为前一棵二叉树根节点的右孩子节点,直到所有二叉树连接在一起
二叉树还原成树
- 若某结点是其双亲的左孩子,则把该结点的右孩子、右孩子的右孩子等都与该结点的双亲结点用连线连起来
- 删除原二叉树中所有双亲结点与右孩子结点之间的连线
- 整理
二叉树还原成森林
- 切开根节点右链上所有“双亲-右孩子”的关系,分为若干二叉树
- 将这些二叉树还原为树
图
图分为节点结构和图结构,节点结构包括一条边的起点,终点和边的权重,图结构包括整个图的边数,节点数以及节点的集合。
typedef struct Node{ |
初始化和构建图
int initList(Graph &G){ |
到这里一个完整的图就构建完毕了,关于图的算法有挺多,仍在摸索ing……
参考文章:文中部分图片出自:https://blog.csdn.net/kindoms214/article/details/85699598
标记:持续施工中……