邻接表的创建与深搜
2015-11-29 21:58
190 查看
#include<stdio.h>
#include<stdlib.h>
#define MAX 20 //最多顶点个数
typedef struct Arc
{
int adjvex;
Arc *next;
int other;
}Arc;
int visited[MAX];
typedef struct Node
{
char date;
Arc *firstarc;
}Node;
typedef struct Adj
{
Node vertex[MAX];
int vexnum,arcnum;
}Adj;
int locat(Adj *G,char v)
{
int j=0,k;
for(k=1;k<=G->vexnum;k++)
{
if(v==G->vertex[k].date)
{
j=k;
break;
}
}
return j;
}
void creat(Adj *G)
{
Arc *p;
int i,j,k;
char v1,v2;
printf("请输入顶点数和边数:");
scanf("%d%d",&G->vexnum,&G->arcnum);
for(i=1;i<=G->vexnum;i++)
{
printf("请输入图中的顶点");
getchar();
G->vertex[i].date=getchar();
G->vertex[i].firstarc=NULL;
}
for(k=1;k<=G->arcnum;k++)
{
getchar();
printf("请输入两个顶点:");
scanf("%c,%c,%d",&v1,&v2);
i=locat(G,v1);
j=locat(G,v2);
p=(Arc *)malloc(sizeof(Arc));
p->adjvex=j;
p->next=G->vertex[i].firstarc;
G->vertex[i].firstarc=p;
p=(Arc *)malloc(sizeof(Arc));// 如果输出有向图此段程序不要
p->adjvex=i;
p->next=G->vertex[j].firstarc;
G->vertex[j].firstarc=p;//不要的程序到此
}
}
void DepthFirstSearch(Adj *G,int v0)
{
Arc *p;
printf("%c,",G->vertex[v0].date);
visited[v0]=1;
p=G->vertex[v0].firstarc;
while(p!=NULL)
{
if(!visited[p->adjvex])
{
DepthFirstSearch(G,p->adjvex);
}
p=p->next;
}
}
void Trave(Adj *G)
{
int vi;
for(vi=1;vi<=G->vexnum;vi++)
visited[vi]=0;
for(vi=1;vi<=G->vexnum;vi++)
{
if(!visited[vi])
DepthFirstSearch(G,vi);
}
}
int main()
{
Adj *G=(Adj *)malloc(sizeof(Adj));
creat(G);
Trave(G);
return 0;
}
#include<stdlib.h>
#define MAX 20 //最多顶点个数
typedef struct Arc
{
int adjvex;
Arc *next;
int other;
}Arc;
int visited[MAX];
typedef struct Node
{
char date;
Arc *firstarc;
}Node;
typedef struct Adj
{
Node vertex[MAX];
int vexnum,arcnum;
}Adj;
int locat(Adj *G,char v)
{
int j=0,k;
for(k=1;k<=G->vexnum;k++)
{
if(v==G->vertex[k].date)
{
j=k;
break;
}
}
return j;
}
void creat(Adj *G)
{
Arc *p;
int i,j,k;
char v1,v2;
printf("请输入顶点数和边数:");
scanf("%d%d",&G->vexnum,&G->arcnum);
for(i=1;i<=G->vexnum;i++)
{
printf("请输入图中的顶点");
getchar();
G->vertex[i].date=getchar();
G->vertex[i].firstarc=NULL;
}
for(k=1;k<=G->arcnum;k++)
{
getchar();
printf("请输入两个顶点:");
scanf("%c,%c,%d",&v1,&v2);
i=locat(G,v1);
j=locat(G,v2);
p=(Arc *)malloc(sizeof(Arc));
p->adjvex=j;
p->next=G->vertex[i].firstarc;
G->vertex[i].firstarc=p;
p=(Arc *)malloc(sizeof(Arc));// 如果输出有向图此段程序不要
p->adjvex=i;
p->next=G->vertex[j].firstarc;
G->vertex[j].firstarc=p;//不要的程序到此
}
}
void DepthFirstSearch(Adj *G,int v0)
{
Arc *p;
printf("%c,",G->vertex[v0].date);
visited[v0]=1;
p=G->vertex[v0].firstarc;
while(p!=NULL)
{
if(!visited[p->adjvex])
{
DepthFirstSearch(G,p->adjvex);
}
p=p->next;
}
}
void Trave(Adj *G)
{
int vi;
for(vi=1;vi<=G->vexnum;vi++)
visited[vi]=0;
for(vi=1;vi<=G->vexnum;vi++)
{
if(!visited[vi])
DepthFirstSearch(G,vi);
}
}
int main()
{
Adj *G=(Adj *)malloc(sizeof(Adj));
creat(G);
Trave(G);
return 0;
}
相关文章推荐
- 2.交通聚类 -层次聚类(agnes)Java实现
- Vitamio介绍及使用
- 单片机4*4按键数码管显示0-9
- 单片机4*4按键数码管显示0-9
- linux使用Xmanager连接CentOS 5.5
- linux-文件系统管理02-分区以及格式化
- OSX下原生态按钮的Hover状态
- Swift下弹出对话框
- 第12章 动态内存
- 《你的灯亮着吗?:发现问题的真正所在》读书笔记2
- 16. Spring Security 基于表达式的权限控制
- hdoj--1869--六度分离(floyd)
- HDU-新生赛-ACM组队安排【递推】
- week13---12月2日 JS内置对象(四)
- 原生JS编写图片切换效果和点击按钮的样式变化
- 每多学一点知识,就少写一行代码
- 信息安全系统设计基础 第12周学习笔记
- hdoj--1869--六度分离(floyd)
- Xamarin.Android ViewPager简单使用
- 汉诺塔游戏(经典递归)