| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1386 人关注过本帖
标题:[求助]关于图的编程(C语言)
只看楼主 加入收藏
HaseoDG
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2006-11-2
收藏
 问题点数:0 回复次数:5 
[求助]关于图的编程(C语言)
1.编写函数,采用邻接矩阵表示法,构造一个无向网。
2.编写函数,实现从键盘输入数据,建立一个有向图的邻接表。
3.编写函数,输出该邻接表。
4.编写函数,采用邻接表存储实现无向图的深度优先非递归遍历。
5.编写函数,采用邻接表存储实现无向图的广度优先遍历。
6.编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法。
搜索更多相关主题的帖子: C语言 函数 遍历 编写 有向图 
2006-11-23 16:53
吾待
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2006-10-7
收藏
得分:0 
还是沙发啊!!!!!!!!!!!!!!
2007-01-11 16:34
hplqq84
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2007-6-17
收藏
得分:0 
大家一起努力啊。

2007-06-28 12:30
zboy
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-7-2
收藏
得分:0 
o(∩_∩)o...
要我们做啊
2007-07-06 12:53
realler
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2006-4-12
收藏
得分:0 

#define M 20
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
/*定义图*/
typedef struct{
int V[M];
int R[M][M];
int vexnum;
}Graph;

/*创建图*/
void creatgraph(Graph *g,int n)
{
int i,j,r1,r2;
g->vexnum=n;
/*顶点用i表示*/
for(i=1;i<=n;i++)
{
g->V[i]=i;
}
/*初始化R*/
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
g->R[i][j]=0;
}
/*输入R*/
printf("Please input R(0,0 END):\n");
scanf("%d,%d",&r1,&r2);
while(r1!=0&&r2!=0)
{
g->R[r1][r2]=1;
g->R[r2][r1]=1;
scanf("%d,%d",&r1,&r2);
}
}

/*打印图的邻接矩阵*/
void printgraph(Graph *g)
{
int i,j;
for(i=1;i<=g->vexnum;i++)
{ for(j=1;j<=g->vexnum;j++)
{
printf("%2d ",g->R[i][j]);
}
printf("\n");
}
}
/*全局变量:访问标志数组*/
int visited[M];
/*访问顶点*/
void visitvex(Graph *g,int vex)
{
printf("%d ",g->V[vex]);
}

/*获取第一个未被访问的邻接节点*/
int firstadjvex(Graph *g,int vex)
{
int w,i;
for(i=1;i<=g->vexnum;i++)
{
if(g->R[vex][i]==1&&visited[i]==0)
{
w=i;
break;
}
else
{
w=0;
}
}
return w;
}
/*获取下一个未被访问的邻接节点(深度遍历)*/
int nextadjvex(Graph *g,int vex,int w)
{
int t;
t=firstadjvex(g,w);
return t;
}
/*深度递归遍历*/
void dfs(Graph *g,int vex)
{
int w;
visited[vex]=1;
visitvex(g,vex);
for(w=firstadjvex(g,vex);w>0;w=nextadjvex(g,vex,w))
if(!visited[w])
{
dfs(g,w);
}
}

void dfstraverse(Graph *g)
{
int i;
for(i=1;i<=g->vexnum;i++)
visited[i]=0;
for(i=1;i<=g->vexnum;i++)
if(!visited[i])
{dfs(g,i);}
}
/*定义队列*/
typedef struct{
int V[M];
int front;
int rear;
}Queue;
/*初始化队列*/
initqueue(Queue *q)
{
q->front=0;
q->rear=0;
}
/*判断队列是否为空*/
int quempty(Queue *q)
{
if(q->front==q->rear)
{
return 0;
}
else
{
return 1;
}
}
/*入队操作*/
enqueue(Queue *q,int e)
{
if((q->rear+1)%M==q->front)
{
printf("The queue is overflow!\n");
return 0;
}
else
{
q->V[q->rear]=e;
q->rear=(q->rear+1)%M;
return 1;
}
}
/*出队操作*/
dequeue(Queue *q)
{
int t;
if(q->front==q->rear)
{
printf("The queue is empty!\n");
return 0;
}
else
{
t=q->V[q->front];
q->front=(q->front+1)%M;
return t;
}
}
/*广度遍历*/
void BESTraverse(Graph *g)
{
int i;
Queue *q=(Queue *)malloc(sizeof(Queue));
for(i=1;i<=g->vexnum;i++)
{
visited[i]=0;
}
initqueue(q);
for(i=1;i<=g->vexnum;i++)
{
if(!visited[i])
{
visited[i]=1;
visitvex(g,g->V[i]);
enqueue(q,g->V[i]);
while(!quempty(q))
{
int u,w;
u=dequeue(q);
for(w=firstadjvex(g,u);w>0;w=nextadjvex(g,u,w))
{
if(!visited[w])
{
visited[w]=1;
visitvex(g,w);
enqueue(q,w);
}
}
}
}
}
}
/*主程序*/
main()
{
int n;
Graph *g=(Graph *)malloc(sizeof(Graph));
char menu;
printf("Please input the number of vertex:\n");
scanf("%d",&n);
creatgraph(g,n);
printf("This is the linjiejuzhen of graph:\n");
printgraph(g);
input:
printf("Please input b or d or q ,Breadth_first: b Depth_first: d quit: q\n");
while((menu=getchar())=='\n');
if(menu=='b')
{
printf("Breadth_first:\n");
BESTraverse(g);
printf("\n");
goto input;
}
else if(menu=='d')
{
printf("Depth_first:\n");
dfstraverse(g);
printf("\n");
goto input;
}
else if(menu=='q')
{
exit(0);
}
else
{
printf("Input error!Please input b or d!\n");
}
}

看看有啥不对的请指正


C新手高手加我,大家讨论 QQ:414068913
2007-07-07 14:37
mjh_abc
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2007-7-7
收藏
得分:0 

不是要深度优先搜索的非递归形式吗?

2007-07-07 18:41
快速回复:[求助]关于图的编程(C语言)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015321 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved