我写的深度优先遍历,看了半天也没找出错误,但是就是不能成功运行出来。
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define MAX 32767
#define msize 20
#define T char
typedef struct Graph {
int vertices;//最大顶点数
int numver;//现有顶点数
int numedg;//边数
T *verlist;//顶点表
int **edge;//矩阵表
int weigth;//权值
int *dis;//记录起点到顶点距离
int *vis;//标记访问情况
int* mark;//DFS标记
}Graph;
void inicial(Graph* g) {
g->vertices = msize;
g->numedg = g->numver =0;
g->verlist = (T*)malloc(sizeof(T) * (g->vertices));
g->edge = (int**)malloc(sizeof(int*) * g->vertices);
g->dis = (int*)malloc(sizeof(int) * g->vertices);
g->vis = (int*)malloc(sizeof(int) * g->vertices);
g->mark = (int*)malloc(sizeof(int) * g->vertices);
for (int i = 0; i < g->vertices; ++i) {
g->edge[i] = (int*)malloc(sizeof(int) * g->vertices);
}
for (int i = 0; i < g->vertices; i++) {
for (int j = 0; j < g->vertices; ++j) {
g->edge[i][j] = MAX;
if (i == j)
g->edge[i][j] = 0;
}
}
for (int i = 0; i < g->numver; i++) {
g->mark[i] = false;
}
}
int getarray(Graph* g, T v) {
for (int i = 0; i < g->numver; ++i) {
if (g->verlist[i] == v)
return i;
}
return -1;
}
void addver(Graph* g, T v) {
if (g->numver >= g->vertices)
return;
g->verlist[g->numver++] = v;
}
void addedg(Graph* g, T v1, T v2, int weight) {
int p1 = getarray(g, v1);
int p2 = getarray(g, v2);
if (p1 == -1 || p2 == -1)
return;
if (g->edge[p1][p2]!=32767)
return;
g->edge[p1][p2] = g->edge[p2][p1] = weight;
g->numedg++;
}
void show(Graph* g) {
for (int i = 0; i < g->numver; ++i) {
printf("%c ", g->verlist[i]);
}
printf("\n");
for (int i = 0; i < g->numver; i++) {
printf("%c ", g->verlist[i]);
for (int j = 0; j < g->numver; j++) {
if(g->edge[i][j]==32767)
printf("∞ ");
else {
printf("%d ", g->edge[i][j]);
}
}
printf("\n");
}
printf("\n");
}
void DFS(Graph *g,int ver) {
//int p1 = getarray(g, ver);
printf("%c\t", g->verlist[ver]);
printf("%d", g->numver);
//g->mark[ver] = 1;
for (int i = 0; i < g->numver; i++) {
if (g->edge[ver][i] != 0 && g->edge[ver][i]!=MAX&& !g->mark[i]) {
g->mark[i] = true;
DFS(g, i);
}
}
}
void Dijkstra(Graph* g, T start, T end) {
int p;//下一个点的下标
int p1 = getarray(g, start);
int p2 = getarray(g, end);
for (int i = 0; i < g->numver; i++) {
g->vis[i] = 0;
g->dis[i] = g->edge[p1][i];
}
g->vis[p1] = 1;//标记源点
for (int k = 0; k < g->numver; k++) {
int min = 100;
for (int i = 0; i < g->numver; i++) {
if (g->vis[i] == 0 && MAX > g->dis[i]) {
min = MAX;
p = i;
}
}
g->vis[p] = 1;
for (int i = 0; i < g->numver; i++) {
if (!g->vis[i] && g->dis[i] > g->dis[p] + g->edge[p][i]) {
g->dis[i] = g->dis[p] + g->edge[p][i];
}
}
}
//printf("%c", g->verlist[p2]);
printf("%d", g->dis[p2]);
}
int main() {
Graph G;
inicial(&G);
addver(&G,'a');
addver(&G, 'b');
addver(&G, 'c');
addver(&G, 'd');
addver(&G, 'e');
addedg(&G, 'a', 'b', 10);
addedg(&G, 'a', 'd', 5);
addedg(&G, 'b', 'd', 3);
addedg(&G, 'c', 'e', 9);
addedg(&G, 'a', 'c', 4);
show(&G);
addver(&G, 'f');
addedg(&G, 'd', 'f', 7);
printf("--------");
printf("\n");
show(&G);
Dijkstra(&G, 'a', 'b');
Dijkstra(&G, 'b', 'c');
printf("--------");
G.mark[1] = true;
DFS(&G,1);
}
希望各位能帮我看看哪里出错了,并帮我解决一下,还有就是能否告知一下,如果用我定义的图怎么实现广度优先遍历。