设计并验证如下算法:带权图采用邻接表表示,实现无向图的广度优先搜索与有向图的深度优先搜索。
#define MAX_VERTEX_NUM 20 //图的邻接表存储表示
typedef struct ArcNode{
int adjvex; //该弧所指向的顶点的位置
struct ArcNode *nextarc; //指向下一条弧的指针
InfoType *info; //该弧相关信息的指针
}ArcNode;
typedef struct VNode {
VertexType data; //顶点信息
ArcNode *firstarc; //指向第一条依附该顶点弧的指针
}VNode,AdjList[MAX_VERTEX_NUM]
Typedef struct {
AdjList vertices;
int vexnum,arcnum; //图的当前顶点数和弧数
int kind; //图的种类标志
}ALGraph;
以上是题目以及题目给的提示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
| #include<stdio.h> #include<stdlib.h> #define MAX_VERTEX_NUM 20 #define InfoType int #define VertexType char
typedef struct ArcNode{ int adjvex; struct ArcNode *nextarc; InfoType *info; }ArcNode;
typedef struct VNode { VertexType data; ArcNode *firstarc; }VNode,AdjList[MAX_VERTEX_NUM];
typedef struct { AdjList vertices; int vexnum,arcnum; int kind; }ALGraph; int vs[20]={0,};
int LocateVex(ALGraph G,char v){ for(int i=0;i<G.vexnum;i++){ if(v==G.vertices[i].data) return i; } printf("input error ! input again:\n"); scanf("%c",&v); getchar(); LocateVex(G,v); return -1; }
void PrintUDG(ALGraph G){ int i,j; for(i=0;i<G.vexnum;i++){ printf("%d=%c:",i,G.vertices[i].data); ArcNode *p; p=G.vertices[i].firstarc; while(p!=NULL){ printf("->%2d",p->adjvex); p=p->nextarc; } printf("\n"); } }
void create(ALGraph &p) { printf("input the graph's kind (1 Undirected 2 Directed):\n"); scanf("%d",&p.kind); printf("input the graph's vex and arc . \n"); scanf("%d%d",&p.vexnum,&p.arcnum); getchar(); for(int i=0;i<p.vexnum;i++){ printf("vertex(%d): \n" ,i); scanf("%c",&p.vertices[i].data); getchar(); p.vertices[i].firstarc=NULL; } char v1 ,v2; int k ,j; for(int i=0;i<p.arcnum;i++){ printf("input two vertex :\n"); v1 = getchar(); getchar(); v2 = getchar(); getchar(); j = LocateVex(p, v1); k = LocateVex(p, v2); ArcNode *q = (ArcNode *)malloc(sizeof(ArcNode)); q->adjvex=k; q->nextarc=p.vertices[j].firstarc; p.vertices[j].firstarc=q; if(p.kind==1){ ArcNode *g = (ArcNode *)malloc(sizeof(ArcNode)); g->adjvex=j; g->nextarc=p.vertices[k].firstarc; p.vertices[k].firstarc=g; } } }
int visit[20]={0}; void DFS(AdjList G,int v){ ArcNode *p; visit[v]=1; printf("%d ",v); p=G[v].firstarc; while(p!=NULL){ if(visit[p->adjvex]==0){ DFS(G,p->adjvex); vs[p->adjvex]=2; } p=p->nextarc; } }
void BFS(AdjList G,int v) { ArcNode *p; int Qu[20],front,rear; int visited[20]={0}; int w; front=rear=0; printf("%d ",v); visited[v]=1; rear=(rear+1); Qu[rear]=v; while(front!=rear){ front=(front+1); w=Qu[front]; p=G[w].firstarc; while(p){ if(visited[p->adjvex]==0){ printf("%d ",p->adjvex); visited[p->adjvex]=1; vs[p->adjvex]=2; rear=(rear+1); Qu[rear]=p->adjvex; } p=p->nextarc; } } }
|
程序运行说明:
1.先输入1或者2构造的图的类型。
2.然后输入顶点个数与弧的个数。
3.再依次输入顶点的名称例如:A B C
4.再输入两个顶点的名称,构造图。
5.最后输入一个起始的点的序号。
最后一个比如你想输入起始点为A点,那你就输入1.
有向图与无向图一样输入
有什么问题欢迎留言,看到就会回答。。