那位大哥哥来帮帮我,图的深度优先搜索问题!谢谢!

fly_2006 2006-05-29 03:59:27
下面是对无向图进行深度优先搜索,怎么打印出的结果不全啊,请师傅帮我看看好吗?

#include <stdio.h>
#include <stdlib.h>
#define N 20

typedef struct arc
{
int index; /* 弧头结点在图数组中的序号 */
struct arc *nextarc;
}*Arc;

typedef struct
{
int info; /* 顶点的信息 */
Arc firstarc; /* 每个顶点的第一条边 */
}Graph;

static void CreateGraph(Graph g[]); /* 创建图 */
static int LocateNode(Graph g[], int v, int n); /* 查找顶点在图数组中的序号 */
static void PrintGraph(Graph g[], int n); /* 打印图 */
static void DepthFirstSearch(Graph g[], int i, int temp[]); /* 深度优先搜索 */

int main(void)
{
Graph g[N];

CreateGraph(g);

return 0;
}

static void CreateGraph(Graph g[])
{
int i, j, k, n, e, v1, v2; /* n, e 分别代表顶点的数量和边的数量 */
Arc p, q;

printf("Enter n and e: ");
scanf("%d %d", &n, &e); /* 读取顶点的数量和边的数量 */

printf("Enter every node information: ");
for (k = 0; k < n; k++)
{
scanf("%d", &g[k].info); /* 读取每个顶点的信息 */
g[k].firstarc = NULL; /* 初始化每个顶点的头指针 */
}

printf("Enter every edge: \n");
for (k = 0; k < e; k++)
{
scanf("%d %d", &v1, &v2); /* 读取组成每条边的两个顶点 */

i = LocateNode(g, v1, n);
j = LocateNode(g, v2, n); /* 查找这两个顶点在图数组中的序号 */

if ((p = (Arc)malloc(sizeof(struct arc))) == NULL)
{
exit(1);
}
p -> index = j; /* 指向弧头结点在数组中的序号 */
p -> nextarc = g[i].firstarc; /* 指向弧尾 */
g[i].firstarc = p;

if ((q = (Arc)malloc(sizeof(struct arc))) == NULL)
{
exit(1);
}
q -> index = i;
q -> nextarc = g[j].firstarc;
g[j].firstarc = q;
}

PrintGraph(g, n); /* 打印图,按深度优先搜索 */
}

static int LocateNode(Graph g[], int v, int n)
{
int i;

for (i = 0; i < n; i++)
{
if (g[i].info == v)
{
return i;
}
}
}

static void PrintGraph(Graph g[], int n)
{
int temp[N], i;

for (i = 0; i < n; i++)
{
temp[i] = 0; /* 初始化辅助数组 */
}

for (i = 0; i < n; i++)
{
if (temp[i] == 0)
{
DepthFirstSearch(g, i, temp); /* i 代表下标 */
}
}
putchar('\n');
}

static void DepthFirstSearch(Graph g[], int i, int temp[])
{
int k;
Arc p;

temp[i] = 1; /* 以访问过设置成 1 */

printf("%d ", g[i].info); /* 打印顶点信息 */

p = g[i].firstarc; /* p 指向当前顶点链表的头结点 */
k = p -> index;

while (p)
{
if (temp[k] == 0)
{
DepthFirstSearch(g, k, temp);
}

p = p -> nextarc;
k = p -> index;
}
}






















...全文
170 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jixingzhong 2006-05-29
  • 打赏
  • 举报
回复
/* 主程式: 建立图形后,将遍历内容印出. */
/* ---------------------------------------- */
void main()
{clrscr();

while(1)
{
char c,a;
graph ptr;
int i;
int node[60][2] = { {1, 10}, {10, 1}, /* 边线数组 */
{2, 10}, {10, 2},
{2, 3}, {3, 2},
{3, 4}, {4, 3},
{3, 12}, {12, 3},
{4, 13}, {13, 4},
{4, 5}, {5, 4},
{5, 6}, {6, 5},
{5, 7}, {7, 5},
{7, 8}, {8, 7},
{9, 10}, {10, 9},
{10, 11}, {11, 10},
{11, 14}, {14, 11},
{11, 12}, {12, 11},
{12, 15}, {15, 12},
{12, 13}, {13, 12},
{13, 16}, {16, 13},
{14, 17}, {17, 14},
{14, 18}, {18, 14},
{15, 19}, {19, 15},
{16, 20}, {20, 16},
{17, 18}, {18, 17},
{18, 23}, {23, 18},
{18, 19}, {19, 18},
{19, 23}, {23, 19},
{19, 24}, {24, 19},
{19, 20}, {20, 19},
{20, 21}, {21, 20},
{22, 23}, {23, 22},
{24, 25}, {25,24}
};
clrscr();
printf("\n\n\n");
printf("/*------------------------------------------------------*/\n");
printf("/* 欢 迎 使 用 本 程 序 */\n");
printf("/*------------------------------------------------------*/\n");
printf(" 本 程 序 是 有 关 图 的 遍 历 的 算 法 演 示,\n");
printf("如 果 有 不 足 之 处 敬 请 原 谅!\n\n");
printf("请 问 你 是 否 要 运 行 以 下 的 程 序:\n\n");
printf(" 图 的 深 度 遍 历 和 广 度 遍 历? Y/N?\n");
c=getch();
if(c!='y'&&'Y')
exit(0);
clrscr();

printf("\n\n");
printf("请 注 意 以 下 为 各 城 市 的 代 码:\n\n");

printf("1:乌鲁木齐; 2:呼和浩特; 3:北京; 4:天津; 5:沈阳; \n");
printf("6:大连; 7:长春; 8:哈尔滨; 9:西宁; 10:兰州;\n");
printf("11:西安; 12:郑州; 13:徐州; 14:成都; 15:武汉; \n");
printf("16:上海; 17:昆明; 18:贵阳; 19:株州; 20:南昌;\n");
printf("21:福州; 22:南宁; 23:柳州; 24:广州; 25:深圳.\n");

for (i=1;i<=25;i++ )
{
head[i].vertex=i; /* 设定顶点值 */
head[i].nextnode=NULL; /* 清除图形指标 */
visited[i]=0; /* 设定遍历初值 */
}
creategraph(node,60); /* 建立图形 */
printf("图 形 的 邻 接 链 表 内 容:\n");
for (i=1;i<=25;i++)
{ if(i%3==0)printf("\n");
printf("顶点%d=>",head[i].vertex); /* 顶点值 */
ptr=head[i].nextnode; /* 顶点位置 */
while(ptr!=NULL) /* 遍历至链表尾 */
{
printf("%d ",ptr->vertex); /* 印出顶点内容 */
ptr=ptr->nextnode; /* 下一个顶点 */
}
}
printf("\n\n");
printf("请 选 择 你 需 要 的 操 作\n");
printf("1、图形的广度优先遍历请输入:'g'或'G'\n");
printf("2、图形的深度优先遍历请输入:'s'或'S'\n");
c=getch();
switch(c)
{
case'g':case'G':
printf("\n请 你 输 入 你 需 要 的 起 始 顶 点:\n");
scanf("%d",&i);
clrscr();
printf("\n\n");
printf("请 注 意 以 下 为 各 城 市 的 代 码:\n\n");
printf("1:乌鲁木齐; 2:呼和浩特; 3:北京; 4:天津; 5:沈阳; \n");
printf("6:大连; 7:长春; 8:哈尔滨; 9:西宁; 10:兰州;\n");
printf("11:西安; 12:郑州; 13:徐州; 14:成都; 15:武汉; \n");
printf("16:上海; 17:昆明; 18:贵阳; 19:株州; 20:南昌;\n");
printf("21:福州; 22:南宁; 23:柳州; 24:广州; 25:深圳.\n");

printf("图 形 的 广 度 优 先 遍 历 的 顶 点 内 容:\n");
bfs(i); /* 印出遍历过程 */
printf("\n"); /* 换行 */
break;
case's':case'S':
printf("\n请 输 入 你 需 要 的 起 始 顶 点:\n");
scanf("%d",&i);
clrscr();
printf("\n\n");
printf("请 注 意 以 下 为 各 城 市 的 代 码:\n\n");
printf("1:乌鲁木齐; 2:呼和浩特; 3:北京; 4:天津; 5:沈阳; \n");
printf("6:大连; 7:长春; 8:哈尔滨; 9:西宁; 10:兰州;\n");
printf("11:西安; 12:郑州; 13:徐州; 14:成都; 15:武汉; \n");
printf("16:上海; 17:昆明; 18:贵阳; 19:株州; 20:南昌;\n");
printf("21:福州; 22:南宁; 23:柳州; 24:广州; 25:深圳.\n");

printf("图 形 的 深 度 优 先 遍 历 的 顶 点 内 容:\n");
dfs(i); /* 印出遍历过程 */
printf("\n"); /* 换行 */
break;
}
printf("\n请 问 你 是 否 要 继 续:y/n");
a=getch();
if(a!='y'&&'Y')
exit(0);
}
}
jixingzhong 2006-05-29
  • 打赏
  • 举报
回复
参考程序(来自网络):

/* ======================================== */
/* 图形的遍历 */
/* ======================================== */
#include <stdlib.h>
#define MAXQUEUE 70 /* 伫列的最大容量 */

struct node /* 图形顶点结构宣告 */
{
int vertex; /* 顶点资料 */
struct node *nextnode; /* 指下一顶点的指标 */
};
typedef struct node *graph; /* 图形的结构新型态 */
struct node head[61]; /* 图形顶点结构数组 */
int visited[61]; /* 遍历记录数组 */

int queue[MAXQUEUE]; /* 伫列的数组宣告 */
int front = -1; /* 伫列的前端 */
int rear = -1; /* 伫列的后端 */

/* ---------------------------------------- */
/* 建立图形 */
/* ---------------------------------------- */
void creategraph(int *node,int num)
{
graph newnode; /* 新顶点指标 */
graph ptr;
int from; /* 边线的起点 */
int to; /* 边线的终点 */
int i;

for ( i = 0; i < num; i++ ) /* 读取边线的回路 */
{
from = node[i*2]; /* 边线的起点 */
to = node[i*2+1]; /* 边线的终点 */
/* 建立新顶点记忆体 */
newnode = ( graph ) malloc(sizeof(struct node));
newnode->vertex = to; /* 建立顶点内容 */
newnode->nextnode = NULL; /* 设定指标初值 */
ptr = &(head[from]); /* 顶点位置 */
while ( ptr->nextnode != NULL ) /* 遍历至链表尾 */
ptr = ptr->nextnode; /* 下一个顶点 */
ptr->nextnode = newnode; /* 插入结尾 */
}
}

/* ---------------------------------------- */
/* 伫列资料的存入 */
/* ---------------------------------------- */
int enqueue(int value)
{
if ( rear >= MAXQUEUE ) /* 检查伫列是否全满 */
return -1; /* 无法存入 */
rear++; /* 后端指标往前移 */
queue[rear] = value; /* 存入伫列 */
}

/* ---------------------------------------- */
/* 伫列资料的取出 */
/* ---------------------------------------- */
int dequeue()
{
if ( front == rear ) /* 检查伫列是否是空 */
return -1; /* 无法取出 */
front++; /* 前端指标往前移 */
return queue[front]; /* 伫列取出 */
}

/* ---------------------------------------- */
/* 图形的广度优先搜寻法 */
/* ---------------------------------------- */
void bfs(int current)
{
graph ptr;

/* 处理第一个顶点 */
enqueue(current); /* 将顶点存入伫列 */
visited[current] = 1; /* 记录已遍历过 */
printf("[%d] ",current); /* 印出遍历顶点值 */
while ( front != rear ) /* 伫列是否是空的 */
{
current = dequeue(); /* 将顶点从伫列取出 */
ptr = head[current].nextnode; /* 顶点位置 */
while ( ptr != NULL ) /* 遍历至链表尾 */
{
if ( visited[ptr->vertex] == 0 ) /* 如过没遍历过 */
{
enqueue(ptr->vertex); /* 递回遍历呼叫 */
visited[ptr->vertex] = 1; /* 记录已遍历过 */
/* 印出遍历顶点值 */
printf("[%d] ",ptr->vertex);
}
ptr = ptr->nextnode; /* 下一个顶点 */
}
}
}

/* ---------------------------------------- */
/* 图形的深度优先搜寻法 */
/* ---------------------------------------- */
void dfs(int current)
{
graph ptr;

visited[current] = 1; /* 记录已遍历过 */
printf("[%d] ",current); /* 印出遍历顶点值 */
ptr = head[current].nextnode; /* 顶点位置 */
while ( ptr != NULL ) /* 遍历至链表尾 */
{
if ( visited[ptr->vertex] == 0 ) /* 如过没遍历过 */
dfs(ptr->vertex); /* 递回遍历呼叫 */
ptr = ptr->nextnode; /* 下一个顶点 */
}
}
fly_2006 2006-05-29
  • 打赏
  • 举报
回复
看看下面的,我又加了一个按数组中的顺序打印顶点:

#include <stdio.h>
#include <stdlib.h>
#define N 20

typedef struct arc
{
int index; /* 弧头结点在图数组中的序号 */
struct arc *nextarc;
}*Arc;

typedef struct
{
int info; /* 顶点的信息 */
Arc firstarc; /* 每个顶点的第一条边 */
}Graph;

static void CreateGraph(Graph g[]); /* 创建图 */
static int LocateNode(Graph g[], int v, int n); /* 查找顶点在图数组中的序号 */
static void PrintGraph(Graph g[], int n); /* 打印图 */
static void DepthFirstSearch(Graph g[], int i, int temp[]); /* 深度优先搜索 */
static void OutputGraph(Graph g[], int n);

int main(void)
{
Graph g[N];

CreateGraph(g);

return 0;
}

static void CreateGraph(Graph g[])
{
int i, j, k, n, e, v1, v2; /* n, e 分别代表顶点的数量和边的数量 */
Arc p, q;

printf("Enter n and e: ");
scanf("%d %d", &n, &e); /* 读取顶点的数量和边的数量 */

printf("Enter every node information: ");
for (k = 0; k < n; k++)
{
scanf("%d", &g[k].info); /* 读取每个顶点的信息 */
g[k].firstarc = NULL; /* 初始化每个顶点的头指针 */
}

printf("Enter every edge: \n");
for (k = 0; k < e; k++)
{
scanf("%d %d", &v1, &v2); /* 读取组成每条边的两个顶点 */

i = LocateNode(g, v1, n);
j = LocateNode(g, v2, n); /* 查找这两个顶点在图数组中的序号 */

if ((p = (Arc)malloc(sizeof(struct arc))) == NULL)
{
exit(1);
}
p -> index = j; /* 指向弧头结点在数组中的序号 */
p -> nextarc = g[i].firstarc; /* 指向弧尾 */
g[i].firstarc = p;

if ((q = (Arc)malloc(sizeof(struct arc))) == NULL)
{
exit(1);
}
q -> index = i;
q -> nextarc = g[j].firstarc;
g[j].firstarc = q;
}

OutputGraph(g, n);

PrintGraph(g, n); /* 打印图,按深度优先搜索 */
}

static int LocateNode(Graph g[], int v, int n)
{
int i;

for (i = 0; i < n; i++)
{
if (g[i].info == v)
{
return i;
}
}
}

static void OutputGraph(Graph g[], int n) /* 按顶点在数组中的顺序打印图 */
{
int i;
Arc p;

for (i = 0; i < n; i++)
{
printf("info = %d: arc", g[i].info);
p = g[i].firstarc;
while (p)
{
printf("-> %d", p -> index);
p = p -> nextarc;
}
putchar('\n');
}
}

static void PrintGraph(Graph g[], int n)
{
int temp[N], i;

for (i = 0; i < n; i++)
{
temp[i] = 0; /* 初始化辅助数组 */
}

printf("The Depth First Search Order: ");
for (i = 0; i < n; i++)
{
if (temp[i] == 0)
{
DepthFirstSearch(g, i, temp); /* i 代表下标 */
}
}
putchar('\n');
}

static void DepthFirstSearch(Graph g[], int i, int temp[])
{
int k;
Arc p;

temp[i] = 1; /* 以访问过设置成 1 */

printf("%d ", g[i].info); /* 打印顶点信息 */

p = g[i].firstarc; /* p 指向当前顶点链表的头结点 */
k = p -> index;

while (p)
{
if (temp[k] == 0)
{
DepthFirstSearch(g, k, temp);
}

p = p -> nextarc;
k = p -> index;
}
}

/* 下面是输入输出结果 */
Enter n and e: 8 10
Enter every node information: 1 2 3 4 5 6 7 8
Enter every edge:
1 2
1 3
2 4
2 5
3 6
3 7
4 8
5 8
6 8
7 8
info = 1: arc-> 2-> 1
info = 2: arc-> 4-> 3-> 0
info = 3: arc-> 6-> 5-> 0
info = 4: arc-> 7-> 1
info = 5: arc-> 7-> 1
info = 6: arc-> 7-> 2
info = 7: arc-> 7-> 2
info = 8: arc-> 6-> 5-> 4-> 3
The Depth First Search Order: 1 3 7 8 6 Press any key to continue...  

上面按深度打印不全啊






















sharpdew 2006-05-29
  • 打赏
  • 举报
回复
请初始化一个用于测试的存储图结构的数组,这样我们才好给你测试呀

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧