最近复习了下数据结构,把一下比较重要的算法敲了一遍,收获颇多。
图的基本操作:
1.创建一个图
2.显示图的基本信息.
3.显示所有节点的度
4.显示拓扑序列
5.深度优先搜索
6.广度优先搜索
7.用邻接矩阵创建图
8.输出最小生成树
9.输出顶点V到其他顶点的最短路径
10.弗洛伊德最短路径算法
代码如下:
#include<stdio.h>
#include<stdlib.h>
#define MAX_VERTEX_NUM 20
#define INF 100
typedef struct ArcNode{ //弧信息
int adjvex; //该弧所指向顶点的位置
struct ArcNode * nextarc; //下一条弧的指针
int weight; //权值
}ArcNode,*LinkList;
typedef struct VNode{ //节点信息
int data,in,out; //顶点信息,入度与出度
ArcNode * firstarc; //该顶点指向第一条弧的指针
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct Graph{
AdjList vertices; //顶点数组
int arcnum,vexnum; //弧和顶点的个数
int kind; //图的类型
}Graph;
typedef struct MGraph{ //临接矩阵
int arces[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int arcnum,vexnum;
int kind;
}MGraph;
int visit[MAX_VERTEX_NUM];
void CreateGraph(Graph *g);
void CreateDG(Graph *g); //创建有向图
void CreateUDG(Graph *g); //创建无向图
ArcNode * Create();
void CreateMGraph(MGraph *g); //用邻接矩阵创建图
void GraphDegree(Graph *g); //输出每个顶点的度
void GraphTopu(Graph *g); //输出图的拓扑序列
void DFS(Graph *g,int v); //深度优先搜索
void BFS(Graph *g); //广度优先搜索
void ShowGraph(Graph *g);
void ShowMGraph(MGraph *g);
void CreateMenu();
void MinPrimTree(MGraph * g,int v); //prim最小生成树
void MinPath(MGraph * g,int v); //dijsktra最短路径
void Floyd(MGraph * g); //弗洛伊德
void main()
{
int select=1;
char ch;
Graph g;
MGraph mg;
while(select)
{
system("cls");
CreateMenu();
scanf("%d",&select);
switch (select)
{
case 0:
exit(1);
break;
case 1:
CreateGraph(&g);
break;
case 2:
ShowGraph(&g);
break;
case 3:
GraphDegree(&g);
break;
case 4:
GraphTopu(&g);
break;
case 5:
printf("深度优先搜索序列如下:\n");
DFS(&g,0);
break;
case 6:
BFS(&g);
break;
case 7:
CreateMGraph(&mg);
// ShowMGraph(&mg);
break;
case 8:
MinPrimTree(&mg,3);
break;
case 9:
MinPath(&mg,0);
break;
case 10:
Floyd(&mg);
break;
}
if(select == 1 || select == 2||select == 3||select == 4||select == 5||select == 6
||select == 7||select == 8||select == 9 ||select == 10)
{
printf("按回车键继续!");
scanf("%c%*c",&ch);