徐州工程学院数据结构最小生成树实验文档
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
for(j=0;j<G->vexnum-1;++j){ seat = minimize( G,A ); printf("select min: %d\n", seat); A[seat].know = 1; p=G->LH[seat].firstarc; for (p; p != NULL; p=p->nextarc){ i=p->adjvex; if(A[i].know == 0 && p->weight < A[i].lowcost){ A[i].nextvex = G->LH[seat].data; A[i].lowcost = p->weight; } }
}
location = search(G ,u);// 确定 u 元素在头结点数组中的位置 for (p=G->LH[location].firstarc ; p != NULL; p=p->nextarc ){
i = p->adjvex; A[i].nextvex = G->LH[location].data; A[i].lowcost = p->weight; A[i].know = 0; } A[location].know = 1; A[location].lowcost = 0; A[location].nextvex = '0';
// 建图
int search(Graph *G,char a);
int i,n1,n2,w; char a,b; ArcNode *p, *q;
printf(" 请输入顶点个数和边的条数: \n"); scanf("%d %d",&G->vexnum,&G->arcnum); printf(" 请输入顶点信息 \n"); for (i = 0; i < G->vexnum; ++i){
}
printtable(A); // 打印辅助数组中的信息 for (j = 0; j < G->vexnum; ++j)
if (j != location) printf("%c<---->%c\n",A[j].nextvex,G->LH[j].data);
}
int minimize(Graph *G, Auxiliary_array A[]){// 取出辅助数组中权值最小的顶点所在的位 置
实验总结: 通过该实验,我深刻明白到了自己对循环的能力不足,书写代码的逻辑性也不够强, 相信在以后的学习中能加强这方面的学习, 争取在以后的学习中解决这两个方面的问 题。
q=G->LH[n2].firstarc; if(q == NULL){
q=G->LH[n2].firstarc=(ArcNode *) malloc (sizeof(ArcNode)); } else{
while( q->nextarc !=NULL ){ q=q->nextarc;
} q=q->nextarc=(ArcNode *) malloc (sizeof(ArcNode)); }
char u;
Graph UDG;
Graph *G = &UDG;
buildtu(G);
printgraph(G);
// 打印图
printf(" 请输入起始顶点: \n");
while(getchar()!='\n');
u = getchar();
prim(G ,u); }
void buildtu (Graph *G) {
3.现在公司想以最小的代价将所有城市连通,方便所有城市间通信,请用 普里姆算法和克鲁斯卡尔算法实现本图的最小生成树
#include <stdio.h> #include <stdlib.h> #define INF 50
typedef struct ArcNode{ int adjvex; struct ArcNode *nextarc; int weight;
Auxiliary_array int i,j,seat; int location; ArcNode *p ;
A[6];
// 创建辅助数组
for (i = 0; i < G->vexnum; ++i) { A[i].nextvex = '0'; A[i].know = 0; A[i].lowcost = INF;
p->adjvex=n2; p->weight=w; p->nextarc=NULL;
q->adjvex=n1; q->weight=w; q->nextarc=NULL; } }
பைடு நூலகம்
int search (Graph *G,char a){ // 确定顶点 a 在头结点数组中的位置 int i; for(i=0;i<G->vexnum;++i){ if(G->LH[i].data==a){ return i; } }
int i,place,num; num = INF; for (i = 0; i < G->vexnum; ++i){
if(A[i].know == 0 && num >= A[i].lowcost){ num = A[i].lowcost; place = i;
} } return place; }
while (getchar()!='\n'); scanf("%c",&G->LH[i].data); G->LH[i].firstarc = NULL; } printf(" 请输入有关系的结点和该边的权重 :\n"); for(i=0;i<G->arcnum;++i){
while (getchar()!='\n'); scanf("%c %c %d",&a,&b,&w); n1=search(G,a); n2=search(G,b);
三、实验要求
DOS或 Windows;
1.能够独立完成带权图的存储和最小生成树的生成
四、实验内容
1.在自己的 U盘的“姓名 +学号”文件夹中创建“实验 9”文件夹,本 次实验的所有程序和数据都要求存储到本文件夹中。
2.现在某电信公司要对如下图的几个城市之间进行光纤连接布线,请 用合适的存储结构将下图存储到计算机中方便进行处理。
}ArcNode;
// 该弧所指向的顶点位置 // 下一个临接点
// 弧的权重 // 表结点
typedef struct VNode{ char data; ArcNode *firstarc;
}VNode,AdjList[6];
// 顶点信息 // 指向下一个结点
typedef struct{ AdjList LH; int vexnum; int arcnum;
}Graph;
// 创建头结点数组 // 图的点的个数 // 图的边的个数
typedef struct{ char nextvex; int lowcost; int know;
}Auxiliary_array;
// 辅助数组结构体
void main (void){ void buildtu (Graph*); void printgraph(Graph*); void prim( Graph *G, char u);
printf("firstarc->adjvex=%d",p->adjvex);
p=p->nextarc;
}
printf("\n");
}
}
void prim( Graph *G, char u){// 用 prim 算法实现最小生成树 int search (Graph *G,char a); int minimize(Graph *G, Auxiliary_array[]); void printtable(Auxiliary_array[]);
void printtable(Auxiliary_array A[]) {// 打印辅助数组 int i; for (i = 0; i < 6; i++) { printf("modifier:%c lowcost:%d known:%d\n",
A[i].know); }
}
A[i].nextvex, A[i].lowcost,
p=G->LH[n1].firstarc; if(p == NULL){
p=G->LH[n1].firstarc=(ArcNode *) malloc (sizeof(ArcNode)); } else{
while( p->nextarc !=NULL ){ p=p->nextarc;
} p=p->nextarc=(ArcNode *) malloc (sizeof(ArcNode)); }
}
void printgraph(Graph *G){ int i;
// 打印图
ArcNode *p;
for (i=0 ; i < G->vexnum; ++i)
{
p=G->LH[i].firstarc;
printf("data:%c \t",G->LH[i].data);
while(p!=NULL){
实验九图的最小生成树算法的实现
实验预备知识: 1.理解图最小生成树的意义和相应算法。 2.掌握带权图的存储结构。
一、实验目的
1.使学生熟悉最小生成树的算法实现。 2.掌握带权图的存储结构和处理方法。
二、实验环境
⒈ 硬件:每个学生需配备计算机一台。操作系统: ⒉ 软件: DOS或 Windows操作系统 +Turbo C;