回 帖 发 新 帖 刷新版面

主题:[讨论]新手请教---有关图的问题

请大家帮忙看看以下程序,我想实现选择性的图的输出
程序目的是建立有向图,无向图,用邻接矩阵输出,我想用选择语句实现……可有错误,请高手们指教


#include<stdio.h>
#include<stdlib.h>
#define MAX_VERTEX_NUM 10
#define ERROR 0
typedef char VertexType;
typedef int VPType;
typedef int Graphkind;
typedef int status;
typedef enum {FALSE, TRUE} boolean;
boolean visit[MAX_VERTEX_NUM];
typedef struct Arcell
{
 VPType adj;
}Arcell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct 
{
 VertexType vex[MAX_VERTEX_NUM];//顶点标志 或者叫代号
 int vexnum, arcnum;//点的个数和边的条数
 AdjMatrix arcs;
 Graphkind kind;//图的类型
}MGraph;

status  CreatGraph(MGraph *G)       //建立图
{
 int i, j, select;

 printf("1:建立有向图!\n");
 printf("2:建立无向图!\n");
 printf("3:请选者种类!\n");
 scanf("%d",&select);
    if (select == 1)
 { 
  G->kind = 0;
 }
 else if (select == 2)
 {
  G->kind = 1;
 }
 else
 {
  return ERROR;
 }
    
 printf("\n请输入顶点的个数:");
 scanf("%d",&G->vexnum);
    getchar();// 吃掉内存中的残留数据
 printf("\n 请输入顶点的信息(代号)");
 for ( i = 0; i < G->vexnum; i++)
 {
  scanf("%c",&G->vex[i]);//注意一下

 }
    
 getchar();
 printf("\n 请输入2个顶点之间的相互关系(0表示相邻 1表示不相邻):\n");
 for ( i = 0 ; i < G->vexnum; i++)
  for ( j = 0; j < G->vexnum; j++)
  {
   scanf("%d",&G->arcs[i][j].adj);
  }

   printf("建立成功\n");
   return 0;
}






void DFS(MGraph G) //深搜索    
{
 int i, j;
    void DFS1( MGraph G, int i);//函数声明

 for (i = 0 ; i < G.vexnum; i++)
 {
  visit[i] = FALSE;
 }
 for (j = 0; j <G.vexnum; j++)
 {
  if (!visit[j])
   DFS1(G,j);//不要用&G 因为G已经是地址了
 }
    
// return 0; 
}

void DFS1(MGraph G, int i)
{
 int j;

 visit[i]=TRUE;
 printf("%c",G.vex[i]);
 
 for (j = 0; j < G.vexnum; j++)
 {
  if ((i != j) && (G.arcs[i][j].adj == 1) && !visit[j])
  {
   DFS1(G,j);
  }
 }
    
 // return 0;
}

status BFS( const MGraph *G,int k)//广度搜索
{
   int s = 0, g = 0;
   int i, j;
   char a[MAX_VERTEX_NUM];

   for (i = 0; i < G->vexnum; i++)
   {
    visit[i] = FALSE;
   }

   printf("%c ",G->vex[k]);
   visit[k]=TRUE;
   
   for ( j = 0; j < G->vexnum; j++)
   {
    a[j] = -1;
   } 
   a[s] = k;

   while(a[s]!=-1)
   {   
    int j;

    i = a[g];
    g++;
       for ( j = 0; j < G->vexnum; j++)
    {
     if (G->arcs[i][j].adj == 1 && !visit[j])
     {
      printf("%c ",G->vex[j]);
      visit[j] = TRUE;
      s++;
      a[s] = j;
     }
    
    }
   if ( s == G->vexnum-1)
   { 
   break;
   }
   }
   return 0;
}

int main(void)
{
    MGraph G;
    int flag, select;
 int flag1 = 0;
 int k;
 while(1)
 {
  do
  {
   printf("1:构建图\n");
   printf("2:深度搜索\n");
   printf("3:广度搜索\n");
   printf("4:退出\n");
   printf("5:请选择\n");
   scanf("%d",&select);
   if (select == 5)
   { 
    flag = 0;
   }
         else
   {
    flag = 1;  
   }
  }while(select < 1 || select > 6);
 
        if (flag == 0)
  {
   break;
  }
  switch(select)
  {
   case 1:
               flag1 = 1;
               CreatGraph(&G);
      break;
        case 2:
               if(flag1 == 1)
      {
                  qiudu(&G);
      }
      else
      {
      printf(" 请先建立图\n");
      }
      break;
        case 3:
      if(flag1 == 1)
      {
                   printf("进行深度搜索:\n");
       DFS(G);
          printf("进行深度搜索:\n");
       printf("\n");
      }
      else
      {
                    printf(" 请先建立图\n");
      }
      break;

        case 4:
      if(flag1 == 1)
      {   
       printf("请哪个点开始搜索");
          scanf("%d",&k);
       getchar();
       printf("进行广度搜索\n");
       BFS(&G,k);
       printf("\n");
      }
               else
      {
                    printf(" 请先建立图\n");
      }
      break;
          
  default: continue;
  }
 }
      
}

回复列表 (共1个回复)

沙发


请大家帮忙看看啊……万分感谢……

我来回复

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