图的建立之邻接表的建立及遍历

来源:互联网 发布:字幕重叠拼图软件 编辑:程序博客网 时间:2024/05/16 15:58

图的建立的基本是邻接矩阵,如果是无向,或者五向的话就用(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]);
}
 

0 0