图的创建与遍历(邻接表存储方式)

    xiaoxiao2022-07-07  195

    #include<iostream> #include<cstdlib> #include<cstring> using namespace std; #define maxSize 100 //边表 typedef struct ArcNode { int adjvex; //该边所指向的结点的位置 struct ArcNode *nextarc; //指向下一条边的指针 int info; //该边的相关信息(如权值) }ArcNode; //顶点表 typedef struct { char data; //顶点信息 ArcNode *firstarc; //指向第一条边的指针 }VNode; typedef struct { VNode adjlist[maxSize]; //邻接表 int n,e; //顶点数和边数 }AGraph; void Create(AGraph *G) { cout<<"请输入顶点数和边数:"<<endl; cin>>G->n>>G->e; cout<<"输入顶点信息:"<<endl; for(int i=0;i<G->n;i++) { getchar(); cin>>G->adjlist[i].data; G->adjlist[i].firstarc=NULL; //指向边表的指针初始时置为空 } ArcNode *p; //建立边表 cout<<"输入边的下标:"<<endl; for(int k=0;k<G->e;k++) { int i,j; cin>>i>>j; p=(ArcNode*)malloc(sizeof(ArcNode)); p->adjvex=j; //存储弧头 p->nextarc=G->adjlist[i].firstarc; //头插法插入边结点 G->adjlist[i].firstarc=p; //下面代码无向图才有 /*p=(ArcNode*)malloc(sizeof(ArcNode)); p->adjvex=i; //存储弧头 p->nextarc=G->adjlist[j].firstarc; G->adjlist[j].firstarc=p; */ } cout<<endl<<"邻接表 :"<<endl; for(int i=0;i<G->n;i++) { p=G->adjlist[i].firstarc; cout<<G->adjlist[i].data<<":"; while(p) { cout<<G->adjlist[p->adjvex].data; p=p->nextarc; } cout<<endl; } cout<<endl; } void Visit(int v) { cout<<v<<" "; } int visit[maxSize]; void DFS(AGraph *G,int v) { ArcNode *p; visit[v]=1; Visit(v); p=G->adjlist[v].firstarc; while(p!=NULL) { if(visit[p->adjvex]==0) DFS(G,p->adjvex); p=p->nextarc; } } void BFS(AGraph *G,int v,int visit[maxSize]) { ArcNode *p; int que[maxSize],front=0,rear=0; int j; Visit(v); visit[v]=1; rear=(rear+1)%maxSize; que[rear]=v; while(front!=rear) { front=(front+1)%maxSize; j=que[front]; p=G->adjlist[j].firstarc; while(p!=NULL) { if(visit[p->adjvex]==0) { Visit(p->adjvex); visit[p->adjvex]=1; rear=(rear+1)%maxSize; que[rear]=p->adjvex; } p=p->nextarc; } } } /*测试数据 7 12 a b c d e f g 0 1 0 2 0 3 1 2 1 4 2 5 2 4 3 2 3 5 4 6 5 4 5 6 */ int main() { AGraph G; Create(&G); memset(visit,0,sizeof(visit)); cout<<"DFS:"<<endl; DFS(&G,0); cout<<endl; memset(visit,0,sizeof(visit)); cout<<"BFS:"<<endl; BFS(&G,0,visit); cout<<endl; }

     

    最新回复(0)