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