文章目录
绪论
-
数据类型:原子、结构、抽象数据类型
-
数据结构(3):逻辑结构:。存储结构:。算法:定义,实现。
-
数据对象:。数据元素:。数据项:。
-
复杂度:
线性表
顺序表:
- 定义
#静态分配
typedef struct{
ElemType data[MaxSize];
int length;
}SqList;
#动态分配(物理结构没有变化)
typedef struct{
ElemType *data;
int MaxSize,length;
}SeqList;
- 分配:(
vs
链表)
#c初始分配
L.data = (ElemType *)malloc(sizeof(ElemType)*InitSize);
#c++初始分配
L.data = new ElemType(InitSize);
- 插入(
≈
其他操作):判断(i合法,满)、操作
链表:
- 定义
typedef struct LNOde{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
- 单(双、循环)链表:
- 基操:
- 初始化链表:头插,尾插
栈和队列
栈:
- 定义
#顺序栈
typedef struct{
Elemtype data[MaxSize];
int top; 判断-1<=top<=MaxSize
}sqStack;
#链栈
typedef struct Linknode{ //和链表相似,简直是一模一样
ElemType data;
struct Linknode *next;
}*LiStack
- 操作:均在栈顶
- 应用:括号匹配,表达式求值,递归
队列:
- 定义
#顺序存储
typedef struct{
Elemtype data[MaxSize];
int front,rear; 空满:font+MaxSize-rear
}SqQueue;
#链式存储
typedef strcut{
ELemtype data;
strcut LinkNode *next;
}LinkNode;
typedef struct{
LinkNode *front,*rear; 从front出,从rear入
}LinkQueue;
- 应用:层次遍历,计算机系统
串和数组
-
串的数据元素:字符
-
存储:
#顺序
typedef struct{
char ch[MaxSize];
int length;
}SString;
#堆heap
typedef struct{
char *ch;
int length;
}HString;
#块链
-
基操:
-
模式匹配:暴力,KMP
**矩阵:**对称,三角,三对角,稀疏(三元组,十字链表)
广义表:
树与二叉树
二叉树:
- 特殊二叉树:满二叉树,完全二叉树,二叉排序树,平衡二叉树。n0=n2+1
- 存储
#顺序
index ---- a的孩子 2a和2a+1
#链式
typedef struct BiTNode{
Elemtype data;
struct BiTree *lchild,*rchild;
}BiTNode,*BiTree;
- 先中后遍历:递归实现,非递归(自己建立栈)
#先序:递归 PreOrder InOrder PostOrder
void PreOrder(BiTree T){
if(T!=NULL){
visit(T);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
#void InOrder2(BiTree T){
InitStack(S);BiTress p=T;
while(p||!IsEmpty(S)){
if(p){
Push(S,p);
p=p->lchild;
}
else{
Pop(S,p);visit(p);
p=p->rchild;
}
}
}
- 层次遍历:利用队列
void LevelOrder(BiTree T){
InitQueue(Q);BiTree p;
EnQueue(Q,T);
while(!IsEmpty(Q)){
DeQueue(Q,p);
visit(p);
if(p->lchild!=NULL) EnQueue(Q,p->lchild);
if(p->rchild!=NULL) EnQueue(Q,p->rchild);
}
}
- 有遍历序列构造二叉树
- 线索二叉树:(难,跳过)
#节点存储
typedef struct ThreadNode{
Elemtype data;
struct ThreadNode *lchild,*rchild;
int ltag,rtag;
}ThreadNode,*ThreadTree;
#中序
#二叉树线索化
void InThread(ThreadTree &p,ThreadTree &pre){
if(p!=NULL){
InThread(p->lchild,pre);
if(p->lchild){
p->lchild=pre;
p->ltag=1;
}
if(p->rchild&&pre!=NULL){
pre->rchild=p;
pre->rtag=1;
}
pre=p;
InThread(p->rchild,pre);
}
}
#建立
void CreateInThread(ThreadTree T){
if(T!=NULL){
InThread(T,pre);
pre->rchild=NULL;
pre->rtag=1;
}
}
- 中序线索二叉树遍历:第一个节点,最后一个节点(代码,第一开始就不懂了)
树、森林:
- 双亲表示法,孩子表示法,孩子兄弟表示法
#双亲表示
typedef struct{
Elemtype data;
int parent;
}PTNode; //定义节点
typedef struct{
PTNode nodes[MaxSize];
int n; //节点数目
}PTree; //定义树
typedef struct{
Elemtype data;
}
#孩子兄弟表示
typedef struct CSNode{
Elemtype data;
struct CSNode *firstchild,*nextsibling;
}CSNode,*CSTree;
- 树、森林与二叉树的转换
=================================================