C数据结构-图的应用3(拓扑)

作者在 2006-12-05 01:05:00 发布以下内容

/*借助队列实现图的拓扑排序C程序*/
#include<stdlib.h>
#define maxvertexnum 20/*定义最多的顶点数*/
#define null 0
#define maxqueue 20
#define m 10  /*定义最多入度数*/


/*图的邻接表的边表结点*/
typedef struct node
{
 int adjvex;/*存放邻接点序号*/
 
 /*若要表示边上的权,可添加一个数据域*/ 
    struct node *next; 
}edgenode;

/*图的邻接表表示的顶点表结点*/
typedef struct vnode
{
 int vertex;/*顶点数据域*/ 
    edgenode *firstedge;/*边表头指针*/ 
}vertexnode; 
/*用向量定义图的邻接表表示的顶点表*/
typedef vertexnode adjlist[maxvertexnum]; 

/*定义图的邻接表*/ 
typedef struct
{
    adjlist adjlist;/*邻接表*/
    int n;/*顶点数*/ 
    int e;/*边数*/ 
}algraph;

int queue[maxqueue];/*队列的数组声明*/
int front=-1;/*队头*/
int rear=-1;/*队尾*/
 

/*建立有向图g的邻接表*/
void createalgraph(algraph *g)
{
 int i,j,k,r;
    edgenode *s;
    printf("\ncreat_digraph:\n");
    printf("input n,e.\n");
    scanf("%d,%d",&g->n,&g->e);/*输入图g的顶点数和边数*/
    printf("input nodes(after input a node then enter 'Enter'):\n");
    for(i=1;i<=g->n;i++)  /*构造一个只含n个顶点,边数为0的图*/
    {
     scanf("%d",&(g->adjlist.vertex)); /*读入顶点信息*/
        g->adjlist.firstedge=null;   /*将顶点结点的firstedge域置为空*/
    }
    for(k=1;k<=g->e;k++) /*建立边表*/
    {
     printf("input i,j(1~n):\n");
        scanf("%d,%d",&i,&j);  /*读入边(vi,vj)的顶点对序号*/
        s=(edgenode *)malloc(sizeof(edgenode));
        s->adjvex=j;/*将序号j放入边结点*s的邻接点序号adjvex域*/

        s->next=g->adjlist.firstedge;
        /*将边结点*s作为第一个邻接点插入到序号为i的顶点的边表中*/
        g->adjlist.firstedge=s;
    }
}

/*打印邻接表*/
void print(adjlist g,int n)
{
 edgenode *q;
    int i;
    printf("\nPrint out the linjiebiao of graph:\n");
    for(i=1;i<=n;i++)
    {
        printf("%d->",g.vertex);/*输出头结点数组的数据*/
        while(q!=null)
        {
         printf("%d-",q->adjvex);/*输出边表的数据*/
            q=q->next;
        }
        printf("\n");
    }
}

/*图的拓扑排序(队列)*/
int toposort(adjlist g,int n)
{
 edgenode *r;
 int i;
 for(i=1;i<=n;i++)
    if(r->indegree==0)
      enqueue(i);
    while((i=dequeue())!=-1)
    {
      printf("  %d  ",i); *输出入度为零的顶点*
      g=r->next;
      while(g!=null)
      {
       i=r->indegree;
       r->indegree--;
       if(r->indegree==0)
          enqueue(i);
       g=g->next;
 

C | 阅读 2514 次
文章评论,共0条
游客请输入验证码