0
点赞
收藏
分享

微信扫一扫

数据结构DS

伊人幽梦 2022-03-26 阅读 85

文章目录

绪论

  • 数据类型:原子、结构、抽象数据类型

  • 数据结构(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;



  • 树、森林与二叉树的转换

=================================================

举报

相关推荐

0 条评论