这几天学习了图的存储结构,有用;邻接矩阵和邻接表法两种方式。其中两种表示方法各有相应的用途,在这里仅用邻接表法来表示图,并且讨论图的深度优先遍历和广度优先遍历,下面是代码:
//ArcNode 边结点; VertexNode 表头结点; AdjList 邻接表表示法
//图的邻接表表示法
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include <queue>
#define Max 101 //最多有100个结点
bool visit[Max];
//===================
typedef int type_queue;
typedef struct node
{
type_queue x;
struct node *next;
}Node;
typedef struct
{
Node *front;
Node *rear;
}Queue;
bool Is_empty(Queue *p){
if(p->front==NULL && p->rear==NULL)
return true;
return false;
}
void Push(Queue *p,type_queue x){
Node *s=(Node*)malloc(sizeof(Node));
s->x=x;
s->next=NULL;
if(Is_empty(p)){
p->rear=p->front=s;
return ;
}
p->rear->next=s;
p->rear=s;
}
type_queue Pop(Queue *p){
if(Is_empty(p)){
printf("below flow\n");
return -1;
}
type_queue x=p->front->x;
if(p->front->next==NULL){
free(p->front);
p->front=p->rear=NULL;
return x;
}
Node *s=p->front;
p->front=s->next;
free(s);
return x;
}
type_queue Get_top(Queue *p){
if(Is_empty(p)){
printf("the Queue is empty\n");
return -1;
}
return p->front->x;
}
void Init_queue(Queue *p){
p->front=p->rear=NULL;
}
void Clear_queue(Queue *p){
while(!Is_empty(p))
Pop(p);
}
//================
//typedef int type_data;
typedef struct Arc{ //边结点
int number;
int value;
struct Arc *next;
}ArcNode;
typedef struct{ //表头结点
type_queue data;
ArcNode *first;
}VertexNode;
typedef struct{ //图
int n;//结点数
int m;//边数
VertexNode tex[Max];
}AdjList;
void Creat_grap(AdjList *g){
scanf("%d%d",&g->n,&g->m);
int i,s,t,val;
for(i=1;i<=g->n;i++){
scanf("%d",&g->tex[i].data);
g->tex[i].first=NULL;
}
for(i=0;i<g->m;i++){
scanf("%d%d%d",&s,&t,&val);
ArcNode *p=(ArcNode*)malloc(sizeof(ArcNode));
p->number=t;
p->value=val;
p->next=g->tex[s].first;
g->tex[s].first=p;
ArcNode *q=(ArcNode*)malloc(sizeof(ArcNode)); //当为有向图时不能写
q->number=s;
q->value=val;
q->next=g->tex[t].first;
g->tex[t].first=q;
}
}
void Clear(AdjList *g){
for(int i=1;i<=g->n;i++){
ArcNode *p=g->tex[i].first;
while(p){
ArcNode *q=p->next;
free(p);
p=q;
}
}
}
/*void dfs(AdjList *g,int index){
printf("正在访问结点%d ,其数据为:%d \n",index,g->tex[index].data);
visit[index]=true;
ArcNode *p=g->tex[index].first;
while(p){
if(!visit[p->number])
dfs(g,p->number);
p=p->next;
}
}
void Edfs(AdjList *g){
memset(visit,false,sizeof(visit));
for(int i=1;i<=g->n;i++){
if(!visit[i])
dfs(g,i);
}
}*/
void bfs(AdjList *g,int index){
Queue que;
Init_queue(&que);
Push(&que,index);
printf("正在访问结点%d ,其数据为:%d \n",index,g->tex[index].data);
visit[index]=true;
while(!Is_empty(&que)){
//printf("%d\n",Get_top(&que));
int pivot=Pop(&que);
//printf("正在访问结点%d ,其数据为:%d \n",pivot,g->tex[pivot].data);
//visit[pivot]=true;
ArcNode *p=g->tex[pivot].first;
while(p){
if(!visit[p->number]){
printf("正在访问结点%d ,其数据为:%d \n",p->number,g->tex[p->number].data);
visit[p->number]=true;
Push(&que,p->number);
}
p=p->next;
}
}
}
void Ebfs(AdjList *g){
memset(visit,false,sizeof(visit));
for(int i=1;i<=g->n;i++){
if(!visit[i])
bfs(g,i);
}
}
int main()
{
AdjList g;
Creat_grap(&g);
/*for(int i=1;i<=g.n;i++){
//printf("skjdfhsdkh\n");
ArcNode *p=g.tex[i].first;
while(p){
printf("%d ",p->number);
p=p->next;
}
printf("\n");
}*/
Ebfs(&g);
Clear(&g);
return 0;
}
数据为
8 10
1 2 3 4 5 6 7 8
1 3 8
1 2 8
2 5 8
2 4 8
3 7 8
3 6 8
7 8 8
6 8 8
5 8 8
4 8 8