实现有向图、无向图、有权图、无权图的邻接矩阵和邻接表表示方法
//实现有向图、无向图、有权图、无权图的邻接矩阵和邻接表表示方法 //邻接矩阵 #define maxn 64 //最大顶点数 typedef char vtype //设当前顶点为字符类型 typedef int adjtype //设邻接矩阵A中元素aij为整型 typedef struct { vtype V[maxn]; //顶点存储空间 adjtype A[maxn][maxn]; //邻接矩阵 }mgraph; //图的说明符 void createmgraph(mgraph G) //建立无向图的邻接矩阵法的算法 { int i, j, n; vtype ch, u, v; adjtype w; i = n = 0; ch = getchar(); //输入顶点 while(ch != '#') //'#'为结束符 { n++; //顶点计数 if(n > maxn - 1) ERROR(n); //溢出处理 G.V[i++] = ch; //存入顶点 ch = getchar(); } for(i = 0; i < n; i++) //初始化邻接矩阵 for(j = 0; j < n; j++) G.A[i][j] = max; //设max为机器表示的无穷大 scanf("%c %c %d", &u, &v, &w) //读入一条边 while(u != '#') //u='#'时结束 { i = locatevex(G, u); //求u的序号 j = locatevex(G, v); //求v的序号 G.A[i][j] = G.A[j][i] = w; //邻接矩阵的赋值(对称) scanf("%c %c %d", &u, &v, &w); //读入下一条边 } } //邻接表 typedef struct node //链表节点类型 { int adj; //临界点域 int w; //存放边上的权 struct node *next; //指向下一弧或边 }linknode; typedef struct //顶点类型 { vtype data; //顶点值域 linknode *farc; //指向与本顶点关联的第一条弧或边 }Vnode; Vnode G[maxn]; //顶点表 void createadj(vnode G[maxn]) //建立无向图邻接表算法 { int i, j, n; linknode *p; vtype ch, u, v; i = n = 0; ch = getchar(); //读入顶点(设数据为字符) while(ch != '#') //'#'为结束符 { n++; //顶点计数 G[i].data = ch; //存入顶点 G[i].farc = NULL; //置空表 i++; ch = getchar(); } scanf("%c %c", u, v); //读入一条边 while(u != '#') //u='#'时结束 { i = locatevex(G, u); //求u的序号 j = locatevex(G, v); //求v的序号 //建立v1到v2的链接 p = (linknode*)malloc(sizeof(linknode)); //申请链表节点 p -> adj = j; //存入临界点序号 p -> next = G[i].farc; //将p节点作为单链表的第一节点插入 G[i].farc = p; //由无向图的对称性建立V1到V2的链接 p = (linknode*)malloc(sizeof(linknode)); p -> adj = i; p -> next = G[j].farc; G[j].farc = p; scanf("%c %c", &u, &v); //读下一条边 } }实现图的深度优先搜索、广度优先搜索
//实现图的深度优先搜索、广度优先搜索 //深度优先搜索算法 void DFS(Vnode G[], int v) { int u; visit(G, v); visited[v] = True; u = firstadj(G, v); while(u >= 0) { if(visit[u] == False) DFS{G, u}; u = nextadj(G, v, u); } } //广度优先搜索算法 void BFS(Vnode G[], int v) { int u; Clearqueue(Q); visit(G, v); visited[v] = True; Equeue(Q, v); while(!Emptyqueue(Q)) { v = Delqueue(Q); u = firstadj(G, v); while(u >= 0) { if(visitied[u] == False) { visit(G, u); visited[u] = True; Equeue(Q, u); } u = nextadj(G, v, u); } } }实现 Dijkstra 算法、A* 算法
//实现 Dijkstra 算法、A* 算法 typedef struct { int pi[n]; int end; }pathtype; pathtype path[n]; int dist[n]; void Dijkstra(mgraph G, pathtype path[], int dist[], int v, int n) { int i, count, S[n], m, u, w; for(i = 0; i < n; i++) { S[i] = 0; dist[i] = G.A[v][i]; path[i].pi[0] = v; path[i].end = 0; } S[v] = 1; count = 1; while(count <= n-1) { m = max; for(w = 0; w <= n - 1; w++) { if(S[w] == 0 && dist[w] < m){ u = w; m = dist[w]; } if(m = max) break; S[u] = 1; path[u].end++; path[u].pi[end] = u; for(w = 0; w <= n - 1; w++) { if(S[w] == 0 && dist[w] > dist[u] + G.A[u][w]) { dist[w] = dist[u] + G.A[u][w]; path[w] = path[u]; } count++; } } } }实现拓扑排序的 Kahn 算法、DFS 算法
//实现拓扑排序的 Kahn 算法、DFS 算法 void Creatid(Vexnode G[], int n, int id[]) { int count, i; arcnode *p; for(i = 0; i < n; i++){ count = 0; p = G[i].fin; while(p) { count++; p = p->hlink; } id[i] = count; } } void Topsort(Vexnode G[], int n) { int i, j, k, count, id[]; arcnode *p; Creatid(G, n, id); Clearstack(s); for(i = 0; i < n; i++) if(id[i] == 0) Push(s, i); count = 0; while(!Emptystack(s)) { j = Pop(s); output(j, G[j].data); count++; p = G[j].fout; while(p) { k = p->head; id[k]--; if(id[k] == 0) Push(s, k); p = p->tlink; } } if(count == n) printf("This graph has not cycle."); else printf("This graph has cycle."); }