#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define INF 32767
#define MAVX 100
#define MAXE 100
typedef int InfoType;
typedef int Vertex;
typedef struct
{
int no;
InfoType info;
}VertexType;
typedef struct
{
int edges[MAVX][MAVX];
int vexnum,arcnum;
VertexType vexs[MAVX];
}MGraph;
typedef struct ANode
{
int adjvex;
struct ANode *nextarc;
InfoType info;
}ArcNode;
typedef struct Vnode
{
Vertex data;
ArcNode *firstarc;
}VNode;
typedef VNode AdjList[MAVX];
typedef struct
{
AdjList adjlist;
int n,e;
}ALGraph;
typedef struct
{
int u;
int v;
int w;
}Edge;
int visited[MAVX];
void MatToList(MGraph g,ALGraph * &G)
{
int i,j,n=g.vexnum;
ArcNode *p;
G=(ALGraph *)malloc(sizeof(ALGraph));
for(i=0;i<n;i++)
G->adjlist[i].firstarc=NULL;
for(i=0;i<n;i++)
for(j=n-1;j>=0;j--)
if(g.edges[i][j]!=0)
{
p=(ArcNode *)malloc(sizeof(ArcNode));
p->adjvex=j;
p->info=g.edges[i][j];
p->nextarc=G->adjlist[i].firstarc;
G->adjlist[i].firstarc=p;
}
G->n=n;
G->e=g.arcnum;
}
void DispMat(MGraph g)
{
int i,j;
for(i=0;i<g.vexnum;i++)
{
for(j=0;j<g.vexnum;j++)
if(g.edges[i][j]==INF)
printf("%3s","∞");
else
printf("%3d",g.edges[i][j]);
printf("\n");
}
}
void DispAdj(ALGraph *G)
{
int i;
ArcNode *p;
for(i=0;i<G->n;i++)
{
p=G->adjlist[i].firstarc;
if(p!=NULL)printf("%3d:",i);
while(p!=NULL)
{
printf("%3d",p->adjvex);
p=p->nextarc;
}
printf("\n");
}
}
void SortEdge(MGraph g,Edge E[])
{
int i,j,k=0;
Edge temp;
for(i=0;i<g.vexnum;i++)
for(j=0;j<g.vexnum;j++)
if(g.edges[i][j]<INF)
{
E[k].u=i;
E[k].v=j;
E[k].w=g.edges[i][j];
k++;
}
for(i=1;i<k;i++)
{
temp=E[i];
j=i-1;
while(j>=0 && temp.w<E[j].w)
{
E[j+1]=E[j];
j--;
}
E[j+1]=temp;
}
}
void Kruskal(Edge E[],int n,int e)
{
int i,j,m1,m2,sn1,sn2,k;
int vset[MAXE];
for(i=0;i<n;i++) vset[i]=i;
k=1;j=0;
while(k<n)
{
m1=E[j].u; m2=E[j].v;
sn1=vset[m1];sn2=vset[m2];
if(sn1!=sn2)
{
printf("(%d,%d):%d\n",m1,m2,E[j].w);
k++;
for(i=0;i<n;i++)
if(vset[i]==sn2)
vset[i]=sn1;
}
j++;
}
}
int main()
{
int i,j,u=3;
MGraph g;
Edge E[MAXE];
int A[MAVX][11];
g.vexnum=6;
g.arcnum=10;
for(i=0;i<g.vexnum;i++)
for(j=0;j<g.vexnum;j++)
A[i][j]=INF;
A[0][1]=5; A[0][2]=8;A[0][3]=7; A[0][5]=3;
A[1][2]=4;
A[2][3]=5;A[2][5]=9;
A[3][4]=5;
A[4][5]=1;
for(i=0;i<g.vexnum;i++)
for(j=0;j<g.vexnum;j++)
A[j][i]=A[i][j];
for(i=0;i<g.vexnum;i++)
for(j=0;j<g.vexnum;j++)
g.edges[i][j]=A[i][j];
SortEdge(g,E);
printf("\n");
printf("图G的邻接矩阵:\n");
DispMat(g);
printf("\n");
printf("Kruskal(克鲁斯卡尔)算法求解结果:\n");
Kruskal(E,g.vexnum,g.arcnum);
printf("\n\n");
return 0;
}
数据结构源码笔记(C语言描述)汇总: