图的建立之邻接表的建立及遍历
2017-03-02 15:25
351 查看
图的建立的基本是邻接矩阵,如果是无向,或者五向的话就用(0,1)表示即可,而有权重的则需要考虑将也用其权重表示;
邻接表的建立
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXVEX 100
bool visited[MAXVEX];
typedef struct EdgeNode1//边表结点,就是每个节点后面连接的东西
{
int adjvex;//存储的是邻接点的index
int weight;
struct EdgeNode1 *next;
}edgenode,*EdgeNode;
typedef struct VertxtNode//顶点表节点
{
char data;
EdgeNode next;
}vertxt,Adjlist[MAXVEX];
typedef struct {
int numVertext,numedges;//节点数,边数
Adjlist adjlist;
}GraphAdjlist;
void CreatALGrath(GraphAdjlist *G);
void DFS(GraphAdjlist G,int i);
void DFSvisited(GraphAdjlist G);
void Print(GraphAdjlist *G);
int main(){
GraphAdjlist *G;
G =(GraphAdjlist*)malloc(sizeof(GraphAdjlist));
CreatALGrath(G);
//Print( G);
DFSvisited(*G);
return 0;
}
void CreatALGrath(GraphAdjlist *G)//利用邻接表的方式建立一个无向图
{
int i,j,k;
EdgeNode e;
printf("请输入节点个数与边数:");
scanf("%d%d",&i,&j);
G->numedges = j;
G->numVertext = i;
getchar();
for(i=0;i<G->numVertext;i++){
printf("请输入第%d个节点",i+1);
scanf("%c",&G->adjlist[i].data);
G->adjlist[i].next = NULL;
getchar();
}
for(int k=0;k<G->numedges;k++){
printf("请输入vi,vj边上的序号:");
scanf("%d%d",&i,&j);
//将表边连接给vi,头插法减少时间复杂度,为O(n+e)
e = (EdgeNode)malloc(sizeof(edgenode));
e->adjvex = j;
e->next = G->adjlist[i].next;
G->adjlist[i].next = e;
//将表边连接给vj
e = (EdgeNode)malloc(sizeof(edgenode));
e->adjvex = i;
e->next = G->adjlist[j].next;
G->adjlist[j].next = e;
}
}
/*
通过递归进行邻接表的深度优先遍历
通过设置记号,判别是否以遍历过该节点,时间复杂度O(n+e)
定义:从图中某一个点出发,访问此顶点,然后访问该点的子节点中所存的邻界点的index,再通过index
通过index访问表头结点,直到图中所有的和v有路径想通的节点都被访问到 为止
*/
void DFS(GraphAdjlist G,int i){
visited[i] = true;
//printf("%d",visited[i]);
EdgeNode p;
printf("%c ",G.adjlist[i].data);
p = G.adjlist[i].next;
while(p!=NULL){
//printf("xvcn");
if(visited[p->adjvex]==false)
{
DFS(G,p->adjvex);//访问相邻的表头节点
}
p = p->next;
}
//
}
void DFSvisited(GraphAdjlist G)
{
for(int i=0;i<G.numVertext;i++){
visited[i] = false;
//printf("%d",visited[i]);
}
for(int i = 0;i<G.numVertext;i++){
if(visited[i]==0){
DFS(G,i);
}
}
}
void Print(GraphAdjlist *G){
printf("%d %c",G->adjlist[0].next->adjvex,G->adjlist[0]);
}
邻接表的建立
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXVEX 100
bool visited[MAXVEX];
typedef struct EdgeNode1//边表结点,就是每个节点后面连接的东西
{
int adjvex;//存储的是邻接点的index
int weight;
struct EdgeNode1 *next;
}edgenode,*EdgeNode;
typedef struct VertxtNode//顶点表节点
{
char data;
EdgeNode next;
}vertxt,Adjlist[MAXVEX];
typedef struct {
int numVertext,numedges;//节点数,边数
Adjlist adjlist;
}GraphAdjlist;
void CreatALGrath(GraphAdjlist *G);
void DFS(GraphAdjlist G,int i);
void DFSvisited(GraphAdjlist G);
void Print(GraphAdjlist *G);
int main(){
GraphAdjlist *G;
G =(GraphAdjlist*)malloc(sizeof(GraphAdjlist));
CreatALGrath(G);
//Print( G);
DFSvisited(*G);
return 0;
}
void CreatALGrath(GraphAdjlist *G)//利用邻接表的方式建立一个无向图
{
int i,j,k;
EdgeNode e;
printf("请输入节点个数与边数:");
scanf("%d%d",&i,&j);
G->numedges = j;
G->numVertext = i;
getchar();
for(i=0;i<G->numVertext;i++){
printf("请输入第%d个节点",i+1);
scanf("%c",&G->adjlist[i].data);
G->adjlist[i].next = NULL;
getchar();
}
for(int k=0;k<G->numedges;k++){
printf("请输入vi,vj边上的序号:");
scanf("%d%d",&i,&j);
//将表边连接给vi,头插法减少时间复杂度,为O(n+e)
e = (EdgeNode)malloc(sizeof(edgenode));
e->adjvex = j;
e->next = G->adjlist[i].next;
G->adjlist[i].next = e;
//将表边连接给vj
e = (EdgeNode)malloc(sizeof(edgenode));
e->adjvex = i;
e->next = G->adjlist[j].next;
G->adjlist[j].next = e;
}
}
/*
通过递归进行邻接表的深度优先遍历
通过设置记号,判别是否以遍历过该节点,时间复杂度O(n+e)
定义:从图中某一个点出发,访问此顶点,然后访问该点的子节点中所存的邻界点的index,再通过index
通过index访问表头结点,直到图中所有的和v有路径想通的节点都被访问到 为止
*/
void DFS(GraphAdjlist G,int i){
visited[i] = true;
//printf("%d",visited[i]);
EdgeNode p;
printf("%c ",G.adjlist[i].data);
p = G.adjlist[i].next;
while(p!=NULL){
//printf("xvcn");
if(visited[p->adjvex]==false)
{
DFS(G,p->adjvex);//访问相邻的表头节点
}
p = p->next;
}
//
}
void DFSvisited(GraphAdjlist G)
{
for(int i=0;i<G.numVertext;i++){
visited[i] = false;
//printf("%d",visited[i]);
}
for(int i = 0;i<G.numVertext;i++){
if(visited[i]==0){
DFS(G,i);
}
}
}
void Print(GraphAdjlist *G){
printf("%d %c",G->adjlist[0].next->adjvex,G->adjlist[0]);
}
相关文章推荐
- 基于邻接表的图的基本操作(建立,遍历)
- 建立有向图的邻接表,深度优先遍历和广度优先遍历的递归与非递归算法,判断是否是有向无环图,并输出一种拓扑序列
- 图---邻接表(建立,深度遍历,广度遍历)
- 图---邻接表(建立,深度遍历,广度遍历)
- 图---邻接表(建立,深度遍历,广度遍历)
- 数据结构邻接表的建立以及两种遍历
- 头插法与尾插法建立链表,链表的遍历
- c语言实现二叉树的建立与前序、中序、后序、层序遍历
- 单链表的建立和遍历
- 数据结构(十一)——二叉树的遍历和建立
- 线索二叉树的建立及遍历
- 数据结构实验之二叉树的建立与遍历
- 线索二叉树的建立和遍历
- 从NYOJ1063 学习二叉树的建立与遍历
- 数据结构实验之二叉树的建立与遍历
- 数据结构实验之 二叉树的建立与遍历
- 求关键路径(包含邻接表的建立、拓扑排序)
- 树的建立 遍历
- SDUTOJ 2136--数据结构实验之二叉树的建立与遍历
- 数据结构实验之二叉树的建立与遍历