图的遍历(邻接表实现)

#include<iostream>
#include<queue>
using namespace std;

typedef char DataType;
#define MAXV 10//最大顶点数
#define MAXE 50//最大边数
int visited[MAXV]={0};

typedef struct ArcNode{
    int adjvex;//邻接表
    ArcNode* next;
}ArcNode;

typedef struct VertexNode{
    DataType vertex;
    ArcNode*firstE;
}VertexNode;

typedef struct MyGraph{
VertexNode adjlist[MAXV];
    int VNum;
    int ENum;
}MyGraph;

void CreatGraph(MyGraph *G);
void DFS(MyGraph* G,int v);
void DFSTraverse(MyGraph *G);
void BFSTraverse(MyGraph* G,int v);

void CreatGraph(MyGraph *G)
{
    int i,j,k;
    cout<<"请输入图的顶点数和边数:"<<endl;
    cin>>G->VNum>>G->ENum;

    cout<<"请输入图的顶点信息:"<<endl;
    for(i=0;i<G->VNum;i++)//初始化顶点
    {
        cin>>G->adjlist[i].vertex;
        G->adjlist[i].firstE=NULL;
    }
    for(k=0;k<G->ENum;k++)
    {
        cout<<"请输入边所依附的两个顶点的编号:"<<endl;
        cin>>i>>j;

        ArcNode*s=new ArcNode; s->adjvex=j;
        s->next=G->adjlist[i].firstE;
        G->adjlist[i].firstE=s;
    }
}

void DFS(MyGraph *G,int v)
{
    ArcNode *p;
    int j;
    cout<<G->adjlist[v].vertex<<" "; visited[v]=1;
    p=G->adjlist[v].firstE;
    while(p!=NULL)
    {
        j=p->adjvex;
        if(visited[j]==0) DFS(G,j);
        p=p->next;
    }
}

void DFSTraverse(MyGraph* G)
{
    ArcNode *p;
    int i,j;
    for(i=0;i<G->VNum;i++) visited[i]=0;

    for(i=0;i<G->VNum;i++)
        {
            p=G->adjlist[i].firstE;
            if(p!=NULL&&visited[i]==0) DFS(G,i);
        }
}

void BFSTraverse(MyGraph* G,int v)
{
    int j;
    ArcNode *p;
    queue<int> q;
    cout<<G->adjlist[v].vertex<<" "; visited[v]=1;
    v=q.front();
    while(!q.empty())
    {
        p=G->adjlist[v].firstE;
        while(p!=NULL)
        {
            j=p->adjvex;
            if(visited[j]==0){
                cout<<G->adjlist[j].vertex;
                visited[j]=1;
                q.front()=j;
            }
        }
    }
}

int main()
{
    MyGraph* G=new MyGraph;
    CreatGraph(G);

    cout<<"该图的深度优先遍历顺序:"<<endl;
    DFSTraverse(G);
    cout<<endl;
    cout<<"该图的广度优先遍历顺序:"<<endl;
    for(int i=0;i<G->VNum;i++)
    BFSTraverse(G,i);

    return 0;

}



#include #include #include #include #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define NULL 0 #define MAX 20 typedef int Status; typedef struct Node {int elem; struct Node *next; }Node,*QNode; typedef struct {QNode front; QNode rear; }Queue; typedef struct ArcNode /*头节点*/ {int adjvex; /*该边所指向的顶点的位置*/ struct ArcNode *nextarc; /*指向下一条边*/ }ArcNode; typedef struct VNode /*表节点*/ {int data; /*顶点信息*/ ArcNode *firstarc; /*指向第一条依附该节点的边的指针*/ }VNode,AdjList[MAX]; typedef struct {AdjList vertices; /*表节点*/ int vexnum; /*节点的个数*/ int arcnum; /*边的条数*/ }Graph; Status InitQueue(Queue *Q) {Q->front=Q->rear=(QNode)malloc(sizeof(Node)); if(!Q->front) exit(OVERFLOW); Q->front->next=NULL; return OK; } Status EnQueue(Queue *Q,int e) {QNode p=(QNode)malloc(sizeof(Node)); if(!p) exit(OVERFLOW); p->elem=e; p->next=NULL; Q->rear->next=p; Q->rear=p; return OK; } Status DeQueue(Queue *Q,int *e) {QNode p; p=Q->front->next; Q->front->next=p->next; if(Q->rear==p) Q->rear=Q->front; *e=p->elem; free(p); return OK; } Status QueueEmpty(Queue Q) {if(Q.rear==Q.front) return TRUE; else return FALSE; } int LocateVex(Graph *G,int v) /*返回节点v在中的位置*/ {int i; for(i=0;ivexnum;++i) if(G->vertices[i].data==v) break; else continue; if(ivexnum) return i; else return -1; } Status CreateGraph(Graph *G)/*以邻接表形式创建无向连通G*/ {int m,n,i,j,k,v1,v2,flag=0; ArcNode *p1,*q1,*p,*q; printf("Please input the number of VNode: "); scanf("%d",&m); printf("Please input the number of ArcNode: "); scanf("%d",&n); G->vexnum=m; /*顶点数目*/ G->arcnum=n; /*边的数目*/ for(i=0;ivexnum;++i) {G->vertices[i].data=i+1; /*顶点信息*/ G->vertices[i].firstarc=NULL; } printf("Output the message of VNode:\n"); for(i=0;ivexnum;++i) printf("v%d\n",G->vertices[i].data); for(k=0;karcnum;++k) {printf("Please input the %d edge beginpoint and endpoint: ",k+1); scanf("%d%d",&v1;,&v2;); i=LocateVex(G,v1); j=LocateVex(G,v2); if(i>=0&&j>=0) {++flag; p=(ArcNode *)malloc(sizeof(ArcNode)); p->adjvex=j; p->nextarc=NULL; if(!G->vertices[i].firstarc) G->vertices[i].firstarc=p; else{for(p1=G->vertices[i].firstarc;p1->nextarc;p1=p1->nextarc); p1->nextarc=p; } q=(ArcNode *)malloc(sizeof(ArcNode)); q->adjvex=i; q->nextarc=NULL; if(!G->vertices[j].firstarc) G->vertices[j].firstarc=q; else{for(q1=G->vertices[j].firstarc;q1->nextarc;q1=q1->nextarc); q1->nextarc=q; } } else{printf("Not hava this edge!\n"); k=flag; } } printf("The Adjacency List is:\n"); /*输出邻接表*/ for(i=0;ivexnum;++i) {printf("\t%d v%d->",i,G->vertices[i].data); p=G->vertices[i].firstarc; while(p->nextarc) {printf("%d->",p->adjvex); p=p->nextarc; } printf("%d\n",p->adjvex); } return OK; } int FirstAdjVex(Graph G,int v)/*返回v的第一个邻接顶点*/ {if(G.vertices[v].firstarc) return G.vertices[v].firstarc->adjvex; else return -1; }/*FirstAdjVex*/ int NextAdjVex(Graph G,int v,int w)/*返回v中相对于w的下一个邻接顶点*/ {int flag=0; ArcNode *p; p=G.vertices[v].firstarc; while(p) { if(p->adjvex==w) { flag=1; break; } p=p->nextarc; } if(flag && p->nextarc) return p->nextarc->adjvex; else return -1; }/*NextAdjVex*/ int Visited[MAX]; void DFS(Graph G,int v)/*深度优先遍历*/ {int w; Visited[v]=TRUE; printf("v%d ",G.vertices[v].data); for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w)) if(!Visited[w]) DFS(G,w); } void DFSTraverse(Graph G) {int v; for(v=0;v<G.vexnum;++v) Visited[v]=FALSE; for(v=0;v<G.vexnum;++v) if(!Visited[v]) DFS(G,v); } void BFSTraverse(Graph G)/*广度优先遍历*/ {int v,v1,w; Queue q; for(v=0;v<G.vexnum;++v) Visited[v]=FALSE; InitQueue(&q); for(v=0;v=0;w=NextAdjVex(G,v1,w)) if(!Visited[w]){Visited[w]=TRUE; printf("v%d ",G.vertices[w].data); EnQueue(&q,w); }/*if*/ } } } main() {Graph G; char ch; system("cls"); CreateGraph(&G); while(1) {printf("which one choice you want DFS(1) BFS(2) orQuit(0)?\n"); scanf("%d",&ch;); switch(ch) {case 1:printf("Depth First Search:\n"); DFSTraverse(G); break; case 2:printf("\nBreadth First Search:\n"); BFSTraverse(G); break; case 0:exit(0); } } getch(); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值