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

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

}

 

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/mr_tianyanxiaobai/article/details/59525048
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞