散100分求普里姆算法和克鲁斯卡尔算法的C语言实现代码!!急!!!!!

iter_zc 2004-12-29 06:32:44
高手请帮小弟一把,急求普里姆算法和克鲁斯卡尔算法的C语言实现代码!!!万分感谢!!!!
...全文
498 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
iter_zc 2004-12-30
  • 打赏
  • 举报
回复
万分感谢啊!!!!
dzy1982 2004-12-30
  • 打赏
  • 举报
回复
找本数据结构的书,里面有
bill_li 2004-12-29
  • 打赏
  • 举报
回复
真的,好强呀
吴大猫 2004-12-29
  • 打赏
  • 举报
回复
图的存储结构定义
#define MGRAPH_H
#define INFINITY 100
#define MAX_VERTEX_NUM 20

typedef int VRType;
typedef char InfoType;
typedef char VertexType;
typedef enum { DG,DN,UDG,UDN } GraphKind;
typedef struct {
VRType adj;
InfoType *info;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct {
VertexType vexs[MAX_VERTEX_NUM];
AdjMatrix arcs;
int vexnum,arcnum;
GraphKind kind;
}MGraph;

边集数组类型定义
typedef struct {
int fromvex;
int endvex;
int weight;
}edge;
typedef struct {
edge *set;
int arc_num;
int vex_num;
}edgeset;

typedef struct listnode{
int adjvex;
int weight;
struct listnode *next;
}listnode;
typedef listnode* adjlist[MAX_VERTEX_NUM];

//该算法中的图用邻接矩阵存储,CT为存储着最小生成树的边集数组
void Prim(MGraph g,edgeset *CT,int sta_vex) //sta_vex是初始点
{
int i,j,k,min,m,p,w;
int tm_frvex,tm_envex,tm_weight;
int t = 0;

//给CT赋初值
for(i=0; i<CT->vex_num; i++)
if(g.arcs[sta_vex][i].adj!=0) {
CT->set[t].fromvex = sta_vex;
CT->set[t].endvex = i;
CT->set[t].weight = g.arcs[sta_vex][i].adj;
t++;
}

//进行n-1次循环,每次求出最小生成树的第k条边
for(k=1; k<=g.vexnum-1; k++) {
min = INFINITY;
m = k - 1;
//从CT[k-1]到CT[n-2]中查找最短边
for(i=k-1;i<g.vexnum-1;i++)
if(min>CT->set[i].weight) {
min = CT->set[i].weight;
m = i;
}
//把最短边调到第k-1下标位置
tm_frvex = CT->set[k-1].fromvex;
tm_envex = CT->set[k-1].endvex;
tm_weight = CT->set[k-1].weight;
CT->set[k-1].fromvex = CT->set[m].fromvex;
CT->set[k-1].endvex = CT->set[m].endvex;
CT->set[k-1].weight = CT->set[m].weight;
CT->set[m].fromvex = tm_frvex;
CT->set[m].endvex = tm_envex;
CT->set[m].weight = tm_weight;
//把新并入最小生成树的顶点序号副给p
p = CT->set[k-1].endvex;
//修改CT有关边,使CT中到CT外的每一顶点各保持一条目前为止最短的边
for(i=k; i<g.vexnum-1; i++) {
j = CT->set[i].endvex;
w = g.arcs[p][j].adj;
if(w<CT->set[i].weight && p!=j) {
CT->set[i].weight = w;
CT->set[i].fromvex = p;
}
}
}
}

//ET1是已排好序的边集数组,ET2返回最小生成树,G是图的邻接矩阵表示
void Kruskal(edgeset ET1,edgeset *ET2,MGraph G)
{
int i,j,k,m1,m2,flag,tag; //m1,m2 分别用来表示ET1[i]中两个顶点所在集合的序号
adjlist alist; //邻接表alist作为集合使用,其中每一个单链表alist[i]用来
//表示一个集合,若一个顶点属于这个集合,则对应该单链表中的
//一个结点,该结点的adjvex域的值为该顶点序号
listnode *p,*q;

for(i=0; i<G.vexnum;i++) {
p = (listnode*)malloc(sizeof(listnode));
p->adjvex = i;
p->next = NULL;
alist[i] = p;
}

i = 0,k = 1; //k表是待取的最小生成树的边数,初值为1,i表示ET1中待扫描边的下标位置
//进行n-1次循环,得到生成树n-1条边
while(k<G.vexnum) {
m1 = ET1.set[i].fromvex;
m2 = ET1.set[i].endvex;
flag = 1;
tag = 0;
for(j=0; j<G.vexnum&&flag; j++) { //求边ET[j]中的两个顶点所在集合的序号m1,m2
p = alist[j];
while(p&&flag) {
if(p->adjvex == m1) {
m1 = j;
tag++;
}
if(p->adjvex == m2) {
m2 = j;
tag++;
}
if(tag == 2) flag = 0;
p = p->next;
}
}
//若两个集合序号不等,则表明ET[i]是生成树的一条边,应把他加入到边集数组ET2中
if(m1 != m2) {
//合并两个集合,并将另一个置为空
p = alist[m1];
while(p->next) p = p->next;
p->next = alist[m2];
alist[m2] = NULL;
ET2->set[k-1].fromvex = ET1.set[i].fromvex;
ET2->set[k-1].endvex = ET1.set[i].endvex;
ET2->set[k-1].weight = ET1.set[i].weight;
k++;
}
i++;
}
for(i=0; i<G.vexnum; i++) {
p = alist[i];
while(p) {
q = p;
p = p->next;
free(q);
}
}
ET2->arc_num = G.vexnum - 1;
ET2->vex_num = G.vexnum;
}
truewill 2004-12-29
  • 打赏
  • 举报
回复
-_-
听都没听过,人命不如写英文吧
一、 功能简介 本课件是一个动态演示数据结构算法执行过程的辅助教学软件, 它可适应读者对算法的输入数据和过程执行的控制方式的不同需求, 在计算机的屏幕上显示算法执行过程中数据的逻辑结构或存储结构的变化状况或递归算法执行过程中栈的变化状况。整个系统使用菜单驱动方式, 每个菜单包括若干菜单项。每个菜单项对应一个动作或一个子菜单。系统一直处于选择菜单项或执行动作状态, 直到选择了退出动作为止。 二、 系统内容 本系统内含84个算法,分属13部分内容,由主菜单显示,与《数据结构》教科书中自第2章至第11章中相对应。各部分演示算法如下: 1. 顺序表 (1)在顺序表中插入一个数据元素(ins_sqlist) (2)删除顺序表中一个数据元素(del_sqlist) (3)合并两个有序顺序表(merge_sqlist) 2. 链表 (1)创建一个单链表(Crt_LinkList) (2)在单链表中插入一个结点(Ins_LinkList) (3)删除单链表中的一个结点(Del_LinkList) (4)两个有序链表求并(Union) (5)归并两个有序链表(MergeList_L) (6)两个有序链表求交(ListIntersection_L) (7)两个有序链表求差(SubList_L) 3. 栈和队列 (1)计算阿克曼函数(AckMan) (2)栈的输出序列(Gen、Perform) (3)递归算法的演示  汉诺塔的算法(Hanoi)  解皇后问题的算法(Queen)  解迷宫的算法(Maze)  解背包问题的算法(Knap) (4)模拟银行(BankSimulation) (5)表达式求值(Exp_reduced) 4. 串的模式匹配 (1)古典算法(Index_BF) (2)求Next 函数值(Get_next)和按Next 函数值进行匹配 (Index_KMP(next)) (3)求 Next 修正值(Get_nextval)和按 Next 修正值进行匹配(Index_KMP(nextval)) 5. 稀疏矩阵 (1)矩阵转置 (Trans_Sparmat) (2)快速矩阵转置 (Fast_Transpos) (3)矩阵乘法 (Multiply_Sparmat) 6. 广义表 (1)求广义表的深度(Ls_Depth) (2)复制广义表(Ls_Copy) (3)创建广义表的存储结构(Crt_Lists) 7. 二叉树 (1)遍历二叉树  二叉树的线索化  先序遍历(Pre_order)  中序遍历(In_order)  后序遍历(Post_order) (2) 按先序建二叉树(CrtBT_PreOdr) (3) 线索二叉树  二叉树的线索化  生成先序线索(前驱或后继) (Pre_thre)  中序线索(前驱或后继) (In_thre)  后序线索(前驱或后继) (Post_thre)  遍历中序线索二叉树(Inorder_thlinked)  中序线索树的插入(ins_lchild_inthr)和删除(del_lchild_inthr)结点 (4)建赫夫曼树和求赫夫曼编码(HuffmanCoding) (5)森林转化成二叉树(Forest2BT) (6)二叉树转化成森林(BT2Forest) (7)按表达式建树(ExpTree)并求值(CalExpTreeByPostOrderTrav) 8. 图 (1)图的遍历  深度优先搜索(Travel_DFS)  广度优先搜索(Travel_BFS) (2)求有向图的强连通分量(Strong_comp) (3)有向无环图的两个算法  拓扑排序(Toposort)  关键路径(Critical_path) (4)求最小生成树  普里姆算法(Prim)  克鲁斯卡尔算法(Kruscal) (5)求关节点和重连通分量(Get_artical) (6)求最短路径  弗洛伊德算法(shortpath_Floyd)  迪杰斯特拉算法(shortpath_DIJ) 9. 存储管理 (1)边界标识法 (Boundary_tag_method) (2)伙伴系统 (Buddy_system) (3)紧缩无用单元 (Storage_compactio
01-001数据结构的概念和基本术语、抽象数据类型的表示与实现 01-002算法设计的要求、算法效率的度量 02-001线性表的类型定义 02-002线性表的顺序表示与实现、线性表的基本操作 02-003单链表的创建与操作、加工型操作、单链表合并 03-001栈的定义与应用、循环链表的定义与操作 03-002栈的应用、数制转换、括号匹配、行编辑问题、迷宫问题 03-003栈的应用:表达式求值、后缀表达式的表示 03-004队列的定义与存储、顺序队列、链式队列、循环队列 04-001串的定义、表示与实现 04-002串的模式匹配算法 04-003串的模式匹配算法的一种改进算法 05-001数组的定义、顺序表示和实现 05-002矩阵相乘的一般算法、稀疏矩阵相乘算法 06-001树的定义和基本术语 06-002习题课:链表、双向循环链表的相关基本操作 06-003习题课:栈的基本操作、KMP算法回顾 06-004二叉树的定义、性质与存储结构 06-005二叉树的前序、中序和后序遍历的递归与非递归算法 06-006统计二叉树中叶子结点个数、按给定的先序序列建立二叉链表 06-007线索链表的建立与遍历 06-008树的存储结构、森林和二叉树的转换、树和森林的遍历 06-009建立树的存储结构的算法、输出树中所有从根到叶子结点路径的算法 06-010前缀编码、哈夫曼树、哈夫曼编码 07-001图的定义、术语与存储结构 07-002图的遍历:深度优先搜索和广度优先搜索 07-003最小生成树算法普里姆算法克鲁斯卡尔算法 07-004双连通图和关节点、源点到其他各点的最短路径 07-005每一对顶点间的最短路径、拓扑排序、关键路径 07-006广义表的定义、表示 07-007创建广义表的存储结构、广义表的删除 07-008习题课:广义表的存储、递归算法、汉诺塔问题、二叉树的基本操作 07-009习题课:图的简单路径、深度优先遍历图的非递归算法等 09-001顺序表的查找、有序表的查找、二分查找 09-002顺序表的查找与有序表的查找性能分析 09-003二分查找的平均查找长度、查找树表 09-004动态查找表:二叉排序树的插入和删除操作 09-005查找的性能分析、平衡二叉树、B-树的定义 09-006B-树的查找过程、B+树的定义与查找 09-007键树的结构特点、哈希表的定义、哈希表的构造方法 09-008哈希表的查找与删除操作、处理冲突的方法 10-001排序的定义、直接插入排序、冒泡排序、快速排序 10-002堆排序、多关键字的排序、基数排序、排序时间复杂度的分析 10-003外部排序的基本过程、索引文件、哈希文件的结构 10-004多关键字文件的特点、倒排文件、判定树、二叉平衡树
1.算法是程序的灵魂,优秀的程序在对海量数据处理时,依然保持高速计算,就需要高效的数据结构和算法支撑。2.网上数据结构和算法的课程不少,但存在两个问题:1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了2)说是讲数据结构和算法,但大多是挂羊头卖狗肉,算法讲的很少。 本课程针对上述问题,有针对性的进行了升级 3)授课方式采用图解+算法游戏的方式,让课程生动有趣好理解 4)系统全面的讲解了数据结构和算法, 除常用数据结构和算法外,还包括程序员常用10大算法:二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法普里姆算法克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、马踏棋盘算法。可以解决面试遇到的最短路径、最小生成树、最小连通图、动态规划等问题及衍生出的面试题,让你秒杀其他面试小伙伴3.如果你不想永远都是代码工人,就需要花时间来研究下数据结构和算法。教程内容:本教程是使用Java来讲解数据结构和算法,考虑到数据结构和算法较难,授课采用图解加算法游戏的方式。内容包括: 稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、列、哈希表、二叉树、二叉树与数组转换、二叉排序树(BST)、AVL树、线索二叉树、赫夫曼树、赫夫曼编码、多路查找树(B树B+树和B*树)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法普里姆算法克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。学习目标:通过学习,学员能掌握主流数据结构和算法实现机制,开阔编程思路,提高优化程序的能力。
第1章 绪论 1.1 数据结构的基本概念和术语 1.1.1 引言 1.1.2 数据结构有关概念及术语 1.1.3 数据结构和抽象数据类型(ADT) 1.2 算法描述与分析 1.2.1 什么是算法 1.2.2 算法描述工具——C语言 1.2.3 算法分析技术初步 习题一 第2章 线性表 2.1 线性表的定义及其运算 2.1.1 线性表的定义 2.1.2 各种运算简介 2.2 线性表的顺序存储结构(向量) 2.2.1 顺序存储结构(向量) 2.2.2 向量中基本运算的实现 2.3 线性表的链表存储结构 2.3.1 单链表与指针 2.3.2 单链表的基本运算 2.4 循环链表和双向链表 2.4.1 循环链表 2.4.2 双向链表 2.4.3 顺序存储结构与链表存储结构的综合分析与比较 2.5 多项式相加问题 2.5.1 多项式相加的链表存储结构 2.5.2 多项式相加的算法实现 2.6 线性表的算法实现举例 2.6.1 实现线性表顺序存储结构及运算的C语言源程序 2.6.2 单链表处理的C语言源程序 习题二 第3章 栈和队列 3.1 栈 3.1.1 栈的定义及其运算 3.1.2 栈的顺序存储结构(向量) 3.1.3 栈的链表存储结构 3.1.4 栈的应用 3.2 队列 3.2.1 队列的定义及运算 3.2.2 队列的顺序存储结构(向量) 3.2.3 队列的链表存储结构 3.3 栈和队列的算法实现举例 习题三 第4章 串 4.1 串的基本概念 4.2 串的存储结构 4.2.1 串的顺序存储 4.2.2 串的链表存储 4.2.3 串变量的存储映象 4.3 串的运算 4.3.1 串的运算简介 4.3.2 串的匹配运算 4.4 文本编辑 习题四 第5章 数组和广义表 5.1 数组的基本概念 5.1.1 数组的概念 5.1.2 数组的顺序表示 5.1.3 特殊矩阵的压缩存储 5.2 稀疏矩阵的三元组存储 5.2.1 三元组表 5.2.2 稀疏矩阵的运算 5.3 稀疏矩阵的十字链表存储 5.3.1 十字链表的组成 5.3.2 十字链表的有关算法 5.4 广义表 5.4.1 广义表的概念和特性 5.4.2 广义表的存储结构 5.4.3 求广义表的深度 5.4.4 广义表的输出 5.4.5 建立广义表的存储结构 5.5 迷宫问题 习题五 第6章 树 6.1 树的基本概念和术语 6.1.1 树的定义 6.1.2 树的常用术语 6.1.3 树的表示方法 6.2 二叉树 6.2.1 二叉树的定义 6.2.2 二叉树的重要性质 6.2.3 二叉树的存储结构 6.2.4 二叉树二叉链表的一个生成算法 6.3 遍历二叉树 6.3.1 先根遍历 6.3.2 中根遍历 6.3.3 后根遍历 6.3.4 二叉树遍历算法的应用 6.4 线索二叉树 6.4.1 线索二叉树的基本概念 6.4.2 线索二叉树的逻辑表示图 6.4.3 中根次序线索化算法 6.4.4 在中根线索树上检索某结点的前趋或后继 6.4.5 在中根线索树上遍历二叉树 6.5 二叉树、 树和森林 6.5.1 树的存储结构 6.5.2 树与二叉树之间的转换 6.5.3 森林与二叉树的转换 6.5.4 一般树或森林的遍历 6.6 树的应用 6.6.1 二叉排序树 6.6.2 哈夫曼树及其应用 6.7 二叉树的建立和遍历C语言源程序示例 习题六 第7章 图 7.1 图的基本概念和术语 7.1.1 图的基本概念 7.1.2 路径和回路 7.1.3 连通图 7.1.4 顶点的度 7.2 图的存储结构 7.2.1 邻接矩阵 7.2.2 邻接链表 7.3 图的遍历和求图的连通分量 7.3.1 图的建立 7.3.2 图的遍历 7.3.3 求图的连通分量 7.4 图的生成树 7.4.1 生成树的概念 7.4.2 最小生成树 7.4.3 普里姆(Prim)算法克鲁斯卡尔(Kruskal)算法 7.5 最短路径 7.5.1 单源顶点最短路径问题求解 7.5.2 求有向网中每对顶点间的路径 7.6 有向无环图及应用 7.6.1 拓扑排序 7.6.2 关键路径 7.7 图的算法C语言程序实现举例 7.7.1 无向图的邻接表的建立和遍历 7.7.2 有向无环图的拓扑排序和求关键路径 习题七 第8章 查找 8.1 基本概念

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧