图的邻接矩阵表示
图是一种中一对多的数据类型。图的表示方法有邻接矩阵法,十字链表法。
图的操作包括
Adjacent(G,x,y):判断图G是否存在边<x,y>或(x,y)。
Neighbors(G,x):列出图G中与结点x邻接的边。
InsertVertex(G,x):在图G中插入顶点x。
DeleteVertex(G,x):从图G中删除顶点x。
AddEdge(G,x,y):若无向边(x,y)或有向边<x,y>不存在,则向图G中添加该边。
RemoveEdge(6,x,y):若无向边(x,y)或有向边<x,y>存在,则从图G中删除该边。
FirstNeighbor(G,x):求图G中顶点x的第一个邻接点,若有则返回顶点号。若x没有邻接点或图中不存在x,则返回-1。
邻接矩阵表示适合密集图
图的存储方式1234567#define MAX_SIZE 10typedef struct Graph{ int vexnum; /*节点个数*/ int vertices[MAX_SIZE]; /*节点数组*/ ...
哈夫曼树
哈夫曼树是一种带权路径最小的树,运用于压缩编码算法。
带权路径又称WPL,是所有非叶子节点的路径之和,路径=深度*权值
哈夫曼树的节点个数=2*带权节点个数-1
哈夫曼树的构造过程在未组成哈夫曼树的节点中寻找权值最小和第二小的节点,作为左右孩子,构造一个新节点作为父节点,父节点的权值为左右孩子的权值之和
哈夫曼树的表示哈夫曼树用顺序存储的数组表示。
存储结构如下
12345678910111213typedef struct TreeNode{ int weight; int parent; int lchild; int rchild;} TreeNode;typedef struct HaffTree{ struct TreeNode *node; int length;} HaffTree;
哈夫曼树的初始化操作123456789101112131415HaffTree *initTree(int *weight, int length){ HaffTree *T ...
哈夫曼树
哈夫曼树是一种带权路径最小的树,运用于压缩编码算法。
带权路径又称WPL,是所有非叶子节点的路径之和,路径=深度*权值
哈夫曼树的节点个数=2*带权节点个数-1
哈夫曼树的构造过程在未组成哈夫曼树的节点中寻找权值最小和第二小的节点,作为左右孩子,构造一个新节点作为父节点,父节点的权值为左右孩子的权值之和
哈夫曼树的表示哈夫曼树用顺序存储的数组表示。
存储结构如下
12345678910111213typedef struct TreeNode{ int weight; int parent; int lchild; int rchild;} TreeNode;typedef struct HaffTree{ struct TreeNode *node; int length;} HaffTree;
哈夫曼树的初始化操作123456789101112131415HaffTree *initTree(int *weight, int length){ HaffTree *T ...
linxu的main函数启动过程
main函数源码
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253/* * This is set up by the setup-routine at boot-time */#define EXT_MEM_K (*(unsigned short *)0x90002) /*扩展内存数,单位为KB*/#define DRIVE_INFO (*(struct drive_info *)0x90080)#define ORIG_ROOT_DEV (*(unsigned short *)0x901FC)void main(void) /* This really IS void, no error here. */{ /* The startup routine assumes (well, ...) this *//*hexhe * Interrupts are still disabled. Do necessary setup ...
树和森林
树的存储方式双亲表示法
存储方式双亲表示法使用数组实现
parent存放父亲在数组的索引
插入操作插入操作在数组末尾加入数据
孩子表示法使用顺序存储和链式存储实现
孩子兄弟表示法将下面的树使用孩子兄弟表示法,可以转化为
树 二叉树 森林的转化
操作符重载
操作符重载操作流重载cout是一种ostream类型
1234operator <<(ostream &os,const complex& x){ return os<<'C'<<real(x)<<','<<imag(x)<<')';}cout<<conj(c1)//调用函数operator <<(cout,c1)
thread
c11提供了线程的标准库
lamda表达式左值引用完美转发forward队列queueemplace可变参数模板函数万能引用右值引用函数适配器bind时间库chrono
线程库的使用1234567891011#include<iostream>#include<thread>void func(){ std::cout<<"线程启动"<<std::endl;}int main(){ std::thread th1(); return 0;}
lock_guardlock_guard是C++11提供的锁管理机制,能够对共享变量进行自动加锁和解锁。
初始化
1std::lock_guard<std::mutex> guard(mux);
源码:
123456789101112131415161718192021template<typename _Mutex> class lock_guard { public ...
c++面向对象
操作流1
对象成员函数与全局函数成员函数的传递默认参数this
referenceconst function和function constreturn reference构造函数复合:由内到外
析构函数复合:由外到内
拷贝构造拷贝赋值含有指针的赋值,希望可以拷贝一份(深拷贝),而不是指向同一块内存区域(浅拷贝)
深拷贝:b=a;将a中的内容复制一份
浅拷贝:b=1;将b指向a的内容
实例实例的创建方式
实例的生存周期
临时对象语法:typename()
12class complex;complex(1,2) ;//创建complex类的临时对象
using 关键字用于定义类型别名
1using Ptr = std::shared_ptr<MediaSession>;//智能指针取别名
堆和栈local:stack
static:程序结束释放
global:不在函数内部
static和global的区别
作用域
生命周期
堆区的对象(auto/local)离开作用域消失
静态数据
静态成员函数:静态函数没有this指针,不能去 ...
二叉树
二叉树的概念每个节点至多有两个孩子的树叫做二叉树
二叉树的存储结构12345typedef struct bTree{ char ele; struct bTree* lchild; struct bTree* rchild;}bTree;
二叉树节点使用结构体存储,包含数据域和指针域。指针域为分别指向左右孩子的指针
二叉树的创建二叉树的创建方式有很多种,在这里我们根据树的先序遍历序列来创建一个二叉树
创建根节点
1struct bTree* root=(struct bTree*)malloc(sizeof(struct bTree));
树的先序序列如下,其中##代表空节点
12char *data="ABD##E##CF##G##";int index=0;
树的结构为
12345678910111213141516void create_tree(bTree **root,char *data,int *index){ char ch; ch=data[*index]; (*index)++; /*空节点返回*/ if ...