**
图的一些基本运算算法以及DFS,BFS
#include <iostream>
#include<cstdlib>
#include<queue>
using namespace std;
const int MAXV=5;
const int INF=32767;
//边结点的类型
typedef struct ANode{
int adjvex;
struct ANode *nextarc;
int weight;
}ArcNode;
//邻接表的头结点类型
typedef struct Vnode{
ArcNode *firstarc;
}VNode;
//完整的图邻接表类型
typedef struct{
VNode adjlist[MAXV];
int n,e;
}AdjGraph;
//创建图的运算算法
void CreateAdj(AdjGraph *&G,int A[][MAXV],int n,int e){
ArcNode *p;
G=(AdjGraph*)malloc(sizeof(AdjGraph));
for(int i=0;i<n;i++)G->adjlist[i].firstarc=NULL;
for(int i=0;i<n;i++){
for(int j=n-1;j>=0;j--){
if(A[i][j]!=0&&A[i][j]!=INF){
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=j;
p->weight=A[i][j];
p->nextarc=G->adjlist[i].firstarc;
G->adjlist[i].firstarc=p;
}
}
}
G->e=G->n=n;
}
//输出图的运算算法
void DispAdj(AdjGraph *G){
ArcNode *p;
for(int i=0;i<G->n;i++){
p=G->adjlist[i].firstarc;
cout<<i<<" ";
for(;p!=NULL;p=p->nextarc){cout<<"("<<p->adjvex<<","<<p->weight<<")";}
cout<<endl;
}
}
//销毁图的运算算法
void DestroyAdj(AdjGraph *&G){
ArcNode *pre,*p;
for(int i=0;i<G->n;i++){
pre=G->adjlist[i].firstarc;
if(pre!=NULL){
for(p=pre->nextarc;p!=NULL;pre=p,p=p->nextarc)free(pre);
free(pre);
}
}
free(G);
}
//深度优先遍历
int visited[MAXV]={0};
void DFS(AdjGraph *G,int v){
visited[v]=1;
cout<<v<<" ";
for(ArcNode *p=G->adjlist[v].firstarc;p!=NULL;p=p->nextarc){
if(visited[p->adjvex]==0){
DFS(G,p->adjvex);
}
}
}
//广度优先遍历
int visited1[MAXV]={0};
queue<int>q;
void BFS(AdjGraph *G,int v){
visited1[v]=1;
cout<<v<<" ";
q.push(v);
while(!q.empty()){
int w=q.front();
q.pop();
for(ArcNode *p=G->adjlist[w].firstarc;p!=NULL;p=p->nextarc){
if(visited1[p->adjvex]==0){
cout<<p->adjvex<<" ";
visited1[p->adjvex]=1;
q.push(p->adjvex);
}
}
}
}
int main() {
int A[5][5]={0,8,INF,5,INF,
INF,0,3,INF,INF,
INF,INF,0,INF,6,
INF,INF,9,0,INF,
INF,INF,INF,INF,0
};
AdjGraph *G;
CreateAdj(G,A,5,5);
DispAdj(G);
// DFS(G,0);
BFS(G,0);
DestroyAdj(G);
return 0;
}
不妥之处,请多多指教。