数据结构和算法

一、数据结构大致包含以下几种存储结构:

  • 线性表,还可细分为顺序表、链表、栈和队列; 
  • 树结构,包括普通树,二叉树,线索二叉树等; 
  • 图存储结构

二、线性表

1、顺序表的数据结构:一段连续的物理内存空间,插入数据时,空间不足需要 realloc()

typedef struct Table{
    int * head;
    int length;
    int size;
}table;

2、链表创建:可以有头结点,也可以不要头结点head。

         基本操作,包括对链表中数据的添加、删除、查找(遍历)和更改。

typedef struct Link{
    int  elem;
    struct Link *next;
}link;

3、静态链表:

typedef struct {
    int data;//数据域
    int cur;//游标,就是数组下标,表示直接后继元素所在数组中的位置
}component;

4、双向链表:单链表更适合 "从前往后" 找,而 "从后往前" 找并不是它的强项

typedef struct line{
    struct line * prior; //指向直接前趋
    int data;
    struct line * next; //指向直接后继
}line;

三、栈(Stack)和队列(Queue)

1、顺序栈和链栈

2、顺序队列和链式队列

四、字符串

1、串的模式匹配算法:判断两个串之间是否具有"主串与子串"关系的算法。有以下两种:
                    普通的模式匹配算法 BF 算法

                    快速模式匹配算法 KMP 算法

五、数组和广义表

1、稀疏矩阵的压缩存储:

2、三元组顺序表:

//矩阵的结构表示
typedef struct {
    triple data[number];//存储该矩阵中所有非0元素的三元组
    int n,m,num;//n和m分别记录矩阵的行数和列数,num记录矩阵中所有的非0元素的个数
}TSMatrix;

3、广义表(必须是链式存储结构):广义表存储的形式 LS = {1,{1,2,3}},广义表 LS 存储了一个原子 1 和子表 {1,2,3}。

//方式一:
typedef struct GLNode{
    int tag;//标志域
    union{
        char atom;//原子结点的值域
        struct{
            struct GLNode * hp,*tp;
        }ptr;//子表结点的指针域,hp指向表头;tp指向表尾
    };
}*Glist;

//方式二:
typedef struct GLNode{
    int tag;//标志域
    union{
        int atom;//原子结点的值域
        struct GLNode *hp;//子表结点的指针域,hp指向表头
    };
    struct GLNode * tp;//这里的tp相当于链表的next指针,用于指向下一个数据元素
}*Glist;

六、树

1、二叉树首先是有序树。分两种存储结构:

      顺序存储:只有完全二叉树才能是顺序存储结构
      链式存储:...

typedef struct BiTNode{
    TElemType data;//数据域
    struct BiTNode *lchild,*rchild;//左右孩子指针
    struct BiTNode *parent;
}BiTNode,*BiTree;

2、回溯算法,也即“试探法”:走不通就回退再走的方法就是回溯法。

七、图(Graph)

1、数据之间的关系有 3 种:

     "一对一":线性表;

    "一对多" :树

    "多对多":图

2、连通图:图中从一个顶点到达另一顶点,若存在至少一条路径,则称这两个顶点是连通着的。无向图中,如果任意两个顶点之间都能够连通,则称此无向图为连通图。

3、生成树:连通图中,由于任意两顶点之间可能含有多条通路,遍历连通图的方式有多种,往往一张连通图可能有多种不同的生成树与之对应。

4、普里姆算法(Prim算法)求最小生成树

     克鲁斯卡尔算法(Kruskal算法)求最小生成树

八、动态内存管理

九、查找算法

1、

十、排序算法

 

 

 

 

 

 

1、迭代器 :advance和distance的用法

    vector<int>::iterator it = vec.begin();
    vector<int>::iterator end = vec.end();
    cout<<"The value of vector:";
    for(;it != vec.end();it++)
        cout<<*it<<" ";
    cout<<endl;

    //advance使用
    it = vec.begin();
    cout<<"After advance 3:";
    advance(it,5);
    cout << *it << " "<<endl;

    //distance使用
    cout<<"The distance of position 3 to the end:";
    cout<<distance(it,end)<<endl;

2、
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值