数据结构与算法
.
FG.
第十三月你就如期出现,我也想听听,你心里的我是什么样子的
展开
-
选择排序法
1. 简单选择排序#include<iostream>using namespace std;#define MAXSIZE 20typedef struct { int key; char* otherinfo;}ElemType;//顺序表的存储结构typedef struct { ElemType* r; int length;}SqList;void SelectSort(SqList& L){ int k; ElemType t; for (i原创 2021-12-27 00:03:39 · 735 阅读 · 3 评论 -
交换排序法
1. 冒泡排序#include<iostream>using namespace std;#define MAXSIZE 20typedef struct { int key; char* otherinfo;}ElemType;//顺序表的存储结构typedef struct { ElemType* r; int length;}SqList;void BubbleSort(SqList& L){ int m, flag=1; //flag用来标记某一趟原创 2021-12-26 00:20:18 · 635 阅读 · 1 评论 -
插入排序法
1. 直接插入排序//直接插入排序#include<iostream>using namespace std;#define MAXSIZE 20typedef struct { int key; char* otherinfo;}ElemType;//顺序表的存储结构typedef struct { ElemType* r; int length;}SqList;void InsertSort(SqList& L){ int j; for (int原创 2021-12-25 15:29:15 · 541 阅读 · 3 评论 -
BFS遍历连通图
//广度优先搜索遍历连通图#include<iostream>using namespace std;#define MVNum 100#define MAXQSIZE 100typedef char VerTexType;typedef int ArcType;bool visited[MVNum];typedef struct { VerTexType vexs[MVNum]; ArcType arcs[MVNum][MVNum]; int vexnum, arcnum原创 2021-12-20 19:53:37 · 289 阅读 · 0 评论 -
BF算法和KMP算法
BF算法#include<iostream>#include<cstring>using namespace std;#define OK 1#define ERROR 0#define MAXSTRLEN 255typedef char SString[MAXSTRLEN + 1]; //0号单元存放串的长度int StrAssign(SString T, const char* chars) //生成一个其值等于chars的串T{ if (strlen(ch原创 2021-12-19 17:25:44 · 402 阅读 · 5 评论 -
链队的实现
#include<iostream>using namespace std;#define OK 1#define ERROR 0typedef char QElemType;typedef char SElemType;typedef struct QNode{ QElemType data; struct QNode* next;}QNode,*QueuePtr;typedef struct { QueuePtr front; //队头指针 QueuePtr rear原创 2021-12-19 01:14:00 · 317 阅读 · 0 评论 -
循环队列的实现
#include<iostream>using namespace std;#define MAXQSIZE 100#define OK 1#define ERROR 0typedef char QElemType;typedef char SElemType;typedef struct { QElemType* base; //初始化时动态分配存储空间 int front; //头指针 int rear; //尾指针}SqQueue;//循环队列初始化int I原创 2021-12-19 00:10:30 · 423 阅读 · 0 评论 -
图的最短路径问题
#include<iostream>#include<cstring>using namespace std;#define MaxInt 32767#define MVNum 100typedef char VerTexType[20];typedef int ArcType;int Path[MVNum][MVNum];int D[MVNum][MVNum];typedef struct { VerTexType vexs[MVNum]; ArcType a原创 2021-12-18 20:25:52 · 322 阅读 · 0 评论 -
DFS遍历连通图
//深度优先搜索遍历连通图的递归算法#include<iostream>using namespace std;#define MVNum 100typedef char VerTexType;typedef int ArcType;typedef struct { VerTexType vexs[MVNum]; // 顶点表 ArcType arcs[MVNum][MVNum]; // 邻接矩阵 int vexnum, arcnum;}Graph;bool visited原创 2021-12-16 14:39:43 · 1213 阅读 · 0 评论 -
利用邻接表创建无向图
#include<iostream>using namespace std;#define MVNum 100#define OK 1typedef char VerTexType; // 顶点信息typedef int OtherInfo; // 和边相关的信息typedef struct ArcNode { // 边结点 int adjvex; // 该边所指向的顶点的位置 struct ArcNode* nextarc; // 指向下一条边的指针 O原创 2021-12-15 21:54:37 · 4722 阅读 · 2 评论 -
构造哈夫曼树和哈夫曼编码
//哈夫曼树#include<iostream>#include<cstring>using namespace std;typedef struct { int weight; int parent, lchild, rchild;}HTNode,*HuffmanTree;typedef char ** HuffmanCode;void Select(HuffmanTree HT, int len, int& s1, int& s2){ int原创 2021-12-15 21:44:36 · 2260 阅读 · 0 评论 -
利用邻接矩阵创建无向网
#include<iostream>using namespace std;#define MaxInt 32767#define MVNum 100#define OK 1typedef char VerTexType;typedef int ArcType;typedef struct { VerTexType vexs[MVNum]; //顶点表 ArcType arcs[MVNum][MVNum]; //邻接矩阵 int vexnum, arcnum; }A原创 2021-12-15 21:32:37 · 1214 阅读 · 0 评论 -
图的遍历(DFS和BFS)
转载总结原创 2021-11-30 07:57:02 · 237 阅读 · 0 评论 -
十字链表、邻接多重表、边集数组
1. 十字链表十字链表把邻接表和逆邻接表整合在了一起,这样既容易找到以Vi为尾的弧,也容易找到以Vi为头的弧,从而容易求出顶点的出度和入度。事件复杂度是和邻接表相同的。顶点表结点结构:边表结点结构:2. 邻接多重表边表结构:其中iVex和jVex是与某条边依附的两个顶点在顶点表中的下标。iLink指向依附顶点iVex的下一条边,jLink指向依附顶点jVex的下一条边。3. 边集数组边集数组是有两个一维数组构成,一个是存储顶点的信息,另一个是存储边的信息,这个边数组每个数据原创 2021-11-26 10:12:06 · 839 阅读 · 0 评论 -
图的存储结构---邻接表
1. 邻接表(无向图)对于边数相对顶点较少的图,可采取邻接表。把数组与链表结合在一起来存储,这种方式在图结构也适用,称为邻接表(AdjacencyList)。2. 邻接表(有向图)以每个顶点出度建立邻接表入度或顶点为弧头的弧,建立逆邻接表3. 邻接表(网)对于带权值的网图,可以在边表结点定义中再增加一个数据域来存储权值即可。...原创 2021-11-26 09:08:18 · 7083 阅读 · 1 评论 -
图的存储结构---邻接矩阵
1. 邻接矩阵(无向图)图的邻接矩阵(Adjacency Matrix)存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。顶点数组为Vertex[4]={V0,V1,V2,V3},边数组arc[4][4]为对称矩阵(0表示不存在顶点间的边,1表示顶点间存在边)。对称矩阵:所谓对称矩阵就是n阶矩阵的元满足a[i][j]=a[j][i](0<=i,j<=n)。即从矩阵的左上角到右上角的主对角线为轴,右上角的元与左上角相对应的元全都原创 2021-11-26 08:45:03 · 2159 阅读 · 0 评论 -
图的定义和术语
图的定义图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。线性表中我们把数据元素叫做元素,树中叫结点,在图中数据元素我们称之为顶点(Vertex)。线性表可以没有数据元素,称为空表,树中可以没有结点,叫做空树,而图结构在教材中强调顶点集合V要有穷非空。线性表中,相邻的数据元素之间具有线性关系,树结构中,相邻两层的结点具有层次关系,而图结构中,任意两个顶点之间都可能有关系,顶点之间的逻辑关系用边来表示,原创 2021-11-23 14:17:34 · 568 阅读 · 0 评论 -
赫 夫 曼 树
转载原理与构造方法c语言构造赫夫曼树编码转载 2021-11-13 09:04:35 · 50 阅读 · 0 评论 -
线索二叉树
转载线索二叉树概念线索二叉树的代码实现#include<stdio.h>#include<stdlib.h>typedef char ElemType;//线索存储标志位//Link(0):表示指向左右孩子的指针//Thread(1):表示指向前驱后继的线索 typedef enum{Link,Thread} PointerTag;typedef struct BiThrNode{ char data; struct BiThrNode *lchild,*原创 2021-11-12 10:19:20 · 58 阅读 · 0 评论 -
二叉树的遍历
二叉树的遍历二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。二叉树的遍历次序不同于线性结构,线性结构最多也就是分为顺序、循环、双向等简单的遍历方式。遍历方式前序遍历:若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。中序遍历:若树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点),中序遍历根结点的左子树,然后是访问根结点,最后遍原创 2021-11-12 08:44:50 · 60 阅读 · 0 评论 -
二 叉 树
二叉树的定义二叉树(Binary Tree)是n(n>=0)个结点的有限集合,该集合或者为空集(空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。每个结点最多有两棵子树,所以二叉树不存在度大于2的结点。(注意:不是都需要两棵子树,而是最多可以是两棵,没有子树或者有一棵子树也都是可以的。)左子树和右子树是有顺序的,次序不能颠倒。空二叉树空二叉树只有一个根结点根结点只有左子树根结点只有右子树根结点既有左子树又有右子树特殊二叉树斜树斜原创 2021-11-05 07:54:09 · 197 阅读 · 0 评论 -
树的存储结构
双亲表示法//树的双亲表示法结点结构定义#define MAX_TREE_SIZE 100typedef int ElemType;typedef struct PTNode{ ElemType data; //结点数据 int parent; //双亲位置}PTNode;typedef struct{ PTNode nodes[MAX_TREE_SIZE]; int r; //根的位置 int n; //结点数目}PTree;原创 2021-11-03 21:34:07 · 67 阅读 · 0 评论 -
树....
树的定义树(Tree)是n(n>=0)个结点的有限集。当n=0时称为空树,在任意一棵非空树中:1.有且只有一个特定的称为根(Root)的结点;2.当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、…Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。注意:当n>0时,根结点是唯一的,坚决不可能存在多个根结点。当m>0时,子树的个数是没有限制的,但它们互相是一定不会相交的。图片中,每一个圆圈我们称为树的一个结点。结点拥有原创 2021-11-03 20:39:37 · 85 阅读 · 0 评论 -
线性表的合并
#include<iostream>using namespace std;#define MAXSIZE 100typedef struct{ int *elem; int length;}List;void InitList(List &L) //创建顺序表{ L.elem=new int[MAXSIZE]; L.length=0;} void ListInput(List &L,int n) //顺序表数据的输入 { for(int i=0原创 2021-09-21 16:11:44 · 610 阅读 · 6 评论 -
栈和队列6
队列的顺序存储结构有0和1两个下标空着,叫假溢出。循环队列定义定义一个循环队列#define MAXSIZE 100typedef struct{ ElemType *base; //用于存放内存分配基地址 int front; int rear;} 初始化一个循环队列initQueue(cycleQueue *q){ q->base=(ElemType *)malloc(MAXSIZE * sizeof(ElemType));原创 2021-08-29 12:04:01 · 77 阅读 · 1 评论 -
栈和队列5
队列的定义队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。与栈相反,队列是一种先进先出的线性表。与栈相同的是,队列也是一种重要的线性结构,实现一个队列同样需要顺序表或链表作为基础。队列既可以用链表实现,也可以用顺序表实现。跟栈相反的是,栈一般我们用顺序表来实现,而队列我们常用链表来实现,简称为链队列。typedef struct QNode{ ElemType data; struct QNode *next;}QNode,*Queu原创 2021-08-26 20:23:19 · 51 阅读 · 1 评论 -
栈和队列4
逆波兰计算器#include<stdio.h>#include<ctype.h>#include<stdlib.h>#define STACK_INIT_SIZE 20#define STACKINCREMENT 10#define MAXBUFFER 10typedef double ElemType;typedef struct { ElemType *base; ElemType *top; int stackSize;}sqStack;原创 2021-08-26 15:11:18 · 54 阅读 · 0 评论 -
栈和队列3
栈的链式存储结构typedef struct StackNode{ ElemType data; //存放栈的数据 struct StackNode *next;}StackNode,*LinkStackPtr;typedef struct LinkStack{ LinkStackPrt top; //top指针 int count; //栈元素计数器}进栈操作对于栈链的Push操作,假设元素值为e的新结点是s,top为栈顶指针。原创 2021-08-26 12:32:30 · 47 阅读 · 1 评论 -
栈和队列2
清空一个栈所谓清空一个栈,就是将栈中的元素全部作废,但栈本身物理空间并不发生改变(不是销毁)。因此我们只要将s->top的内容赋值为s->base即可,这样s->base等于s->top,也就表明这个栈是空的了。这个原理跟高级格式化只是但单纯地清空文件列表而没有覆盖硬盘的原理是一样的。ClearStack(sqStack *s){ s->top=s->base;} 销毁一个栈与清空一个栈不同,销毁一个栈是要释放掉该栈所占据的物理内存空原创 2021-08-26 12:05:06 · 279 阅读 · 0 评论 -
栈和队列1
栈的定义栈是一种重要的线性结构,也就是线性表的一种具体形式。栈(Stack)是一个后进先出(Last in first out,LIFO)的线性表,它要求只在表尾进行删除和插入操作。对于栈来说,这个表尾称为栈的栈顶(top),相应的表头称为栈底(bottom)。栈的插入操作叫做进栈,也称为压栈,入栈。栈的删除操作叫做出栈,也称为弹栈。栈的顺序存储结构栈的本质是一个线性表,线性表有两种存储形式,那么栈也有分为栈的顺序存储结构和栈的链式存储结构。最开始栈中不含有任何数据,叫做空栈,此时栈顶就是原创 2021-08-25 20:26:04 · 59 阅读 · 1 评论 -
双向循环链表实践
题目:#include<stdio.h>#include<stdlib.h>#define OK 1#define ERROR 0typedef char ElemType;typedef int Status;typedef struct DualNode{ ElemType data; struct DualNode *prior; struct DualNode *next;}DualNode,*DuLinkList;Status InitLi原创 2021-08-24 17:19:58 · 69 阅读 · 1 评论 -
双向链表.
双向链表双向链表结点结构typedef struct DualNode{ ElemType data; struct DualNode *prior; //前驱结点 struct DualNode *next; //后继结点}DualNode,*DuLinkList;双向链表也有循环链表双向链表的插入操作代码实现:s->next=p;s->prior=p->prior;p->prior->next=s;p->p原创 2021-08-24 21:11:35 · 74 阅读 · 2 评论 -
魔术师发牌问题
魔术师发牌问题#include<stdio.h>#include<stdlib.h>#define CardNumber 13typedef struct node{ int data; struct node *next;}sqlist,*linklist;linklist CreateLinkList() //创建一个循环链表{ linklist head=NULL; linklist s,r; int i; r=head; for(i=1;i原创 2021-08-24 09:32:00 · 59 阅读 · 2 评论 -
约瑟夫问题
用循环链表模拟约瑟夫问题,把41个人自杀的顺序标号输出。#include<stdio.h>#include<stdlib.h>typedef struct node{ int data; struct node *next;}node;node *create(int n){ node *p=NULL,*head; head=(node*)malloc(sizeof(node)); p=head; node *s; int i=1; if(n!=0)原创 2021-08-22 19:54:29 · 83 阅读 · 2 评论 -
循环链表.
循环列表将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表成为单循环链表,简称循环链表。这里并不是说循环链表一定要有头结点。其实循环链表的单链表的主要差异就在于循环的 判断空链表的条件上,原来判断head->next是否为null,现在则是head->next是否等于head。由于终端结点用尾指针rear指示,则查找终端结点是O(1),而开始结点是rear->next->next,当然也是O(1)。...原创 2021-08-22 14:20:27 · 1098 阅读 · 0 评论 -
静态链表
静态链表线性表的静态链表存储结构#define MAXSIIZE 1000typedef struct{ ElemType data; //数据 int cur; //游标}Component,StaticLinkList[MAXSIZE];对静态链表进行初始化相当于初始化数组Status InitList(StaticLinkList space){ for(int i=0;i<MAXSIZE-1;i++) { s原创 2021-08-20 17:26:40 · 70 阅读 · 0 评论 -
单链表的整表
1.单链表整表创建的算法思路:声明一结点p和计数器变量i;初始化一空链表L;让L的头结点的指针指向NULL,即建立一个带头结点的单链表;循环实现后继结点的赋值和插入。2.头插法建立单链表头插法从一个空表开始,生成新结点,读取数据存放到新结点的数据域中,然后将新结点插入到当前链表的表头上,直到结束为止。就是把新加进的元素放在表头后的第一个位置:先让新结点的next指向头结点之后然后让表头的next指向新结点void CreateListHead(LinkList *L,int n)原创 2021-08-19 20:38:21 · 110 阅读 · 0 评论 -
线性表2
线性表1.线性表的链式存储结构线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以存在内存中未被占用的任意位置。比起顺序存储结构每个数据元素只需要存储一个位置就可以了。现在链式存储结构中,除了要存储数据元素信息外,还要存储它的后继元素的存储地址(指针)。也就是说除了存储其本身的信息外,还需存储一个指示其直接后继的存储位置的信息。我们把存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域。指针域中存储的信息称为指针或链。这两部分信息组成数原创 2021-08-19 20:38:03 · 82 阅读 · 0 评论 -
线性表1
线性表1.线性表(List):由零个或多个数据元素组成的有限序列。(1)若将线性表记为(a1,…,ai-1,ai,ai+1,an),则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素。(2)线性表元素的个数n(n>=0)定义为线性表的长度,当n=0时,成为空表。2.线性表的抽象数据类型ADT 线性表(List)Data线性表的数据对象集合为{a1,a2,…an},每个元素的类型均为DataType。其中,除第一个元素外,每一个原创 2021-08-01 06:57:56 · 140 阅读 · 2 评论