回 帖 发 新 帖 刷新版面

主题:[原创]求助第二个问题!!! 修改图的基本操作-遍历的实现的程序!!

这个我也写出了大部分程序,只有一个小小的地方我不会做了!!
请大家帮我修改一下!!!
图的基本操作-遍历的实现
顶点和边的信息输入数据为:
 5   7   DG 
 A B C D E
 AB  AE   BC  CD DA   DB  EC
1、/* 输入图的顶点和边的信息,建立图*/
void  CreateGraph(MGraph &G)

2、/* 深度优先搜索遍历图*/
void DFSTraverse(Graph G, int v) 

3、/*广度优先搜索遍历图 */
void BFSTraverse(Graph G, int v)4、
4、/* 其他相关函数 */

#include"iostream"
#include"stdlib.h"
#include<string>
using namespace std;
#define INFINITY   INT_MAX    //定义无穷大∞
#define MAX_VERTEX_NUM     20    
typedef enum{ DG,  DN, UDG, UDN } GraphKind; // 定义图的类型 { 有向图, 有向网,无向图, 无向网}
typedef   struct   ArcNode     // 表结点定义
{   int  adjvex;    //邻接点域,存放与Vi邻接的点在表头数组中的位置
    struct  ArcNode  *nextarc;//链域,指示依附于vi的下一条边或弧的结点
    char info;
}ArcNode; 
typedef   struct  VNode      //表头结点
{   
    char  vexdata;                     //存放顶点信息
    struct  ArcNode  *firstarc;    //指示第一个邻接点
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct  //图的结构定义
{           
     AdjList    vertices;      //顶点向量
     int         vexnum, arcnum; 
    GraphKind kind;          // 图的种类标志
  } MGraph;
struct Queue 
{
    char  data0;
    struct Queue *next;
};
Queue *front,*rear;
void DFSTraverse(MGraph, int );
int visit[100];
 void  CreateGraph(MGraph &G)
{
    char a,ch;//用来输入边的弧尾和弧头
    printf("输入顶点数\n");
    scanf("%d",&G.vexnum);
    printf("输入弧数\n");
    scanf("%d",&G.arcnum);
    for(int i=0;i<G.vexnum;i++)//初始化图的各个结点
    {
       [color=800000][size=6][size=5] printf("输入第"i+1"个结点\n");[/size][/size][/color]
        scanf(&G.vertices[i].vexdata);
        G.vertices[i].firstarc=NULL;//初始化firstarc的指针指向空
    }
    [color=FF0000]for(i=0;i<G.arcnum;i++)//初始化各个边的信息[/color]    {
        printf("输入第i+1条弧\n");
            scanf("%d",&a);//输入弧尾部
            scanf("%d",&ch);//输入弧的头部
        for(int j=0;j<G.vexnum;j++)//找出边的存储位置
        {
            if(G.vertices[j].vexdata==a)
            {
                for(int k=0;k<G.vexnum;k++)//判断输入的边是否存在相应的顶点
                    if(ch==G.vertices[k].vexdata)break;
                if(k=G.vexnum-1&&ch!=G.vertices[k].vexdata)//判断输入的边的正误
                {
                    printf("输入有误,请重新输入!\n");
                    break;
                }
                ArcNode *p;
                p=new ArcNode;
                p->adjvex=k;//存入弧的头部结点的
                p->info=ch;
                p->nextarc=G.vertices[j].firstarc;
                G.vertices[j].firstarc=p;
                i++;
                break;
            }
            else if(j>=G.vexnum-1)//判断输入的边的正误
                printf("输入有误,请重新输入!\n");
        }
    }
    printf("输入完毕\n");
}

void DisPlayMGrph(MGraph G)
{
    for(int j=0;j<G.vexnum;j++)
    {
        ArcNode *p;
        p=G.vertices[j].firstarc;
        cout<<j<<" "<<G.vertices[j].vexdata<<" ";
        if(p)cout<<"-->";
        while(p)
        {
            for(int i=0;i<G.vexnum;i++)
                if(p->info==G.vertices[i].vexdata)break;
            printf("i&" "&G.vertices[j].vexdata&p->info&" "\n");
            p=p->nextarc;
        }
        printf("^");
        printf(" ");
    }
}
void DFS(MGraph &G)
{
    for(int i=0;i<G.vexnum;i++)//标记没有被访问的结点为false
        visit[i]=false;
    for(i=0;i<G.vexnum;i++)//对没有访问过的顶点调用DFSTraverse
        if(!visit[i])  DFSTraverse(G, i);
}
void DFSTraverse(MGraph G, int v) 
{
    ArcNode *pe;
    pe=G.vertices[v].firstarc;   
    visit[v]=true;//标记访问过的结点为true
    cout<<G.vertices[v].vexdata<<"  ";
    while(pe&&visit[pe->adjvex]==false)//对pe->adjvex尚未被访问过的结点递归调用DFSTraverse
    {
        DFSTraverse(G,pe->adjvex);
        pe=pe->nextarc;
    }
}
void BFSTraverse(MGraph &G, int v)//广度优先搜索遍历
{
    ArcNode *pe;
    rear=new Queue;//初始化队列
    front=rear;
    rear->next=NULL;
    for(int i=0;i<G.vexnum;i++)//标记没有被访问过的结点为false
        visit[i]=false;
    for(i=0;i<G.vexnum;i++)//对没有被访问过的结点进行逐个访问
    {
        pe=G.vertices[i].firstarc;
        if(!visit[i])
        {
            visit[i]=true;//访问过的结点标记为true
            printf("G.vertices[i].vexdata&" "\n");
            rear=rear->next=new Queue;
            rear->next=NULL;
            rear->data0=G.vertices[i].vexdata;//入队操作
            while(front==rear) {//若对列不为空,则进行以下操作
                Queue *Temp=front;
                front=front->next;//队首元素出队
                delete Temp;
                pe=G.vertices[i].firstarc;
                while(pe&&visit[pe->adjvex]==false) {//对没有访问过的结点进行入队操作
                    printf("G.vertices[pe->adjvex].vexdata" "");//入队的同时输出相应的信息
                    visit[pe->adjvex]=true;
                    rear=rear->next;
                    rear->next=new Queue;
                    rear->next=NULL;
                    rear->data0=G.vertices[pe->adjvex].vexdata;
                    pe=pe->nextarc;
                }
            }
        }
    }
    printf(" ");
}
void main()
{
    printf("============================ 请选择你想要的图的基本操作  ======================\n");
    printf("       0.退出  1. 创建图  2.深度优先遍历  3.广度优先遍历  4.输出邻接表 \n");
    MGraph G;
    char n;
    int m;
    while(n!=5)
    {
        scanf("%d",&n);
        switch(n)
        {
    //    case '0':exit(-1);
        case 1:CreateGraph(G);break;
        case 2:DFS(G);break;
        case 3:BFSTraverse(G,m);break;
        case 4:DisPlayMGrph(G);break;
        default: printf("错误\n");break;  
        }
    }
}

回复列表 (共1个回复)

沙发

程序中红色字体是需要修改的地方!!
请各位指点!!!

我来回复

您尚未登录,请登录后再回复。点此登录或注册