70,005
社区成员




#include<stdio.h>
#include <stdlib.h>
#define OVERFLOW -2
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define INFINITY 1000
#define MAX_VERTEX_NUM 100
typedef int Status;
typedef enum{
DG,DN,UDG,UDN //有向图,有向网,无向图,无向网
}GraphKind;
typedef int VRType;
typedef int VertexType;
typedef int InfoType;
typedef struct ArcCell{
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;
int LocateVex(MGraph G,int v){
int i;
for(i=0;i<G.vexnum;++i){
if(G.vexs[i]==v){
return i;
}
}
return -1;
}
Status CreateUDN(MGraph &G){
VertexType v1,v2;
int w,i,j,k;int a[3];
printf("请输入无向网G的顶点数,弧数,并用逗号隔开\n");
scanf("%d,%d",&G.vexnum,&G.arcnum);
printf("请依次输入无向网G的顶点名称,用空格隔开\n");
getchar();
for(i=0;i<G.vexnum;++i){
scanf("%c",G.vexs[i]);
}
for(i=0;i<G.vexnum;++i){
for(j=0;j<G.vexnum;++j){
G.arcs[i][j].adj=INFINITY;
}
}
printf("输入无向网中每条弧的两顶点和权值\n");
for(k=0;k<G.arcnum;++k){
scanf("%d",&v1);
scanf("%d",&v2);
scanf("%d",&w);
i=LocateVex(G,v1);
j=LocateVex(G,v2);
G.arcs[i][j].adj=w;
G.arcs[j][i]=G.arcs[i][j];
}
return OK;
}
Status CreateUDG(MGraph &G){
VertexType v1,v2;
int i,j,k;
printf("请输入无向图G的顶点数,弧数,用逗号隔开\n");
scanf("%d,%d",&G.vexnum, &G.arcnum);
printf("请输出无向图的顶点名称\n");
for(i=0;i<G.vexnum;++i){
scanf("%d",&G.vexs[i]);
}
for(i=0;i<G.vexnum;++i){
for(j=0;j<G.vexnum;++j){
G.arcs[i][j].adj=0;
}
}
printf("输入两个顶点确定一条弧的两个顶点名称\n");
for(k=0;k<G.arcnum;++k){
scanf("%d",&v1);
scanf("%d",&v2);
i=LocateVex(G,v1);
j = LocateVex(G, v2);
G.arcs[i][j].adj = 1;
G.arcs[j][i] = G.arcs[i][j];
}
return OK;
}
Status CreateDN(MGraph &G){
VertexType v1, v2;
int w, i, j,k;
printf("请输入有向网的顶点数,弧数,用逗号隔开\n");
scanf("%d,%d", &G.vexnum, &G.arcnum);
printf("请依次输入有向网G的顶点名称\n");
for(i = 0; i < G.vexnum; ++i) {
scanf("%d", &G.vexs[i]);
}
for(i = 0; i < G.vexnum; ++i) {
for(j = 0; j < G.vexnum; ++j) {
G.arcs[i][j].adj = INFINITY;
}
}
printf("请输入有向网G每条弧依附的两顶点名称及权值\n");
for(k=0;k<G.arcnum;++k){
scanf("%d",&v1);
scanf("%d",&v2);
scanf("%d",&w);
i=LocateVex(G,v1);
j=LocateVex(G,v2);
G.arcs[i][j].adj=w;
}
return OK;
}
Status CreateDG(MGraph &G){
VertexType v1, v2;
int i, j,k;
printf("请输入有向图的顶点数,弧数,用逗号隔开\n");
scanf("%d,%d", &G.vexnum, &G.arcnum);
printf("请依次输入有向图G的顶点名称\n");
for( i = 0; i < G.vexnum; ++i) {
scanf("%d", &G.vexs[i]);
}
for(i = 0; i < G.vexnum; ++i) {
for( j = 0; j < G.vexnum; ++j) {
G.arcs[i][j].adj = 0;
}
}
printf("请输入有向网G每条弧依附的两顶点名称及权值\n");
for(k=0;k<G.arcnum;++k){
scanf("%d",&v1);
scanf("%d",&v2);
i=LocateVex(G,v1);
j=LocateVex(G,v2);
G.arcs[i][j].adj=1;
}
return OK;
}
Status CreatGraph(MGraph &G){
printf("请输入图类型\n有向图为0\n有向网为1\n无向图为2\n无向网为3\n");
scanf("%d",&G.kind);
switch(G.kind){
case 0: return CreateDG(G); //构造有向图G
case 1: return CreateDN(G); //构造有向网G
case 2: return CreateUDG(G); //构造无向图G
case 3: return CreateUDN(G); //构造无向网G
default : return ERROR;
}
}
Status PrintM(MGraph G){
int i,j;
printf(" ");
for(i=0;i<G.vexnum;i++){
printf("%3d",G.vexs[i]);
}
printf("\n");
printf(" ");
for(i=0;i<G.vexnum;i++){
printf("-----");
}
printf("\n");
for(i=0;i<G.vexnum;i++){
printf("%3d|",G.vexs[i]);
for(int j=0;j<G.vexnum;j++){
if(G.arcs[i][j].adj==INFINITY){
printf("∞");
}
else{
printf("%3d",G.arcs[i][j].adj);
}
}
printf("\n |\n");
}
}
int FirstAdjVex(MGraph G,VertexType v){
int j=0;int i;
int k=LocateVex(G,v);
if(G.kind==1||G.kind==3){
j=INFINITY;
}
for(i=0;i<G.vexnum;++i){
if(G.arcs[k][i].adj!=j){
return i;
}
}
return -1;
}
int NextAdjVex(MGraph G, VertexType v, VertexType w){
int j = 0;
int k1 = LocateVex(G, v);
int k2 = LocateVex(G, w);
if(G.kind == DN || G.kind == UDN) {
j = INFINITY;
}
for(int i= k2 + 1; i < G.vexnum; ++i) {
//若找到则返回i
if(G.arcs[k1][i].adj != j) {
return i;
}
}
return -1;
}
Status Print(int v){
printf("%4d",v);
return OK;
}
int visited[MAX_VERTEX_NUM];
Status(*VisitFunc)(int v);
void DFS(MGraph G,int v){
visited[v]=TRUE;
VisitFunc(G.vexs[v]);
for(int w=FirstAdjVex(G,G.vexs[v]);w>=0;
w=NextAdjVex(G,G.vexs[v],G.vexs[w])){
if(!visited[w]){
DFS(G,w);
}
}
}
void DFSTraverse(MGraph G, Status (*Visit)(int v)){
VisitFunc=Visit;
for(int v=0;v<G.vexnum;++v){
visited[v]=FALSE;
}
for(int v = 0; v < G.vexnum; ++v) {
if(!visited[v]) {
DFS(G, v);
}
}
}
int main(){
MGraph G;
VertexType v1, v2;
int n;
printf("创建图\n");
CreatGraph(G);
// printf("图的邻接矩阵\n");
// PrintM(G);
printf("\n深度优先遍历结果: ");
DFSTraverse(G, Print);
}