考研
youngurt
这个作者很懒,什么都没留下…
展开
-
图的最短路径——迪杰斯特拉算法(Dijkstra算法)、弗洛伊德算法(Floyd算法)和广度优先搜索(BFS)算法求最短路径(无权图)
一、迪杰斯特拉算法(Dijkstra算法)(1)算法从某一顶点到其余各项顶点的最短路径。引进三个辅助数组dist[]、path[]和set[]。dist[vi]表示当前已找到的从v0到vi的最短路径长度。path[vi]中保存从v0到vi最短路径上vi的前一个顶点。set[]为标记数组。/*邻接矩阵的结构定义*/#define maxSize 100typedef struct{ int edges[maxSize][maxSize]; //邻接矩阵定义 int n,原创 2021-07-25 21:30:31 · 1460 阅读 · 2 评论 -
最小生成树——普里姆算法(Prim算法)和克鲁斯卡尔算法(Kruskal算法)
一、普里姆算法(1)将v0到其他顶点的所有边当作侯选边;(2)重复一下步骤n-1次,使得其他n-1个顶点被并入到生成树中。①从侯选边中挑选出权值最小的边输出,并将与该边另一端相接的顶点v并入生成树中;②考查所有剩余顶点vi,如果(v,vi)的权值比lowcost[vi]小,则用(v,vi)的权值更新lowcost[vi]。/*邻接矩阵的结构定义*/typedef struct{ int no; //顶点编号 //char info; //顶点其他信息}VertexType;type原创 2021-07-23 22:23:10 · 2999 阅读 · 0 评论 -
图的遍历算法操作——深度优先搜索遍历和广度优先搜素遍历
一、邻接表存储表示的定义/*邻接表存储表示的定义*/typedef struct ArcNode{ int adjvex; //该边所指向的结点的位置 struct ArcNode *nextarc; //指向下一条边的指针 //int info; //该边的相关信息(如权值),这一句用得不多,题目不做特殊要求可以不写}ArcNode;typedef struct{ char data; //顶点信息 ArcNode *firstarc; //指向第一条边的指针}VNode;t原创 2021-07-22 16:22:13 · 638 阅读 · 0 评论 -
关于浮点型数组A[0,…,n-1],试设计实现下列运算的递归算法
关于浮点型数组A[0,…,n-1],试设计实现下列运算的递归算法(1)求数组A中的最大值思路:①如果数组A长度为1,则可以直接返回最大值。②否则将数组A视为两部分,即A[0]和A[1,…,n-1]。如果A[0]大于A[1,…,n-1]的最大值,则返回A[0],反之按照上一步的方法递归地处理A[1]大于A[2,…,n-1]。float findmax(float A[], int i, int j){ float max; if(i==j) return A[i]; else{原创 2021-06-25 14:50:36 · 1407 阅读 · 1 评论 -
给定一个稀疏矩阵A(float型),其尺寸为mxn,建立其对应的三元组存储,并通过三元组打印输出矩阵A
题目:给定一个稀疏矩阵A(float型),其尺寸为mxn,建立其对应的三元组存储,并通过三元组打印输出矩阵A。思路:扫描矩阵A,将矩阵A中非零元素的个数、非零元素的值、以及非零元素在原数组中的位置,存到建立的三元组B中。建立三元组B/*建立三元组B*/void createtrimat(float A[][maxSize], int m, int n, float B[][3]){ int k=1; for(int i=0;i<m;++i) for(int j=0;j<原创 2021-06-24 18:28:55 · 551 阅读 · 0 评论 -
中缀表达式转后缀、前缀表达式的方法
举一个中缀表达式的例子:a+b-a*((c+d)/e-f)+g中缀表达式转后缀表达式方法一:括号法①按照运算符的优先级,对所有的运算单位加括号。于是变成:(((a+b)-(a*(((c+d)/e)-f)))+g)②从最里面的括号开始,依次把运算符号移动到对应的括号的后面。于是变成:(((ab)+(a(((cd)+e)/f)-)*)-g)+③最后,把括号都去掉于是变成:ab+acd+e/f-*-g+方法二:利用语法树略。方法三:基于堆栈的算法具体转换方式:.原创 2021-06-03 11:25:16 · 7231 阅读 · 3 评论 -
栈的链式存储结构
链栈结点定义这里用带头结点的单链表作为存储体。typedef struct LNode{ int data; //数据域 struct LNode *next; //指针域}LNode; //链栈结点定义原创 2021-05-29 14:49:53 · 131 阅读 · 0 评论 -
栈的顺序存储结构
栈的顺序存储结构可描述为#define MaxSize 50 //定义栈中元素的最大个数typedef struct{ ElemType data[MaxSize]; //存放栈中元素 int top; //栈顶指针}SqStack;原创 2021-05-29 12:03:38 · 148 阅读 · 0 评论 -
一些单链表的题目(3)
17、题目:设计一个算法用于判断带头结点的循环双链表是否对称思路:让p从左向右扫描,q从右向左扫描,直到它们指向同一个结点或相邻结点为止。(p==q,p->next=q或q->next=p)。若它们所指结点值相同,则继续进行下去,否则返回0。typedef struct DNode{ //定义双链表结点的类型 ElemType data; //数据域 struct DNode *prior, *next; //前驱和后继指针}DNode, *DLinklist;int Sym原创 2021-05-27 22:44:52 · 636 阅读 · 0 评论 -
一些单链表的题目(2)
9、题目:给定一个带表头结点的单链表,设head为头指针,结点结构为(data,next),data为整型元素,next为指针,试写出算法:按递增次序输出单链表中各结点的数据元素,并释放结点所占的存储空间(要求:不允许使用数组作为辅助空间)思路:对链表进行遍历,在每次遍历中找出整个链表的最小值元素,输出并释放结点所占空间;再次查找最小值,输出并释放空间,如此下去,直至链表为空,最后释放头结点所占的存储空间。时间复杂度为O(n²)void Min_Delete(LinkList &head){原创 2021-05-25 14:34:32 · 1059 阅读 · 0 评论 -
一些单链表的题目(1)
1、题目:设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点思路:需要借助一个递归工作栈,深度为O(n),时间复杂度为O(n)void Del_X(LinkList &L, ElemType x){ LNode *p; //p指向待删除的结点 if(L==NULL) //递归出口 return; if(L->data==x){ //若L所指结点的值为x p = L; //删除L结点 L = L->next; //并让L指向下一结点 free(p)原创 2021-05-20 09:45:01 · 542 阅读 · 0 评论 -
双链表的定义、初始化、插入、删除和销毁
1.双链表定义//双链表定义typedef struct DNode{ ElemType data; //数据域 struct DNode *prior, *next; //前驱和后继指针}DNode, *DLinkList;2.初始化双链表//初始化双链表bool InitDLinkList(DLinkList &L){ L = (DNode *)malloc(sizeof(DNode)); //创建头结点 if(L==NULL) return false; //内存原创 2021-05-15 11:38:13 · 601 阅读 · 0 评论 -
单链表的定义、插入(头插法和尾插法)、删除和查找
1.单链表的定义//单链表定义typedef struct LNode{ ElemType data; struct LNode *next;}LNode, *LinkList;2.单链表的插入操作(头插法和尾插法)(1)头插法(带头结点)//头插法(带头结点)LinkList List_HeadInsert(LinkList &L){ LNode *s; int x; L = (LinkList)malloc(sizeof(LNode)); //创建头结点 L原创 2021-05-13 17:15:56 · 729 阅读 · 0 评论 -
顺序表的定义和基本操作
1、顺序表的定义顺序表,即线性表的顺序存储,用一组地址连续的存储单元依次存储线性表中的各个元素,使得线性表中在逻辑结构上相邻的两个元素在物理位置上也相邻。注意:线性表中元素的位序是从1开始的,而数组中元素的下标是从0开始的。假定线性表的元素类型为ElemType,线性表的顺序存储可以是静态的,也可以是动态的。//静态分配#define maxSize 100; //定义顺序表的最大长度typedef struct{ Elemtype data[maxSize]; //顺序表的元原创 2021-05-03 14:31:56 · 4843 阅读 · 0 评论