图基于邻接表的遍历
来源:互联网 发布:下载ea7视频软件 编辑:程序博客网 时间:2024/06/05 18:42
/*无向图的邻接表的建立和遍历*/
#define MaxSize 100
#define NULL 0
struct ArcNode /*定义边结点*/
{int adjvex;
struct ArcNode *nextarc;
};
struct Vnode /*定义定点结点*/
{int data;
struct ArcNode *firstarc;
};
struct Vnode AdjList[MaxSize];
int m,n,v,cord;
main()
{void creatgraph(struct Vnode a[MaxSize]);
void dfs(struct Vnode a[MaxSize]);
void bfs(struct Vnode a[MaxSize]);
creatgraph(AdjList);
dfs(AdjList);
bfs(AdjList);
}
void creatgraph(struct Vnode a[MaxSize])
{int i,j,k;
struct ArcNode *p;
printf("input arces and vexes:/n"); /*输入图的边数和顶点数*/
scanf("%d,%d",&m,&n);
for(k=0;k<n;k++) /*初始化顶点向量表*/
{a[k].data=k+1;
a[k].firstarc=NULL;
}
for(k=0;k<m;k++)
{printf("/ninput arc: "); /*输入和边关联的顶点号,建立相应的链表*/
scanf("%d,%d",&i,&j);
p=(struct ArcNode *)malloc(sizeof(struct ArcNode));
p->adjvex=j;
p->nextarc=a[i-1].firstarc; /*每一个边结点均插入在链表的首部*/
a[i-1].firstarc=p;
p=(struct ArcNode *)malloc(sizeof(struct ArcNode));
p->adjvex=i;
p->nextarc=a[j-1].firstarc;
a[j-1].firstarc=p;
}
printf("/n");
for(k=0;k<n;k++) /*显示已建立的邻接表信息*/
{printf("%d",a[k].data);
p=a[k].firstarc;
while(p)
{printf("->%d",p->adjvex);p=p->nextarc;}
printf("/n");
}
}/*creatgraph end*/
void dfs(struct Vnode a[MaxSize])
{struct ArcNode *p,*ar[MaxSize];
/*ar[MAX]作为顺序栈,存放遍历过程中边结点的地址*/
int x,i,y,top=-1;
int visited[MaxSize]; /*用作存放已遍历过顶点的标记*/
for(i=0;i<n;i++) visited[i]=0;
printf(“深度遍历:”);
printf("/ninput x:");
scanf("%d",&x); /*输入图遍历的始顶点的编号*/
printf("%d",x);
visited[x-1]=1;
p=a[x-1].firstarc;
/*下一个要遍历的顶点所关联的边结点,向量表的下标从0开始*/
while((p)||(top>=0))
{if(!p) {p=ar[top]; top--;}
y=p->adjvex;
if(visited[y-1]==0)
{visited[y-1]=1;
/*若未遍历过,则遍历,并且把下一个顶点进栈,从本顶点出发继续按深度遍历*/
printf("->%d",y);
p=p->nextarc;
if(p) {top++;ar[top]=p;}
p=a[y-1].firstarc;
}
else p=p->nextarc;
}
}/*dfs end*/
void bfs(struct Vnode A[MaxSize])
{struct ArcNode *p;
int x,i,y,front=-1,rear=-1,ar[MaxSize],visited[MaxSize];
/*数组ar[MAX]为顺序队列存放刚遍历过的顶点号*/
for(i=0;i<n;i++) visited[i]=0;
printf(“/n广度遍历:”);
printf("/ninput x:");
scanf("%d",&x); /*输入图遍历的始顶点的编号*/
printf("%d",x);
visited[x-1]=1;
p=A[x-1].firstarc;
while((p)||(front!=rear))
{if(!p){ front++;
y=ar[front];
p=A[y-1].firstarc;
}
y=p->adjvex;
if(visited[y-1]==0) /*遍历顺点并插入队列*/
{visited[y-1]=1;
printf("->%d",y);
rear++;
ar[rear]=y;
}
p=p->nextarc;
}
}/*bfs*/
- 图基于邻接表的遍历
- 图的遍历(基于邻接表)
- 基于邻接表的图的广度优先遍历算法
- 基于邻接表的图的广度遍历
- 基于邻接表的图的各种遍历
- 图的广度优先遍历,基于邻接链表实现
- 基于邻接表的深度优先遍历
- 邻接表的图遍历
- 图的邻接表遍历
- 基于邻接表的广度优先搜索遍历
- 基于邻接表的广度优先搜索遍历
- 基于邻接表存储的图的DFS与BFS遍历
- 基于邻接表存储的图的DFS与BFS遍历
- 图的深度优先遍历,基于邻接链表的非递归实现
- 基于邻接表的图的深度和广度优先搜索遍历
- 基于邻接表的图的基本操作(建立,遍历)
- 基于邻接表的无向图的深度广度遍历实现
- Java实现基于邻接表的图的深度和广度遍历
- 多种XML解析方法
- 马云称经济今明两年最严峻
- Struts2 ognl.NoSuchPropertyException
- 正由另一进程使用,因此该进程无法访问该文件-----解决办法总结
- 大学的第一个学期
- 图基于邻接表的遍历
- OCP认证考试指南(16):管理撤销
- 15个 JavaScript Web UI 库
- Android Debug Bridge(ADB)
- 关于跳槽的切身体会
- Java常用术语解释-JSP
- OCP认证考试指南(17):处理锁定
- 在函数中 传递数组
- [转]简单CSS hack:区分IE6、IE7、IE8、Firefox、Opera