基于邻接表存储
结点表示
typedef struct node{
int vertex; //顶点值
struct node* next;
}Node;
Node graph[N];
1.深度优先遍历(depth first search)
首先访问结点v,并标记已被访问过,然后从v的邻接表中选取一个未被访问的顶点p,并从p开始继续进行深度优先遍历(递归实现)
int visited[N]={0}; //标记数组
void dfs(int v,Node graph[]){
Node *p;
visited[v]=1;
for(p=graph[v].next;p;p=p->next){ //遍历v的邻接表
if(!visited[p->vertex]){
printf("%d\t",p->vertex);
visited[p->vertex]=1;
dfs(p->vertex,graph); //以p->vertex为顶点,继续深度遍历
}
}
}
2.广度优先遍历(breadth first search)
首先访问结点v,并标记已被访问过,然后访问v的邻接表中的每一个未被访问的顶点, 在访问过v的邻接表的所有顶点后,访问与v的邻接表的第一个顶点相邻且未被访问过的顶点,继续广度优先遍历。
void bfs(int v,Node graph[]){
int visited[N]={0}; //标记数组
int queue[N]; //记录未被访问结点的队列
int front,rear;
Node *p;
front=rear=0;
queue[++rear]=v; //v入队
visited[0]=1;
printf("与%d连通的顶点: ",v);
while(front!=rear){
v=queue[++front]; //出队
for(p=graph[v].next;p;p=p->next){ //访问v的邻接表的所有结点
if(!visited[p->vertex]){ //若该结点未被访问
queue[++rear]=p->vertex; //入队
visited[p->vertex]=1; //标记
printf("%d\t",p->vertex);
}
}
}
}