![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
知世同学哇
是超喜欢学习的知世同学呀
展开
-
排序之归并排序和基数排序
2路归并排序 void MergeSort(int arr[],int copy[],int left,int right)//left=0,right=n-1 { if(left>=right) { return; } int mid=(left+right)/2; MergeSort(arr,copy,left,mid);//不断递归将其划分成最小的部分存进copy中,再让mid两边的数据进行比较之后放入arr中 MergeSort(原创 2020-12-25 01:22:29 · 201 阅读 · 0 评论 -
排序之选择排序
简单选择排序 void SelectSort(int arr[],int n) { for(int i=0;i<n-1;i++)//查询数组中每一个位置的最小值,将找到的最小值与目前位置交换 //只需要查找n-1次,因为只剩下最后一个一定是最大值 { j=SelectMinKey(arr,i,n); swap(arr[i],arr[j]) } } void SelectMinKey(int arr[],int k,int n) {原创 2020-12-25 01:13:25 · 212 阅读 · 0 评论 -
排序之交换排序
冒泡排序 void BubbleSort(int arr[],int n) { for(int i=0;i<n-1;i++) { for(int j=0;j<n-1-i;j++)//每经过一次排序,最大的数就已经确定,因此需要排序的个数就要减少 { if(arr[j]>arr[j+1]) { swap(arr[j],arr[j+1]); }原创 2020-12-25 00:36:31 · 284 阅读 · 0 评论 -
排序之插入排序
排序的稳定性 对于数据中相同的元素,他们在原始数据中的内容到顺序在排序后前后顺序不变 内部排序和外部排序 划分:是否在内存内 内部排序是完全在内存中进行,而外部排序有些是在内存外部进行的 排序的分类 插入排序 交换排序 选择排序 归并排序 计数排序 排序的操作 比较 移动 直接插入排序算法 int sqlis[]={6,1,87,14,89,15,78,12,67,23}; void InsertSort(int aqlis[],int n) { for(int i=1;i<原创 2020-12-24 23:52:21 · 297 阅读 · 0 评论 -
查找之Hash表
哈希函数 哈希函数 数据在哈希表中最好分布均匀 最好能减少冲突 一般使用取余法 解决冲突的方法 开方定值法:线性探测 链地址法 再哈希法 建立一个公共的溢出区 typedef struct node { int data; struct node*link; }NODE; typedef NODE* HashTable[13];//HashTable[]里存储的数据是NODE类型的 void init(HashTable*ht) { for(int i=0;i<13;原创 2020-12-24 23:42:04 · 82 阅读 · 0 评论 -
查找之平衡二叉树
平衡二叉树 1.性质 首先必须是一个二叉搜索树 左右子树深度相差绝对值不超过1 平衡因子BF:该结点右子树的深度减去它的左子树的深度,因此平衡二叉树上所有结点的平衡因子只可能是1,-1或0 2.AVL树代码实现 创建AVL树结构 typedef struct AVLnode { int data; AVLtree*lchild; AVLtree*rchild; int bf; }AVLnode; typedef struct AVLtree { AVLnode*r原创 2020-12-24 21:23:46 · 418 阅读 · 0 评论 -
二叉树之兄弟孩子树
孩子兄弟树 将图转换为二叉树,找到一个节点,左孩子有兄弟,将其用孩子兄弟法转换为一个二叉树,再按二叉树的方式将其存储 typedef struct node { char data; struct node*child; struct node*sibling; }*PNODE,NODE; typedef struct tree { PNODE root; char ref; }TREE; void init(TREE*t); PNODE create(TREE*原创 2020-12-24 19:24:09 · 601 阅读 · 1 评论 -
线索化二叉树及其基本方法实现
线索化二叉树的初始化 线索化二叉树是根据中序遍历产生的,当一个左右子树节点为空时,使其左子树指向其前驱节点,右子树指向其后继结点 为了区分指针到底指向的是前驱后继节点还是左右子树,需要在创建树的节点时再创建两个空间分别用来标记其左右指针指的是什么 typedef enum{LINK,THREAD}TAG; typedef struct node { char data; struct node*lchild; struct node*rchild; TAG rtag;原创 2020-12-24 19:07:06 · 560 阅读 · 1 评论 -
二叉树的恢复实现
根据二叉树的前中后序列恢复二叉树的结构 char* VLR="ABCDEFGH"; char* LVR="CBEDFAGH"; char* LRV="CEFDBHGA"; int n=strlen(VLR); 1.根据前序和中序恢复二叉树: void create1(PNODE p,char*VLR,char*LVR,int len) { if(len!=0) { int k=0; while(VLR[0]!=LVR原创 2020-12-24 19:06:13 · 323 阅读 · 1 评论 -
二叉树及其基本方法实现
二叉树的创建 在创建这个树时一定要以数据形式创建,若以指针形式创建,则该树一直是地址形式,没有具体的数值,在后续操作中也无法对树进行具体值的创建。 typedef struct node { char data; struct node *lchild; struct node*rchild; }*PNODE,NODE; typedef struct TREE { PNODE root; char ref;//用来标记为空的节点 }*PTREE,TREE; vo原创 2020-12-24 19:05:14 · 152 阅读 · 1 评论 -
稀疏矩阵及其转置算法
稀疏矩阵的构造 typedef struct triple//三元数组 { int i; int j; int num; }triple; typedef struct smatrix { triple data[20]; int m;//原矩阵行数 int n;//原矩阵列数 int p;//非零元素的个数 }smatrix; void create(int a[][7],int h,int l,smatrix*sm); void print(sm原创 2020-12-24 13:48:59 · 1460 阅读 · 1 评论 -
队列之循环队列
循环队列 typedef struct queue//用数组创建的队列 { int *pbase; int front; int rear; }QUEUE; int main() { QUEUE Q; init(&Q); en_queue(&Q,1); en_queue(&Q,2); en_queue(&Q,3); en_queue(&Q,4); en_queue(&Q,5);原创 2020-12-24 12:44:29 · 64 阅读 · 0 评论 -
栈及其栈应用
栈 typedef struct node { int data; struct node*pnext; }NODE,*PNODE; typedef struct stack { PNODE ptop; PNODE pbottom; }STACK,*PSTACK; void init(PSTACK); void push(PSTACK ps,int val); void show(PSTACK ps); bool is_empty(PSTACK ps); bool pop(P原创 2020-12-24 12:23:42 · 172 阅读 · 0 评论 -
四种链表的基本操作
单链表的基本操作 typedef struct node{ int data; struct node*pnext; }*PNODE,NODE; PNODE create_list(); void show_list(PNODE phead); int length_list(PNODE phead); bool is_empty(PNODE phead); void sort_list(PNODE phead); int main() { PNODE phead=NULL; p原创 2020-12-24 11:29:34 · 485 阅读 · 0 评论 -
查找之二叉搜索树
一.查找 1.静态查找与动态查找 动态查找是对数据进行更改,而静态查找对数据不进行更改 二. 二叉搜索树 2.1性质: 若他的左子树不空,则左子树上所有结点的值均小于它的根节点的值 若它的右子树不空,则右子树上所有结点的值均大于它根节点的值 它的左右子树也都是二叉排序树 2.2创建二叉搜索树 typedef struct node { int data; struct node*lchild; struct node*rchild; }BSTnode; typedef str原创 2020-12-20 18:05:27 · 172 阅读 · 0 评论 -
有向无环图及其应用
一.有向无环图(DAG图) 工程是否能顺利完成 求得完成工程的最小时间 二.拓扑排序(AOV网,顶点表示活动) 由集合上的一个偏序得到集合上的一个全序的操作叫拓扑排序 在有向无环图中判断工程是否能完成 1.说明 采用了邻接表存储树结构 运用了栈来存储所有入度为0的元素下标,在出栈时将他们输出并遍历减少所有与他们相连的点的入度 2.代码 void topologicalsort(Graph*g) { //创建一个count数组用来存储所有顶点的入度 int*count=(int *)mal原创 2020-12-20 16:22:02 · 1670 阅读 · 0 评论 -
最小生成树(MST)
最小生成树(MST) 连通n个城市,至少需要n-1条边,若是无向图,则连接n个城市,最多可以设置n(n-1)/2条线路,求如何求得n-1条路使花费最少 有两种算法实现:Prim算法和Kruskal算法 一.Prim算法 1.说明 从一个点开始找,找到与其相邻的最小的边,将点并入与第一个点的集合,将他们作为集合寻找最小的点,直到所有顶点被加入集合,就找到最小花费的路 设置lowcost[i],i表示边的终点,当lowcost[i]=0时,说明以i为终点的边并入到了MST中 设置mst[i]:表示对应lo原创 2020-12-19 21:31:10 · 487 阅读 · 1 评论 -
深度优先遍历和广度优先遍历
一.深度优先遍历(DFS) 首先创建一个visited[]数组用来标记是否被访问过,未被访问过赋值为0 将图、一个顶点和visited[]数组传入函数,进行递归遍历 void DFS(Graph*g,int v,bool visited[])//v为点v的位置 { print("%c-->",getv(v));//从v的位置得到v,并将其输出 visited[v]=1;//表示已经被访问过了 int w=getfirstneighbor(g,getv(v));//得到第一个原创 2020-12-19 18:50:47 · 401 阅读 · 1 评论 -
图的存储方式
图的存储方式 邻接矩阵 用矩阵存储边 用数组存储点 可以完成有向图、无向图和带权图,区别于矩阵上的数值 宏定义存储点的最大容量 #define MAX_V 10 创建数据结构体 typedef struct graph { int maxv;//存放点的最大容量 int numv;//存放点的数量 int numedges;//存放边的数量 char**edges;//存放边的矩阵结构 char *v;//存放点的数组结构 }GRAPH 初始化图原创 2020-12-19 17:25:36 · 197 阅读 · 2 评论