c++ 有向图

//
//  main.cpp
//  CmdPointTree
//
//  Created by weixian he on 12-2-3.
//  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
//

#include <iostream>

#include <iostream>
//#include <stdafx.h>
//#include"iostream"
//#include"malloc.h"
using namespace std;
#define MaxVertexNum 50        //定义最大顶点数
typedef struct node{       //边表结点
    char adjvex;          //邻接点域
    struct node *next;    //链域
}EdgeNode;

typedef struct vnode{     //顶点表结点
    char vertex;           //顶点域
    EdgeNode *firstedge; //边表头指针
}VertexNode;

typedef VertexNode AdjList[MaxVertexNum];       //AdjList是邻接表类型

typedef struct {
    AdjList adjlist;     //邻接表
    int n,e;             //图中当前顶点数和边数
} ALGraph;               //图类型
//           建立图的邻接表          
void CreatALGraph(ALGraph *G)
{
    int i,j,k;
    char a;
    EdgeNode *s;        //定义边表结点
    cout<<"请输入顶点数和边数: ";
    cin>>i;cin>>j;     //读入顶点数和边数
    G->n=i;G->e=j;
    cout<<"请输入顶点编号:";
    for(i=0;i<G->n;i++)     //建立边表
    {
        cin>>a;
        G->adjlist[i].vertex=a;      //读入顶点信息
        G->adjlist[i].firstedge=NULL; //边表置为空表
    }
    cout<<"请输入由两个顶点构成的边,示例:0 1"<<endl;
    for(k=0;k<G->e;k++)
    { 
        //建立边表
        cin>>i;cin>>j;        //读入边(Vi,Vj)的顶点对序号
        
        s=(EdgeNode *)malloc(sizeof(EdgeNode));    //生成边表结点
        s->adjvex=j;                 //邻接点序号为j
        s->next=G->adjlist[i].firstedge;
        G->adjlist[i].firstedge=s;     //将新结点*S插入顶点Vi的边表头部
         
        
        /*
        s=(EdgeNode *)malloc(sizeof(EdgeNode));
        s->adjvex=i;                  //邻接点序号为i
        s->next=G->adjlist[j].firstedge;  
        G->adjlist[j].firstedge=s;      //将新结点*S插入顶点Vj的边表头部
         */
         
    }
}
//定义标志向量为全局变量        
typedef enum{FALSE,TRUE} Boolean;
Boolean visited[MaxVertexNum];
// DFS:深度优先遍历的递归算法      
void DFSM(ALGraph *G,int i)
{                        //以Vi为出发点对邻接链表表示的图G进行DFS搜索
    EdgeNode *p;
    cout<<G->adjlist[i].vertex;   //访问顶点Vi
    visited[i]=TRUE;                    //标记Vi已访问
    p=G->adjlist[i].firstedge;           //取Vi边表的头指针
    while(p) {                 //依次搜索Vi的邻接点Vj,这里j=p->adjvex
        if(! visited[p->adjvex])      //若Vj尚未被访问
            DFSM(G,p->adjvex);       //则以Vj为出发点向纵深搜索
        p=p->next;                    //找Vi的下一个邻接点
    }
}
void DFS(ALGraph *G)
{
    for(int i=0;i<G->n;i++)
        visited[0]=FALSE;        //标志向量初始化
    for(int i=0;i<G->n;i++)
        if(!visited[0])              //Vi未访问过
            DFSM(G,0);                //以Vi为源点开始DFS搜索
}
//广度优先遍历       
void BFS(ALGraph *G)
{  
    int k=0;                       /*以Vk为源点对用邻接链表表示的图G进行广度优先搜索*/
    int i,f=0,r=0;
    EdgeNode *p;
    int cq[MaxVertexNum];         //定义FIFO队列
    for(i=0;i<G->n;i++)
        visited[i]=FALSE;             //标志向量初始化
    for(i=0;i<=G->n;i++)
        cq[i]=-1;                          //初始化标志向量
    cout<<G->adjlist[k].vertex; //访问源点Vk
    visited[k]=TRUE;
    cq[r]=k;           //Vk已访问,将其入队。注意,实际上是将其序号入队
    while(cq[f]!=-1) {   //队列非空则执行
        i=cq[f]; f=f+1;                //Vi出队
        p=G->adjlist[i].firstedge;     //取Vi的边表头指针
        while(p) {                //依次搜索Vi的邻接点Vj(令p->adjvex=j)
            if(!visited[p->adjvex]) {           //若Vj未访问过
                cout<<G->adjlist[p->adjvex].vertex;      //访问Vj
                visited[p->adjvex]=TRUE;
                r=r+1; cq[r]=p->adjvex;           //访问过的Vj入队
            }
            p=p->next;               //找Vi的下一个邻接点
        }
    }                              
}      
int main()
{
    int i,x;
    ALGraph *G;
    G=(ALGraph *)malloc(sizeof(ALGraph));
    CreatALGraph(G);
    cout<<"遍历结果与构造边的顺序有关。"<<endl;
    cout<<"深度优先 "<<endl;
    DFS(G);
    cout<<endl;
    cout<<"广度优先"<<endl;
    BFS(G);
    cout<<endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值