回 帖 发 新 帖 刷新版面

主题:几个让我头痛的算法

#include <stdio.h>
#include <alloc.h>
#define MAX_VERTEX_NUM 30     /*图中最多顶点数*/
typedef struct edgenode  /*邻接表中链表的结点类型*/
{int vertex;            /*邻接顶点的顶点序号*/
 int value;            /*边/弧的权值*/
 struct edgenode *next;   /*后继邻接顶点*/
}edgenode;
typedef struct vernode  /*邻接表中数组类型*/
{int vertex;
 edgenode *next;
}vernode;
typedef vernode lgraph[MAX_VERTEX_NUM];  /*邻接表类型*/
typedef int mgraph[MAX_VERTEX_NUM][MAX_VERTEX_NUM];   /*邻接矩阵类型*/
int visited[MAX_VERTEX_NUM];    /*访问标志*/
int queue[MAX_VERTEX_NUM];    /*广度优先搜索遍历存储队列*/
void create_mgraph(mgraph g,int *n)
/*输入有向图的顶点和弧,建立图的邻接矩阵*/
{int e,i,j,source,destination;
 printf("Input num of vertex and edge:");
 scanf("%d%d",n,&e);
 for(i=0;i<*n;i++)
   for(j=0;j<*n;j++)
       g[i][j]=1000;   /*置空邻接矩阵*/
 for(i=0;i<e;)  /*构造邻接矩阵的每条弧*/
   {printf("Input edge's source:");
    scanf("%d",&source);   /*输入弧的起点*/
    printf("Input edge's destination:");
    scanf("%d",&destination);   /*输入弧的终点*/
    if(source==destination)
        printf("Error:self loop!\n");
    else if(source>=*n||destination>=*n)
        printf("Error:out of range!\n");
    else
        {printf("Input edge's value:");
         scanf("%d",    (1)    );   /*输入弧的权值*/
         i++;
    }
   }
}
void print_mgraph(mgraph g,int n)     /*打印图的邻接矩阵*/
{int i,j;
 printf("  ");
 for(i=0;i<n;i++)
    printf("%6d",i);     /*打印列标*/
 printf("\n");
 for(i=0;i<n;i++)
    {printf("%2d",i);     /*打印行标*/
     for(j=0;j<n;j++)
        printf("%6d",g[i][j]);     /*打印邻接矩阵每条弧的权值*/
     printf("\n");
    }
}
void create_lgraph(lgraph g,int *n)
/*输入有向图的顶点和弧,建立图的邻接表*/
{int e,i,source,destination;
 edgenode *p,*q;
 printf("Input num of vertex and edge:");
 scanf("%d%d",n,&e);
 for(i=0;i<*n;i++)
   {g[i].vertex=i;
    g[i].next=NULL;   /*置空邻接表*/
   }
 for(i=0;i<e;)  /*构造邻接表的每条弧*/
   {printf("Input edge's source:");
    scanf("%d",&source);   /*输入弧的起点*/
    printf("Input edge's destination:");
    scanf("%d",&destination);   /*输入弧的终点*/
    if(source==destination)
        printf("Error:self loop!\n");
    else if(source>=*n||destination>=*n)
        printf("Error:out of range!\n");
    else
        {p=    (2)    ;   /*为弧结点申请空间*/
         p->vertex=destination;
         printf("Input edge's value:");
     scanf("%d",&p->value);
         p->next=NULL;
         q=g[source].next;
         if(q==NULL)
             g[source].next=p;
         else
             {while(q->next!=NULL)
                  q=q->next;
              q->next=p;
         }
     i++;
        }
   }
}
void print_lgraph(lgraph g,int n)     /*打印图的邻接表*/
{int i;
 edgenode *p;
 for(i=0;i<n;i++)
    {p=g[i].next;
     printf("[%6d]",g[i].vertex);     /*打印弧的起点*/
     while(p!=NULL)
      {printf("-->%d,%d",p->vertex,p->value);
           (3)    ;
      }
     printf("\n");
    }
}
void dfs(lgraph g,int v)
/*邻接表表示的图的以v为起点深度优先搜索遍历*/
{edgenode *p;
 printf("%4d",v);  /*访问顶点i*/
 visited[v]=1;       /*置顶点i已被访问*/
 p=g[v].next;
 while(p!=NULL)      /*检查所有与顶点i相邻接的顶点*/
    {if(    (4)    )    /*如果该顶点未被访问过*/
         dfs(g,p->vertex);       /*从邻接顶点出发深度优先搜索*/
     p=p->next;      /*考察下一个顶点*/
    }
}
void bfs(lgraph g,int v)
/*邻接表表示的图的以v为起点广度优先搜索遍历*/
{int i,front,rear;
 edgenode *p;
 front=rear=0;        /*队列置空*/
 printf("%4d",v);  /*访问出发顶点*/
 visited[v]=1;        /*置该顶点为已被访问标志*/
 queue[rear++]=v;    /*出发顶点入队列*/
 while(    (5)    )
   {v=queue[front++]; /*取队列首元素*/
    for(p=g[v].next;p!=NULL;p=p->next)
      {/*按邻接表顺序考察与顶点v邻接的各顶点p->vertex*/
       if(    (6)    )
         {/*顶点w未被访问过*/
          printf("%4d",p->vertex);  /*访问顶点p->vertex*/
          visited[p->vertex]=1;       /*置顶点p->vertex为已被访问标志*/
          queue[rear++]=p->vertex;    /*顶点p->vertex入队列*/
         }
      }
   }
}
main()
{lgraph lg;
 mgraph mg;
 int n,i;
 clrscr();
 create_mgraph(mg,&n);   /*调用create_mgraph函数,建立图的邻接矩阵*/
 print_mgraph(mg,n);   /*调用print_mgraph函数,输出图的邻接矩阵*/
 create_lgraph(lg,&n);   /*调用create_lgraph函数,建立图的邻接表*/
 print_lgraph(lg,n);   /*调用print_lgraph函数,输出图的邻接表*/
 for(i=0;i<n;i++)
   visited[i]=0;  /*置全部顶点未访问标志*/
 printf("\nThe depth-first-search is:");
 dfs(lg,0);   /*调用dfs函数*/
 for(i=0;i<n;i++)
   visited[i]=0;  /*置全部顶点未访问标志*/
 printf("\nThe breadth-first-search is:");
 bfs(lg,0);   /*调用bfs函数*/
}
求有识之士帮忙解决一下我心中的烦恼

回复列表 (共3个回复)

沙发

兄台,你这样贴出来是要问什么呢?

板凳

LZ都没有明确的问题的

3 楼

填空,程序太长,我晕了

我来回复

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