数据结构->图的运算

来源:互联网 发布:mac os pc装机 编辑:程序博客网 时间:2024/05/29 08:10

1、键盘输入数据,建立一个有向图的邻接表。

2、输出该邻接表。

3、在有向图的邻接表的基础上计算各顶点的度,并输出。

4、以有向图的邻接表为基础实现输出它的拓扑排序序列。

5、采用邻接表存储实现有向图的深度优先递归遍历。

6、编写一个主函数,调试上述算法。

#include <stdio.h>#include <stdlib.h>#define MAXVNUM  100  //顶点最大个数#define VertexType inttypedef struct Node{    int   adjvex;    struct Node *nextarc;    int weight;} ArcNode;typedef struct{    int degree,indegree;    VertexType data;    ArcNode *firstarc;} VNode;typedef struct{    VNode vertices[MAXVNUM];    int vexnum,arcnum;//顶点的实际数,边的实际数} ALGraph;void CreatAdjList(ALGraph *A){    int n,i;    scanf("%d",&n);    A->vexnum=n;    for(i=1; i<=n; i++)    {        A->vertices[i].data=i;        A->vertices[i].firstarc=NULL;    }    int a,b;    scanf("%d,%d",&a,&b);    ArcNode *p;    A->arcnum=0;    while(a!=0&&b!=0)    {        A->arcnum++;        p=(ArcNode*)malloc(sizeof(ArcNode));        p->adjvex=b;        p->nextarc=A->vertices[a].firstarc;        A->vertices[a].firstarc=p;        scanf("%d,%d",&a,&b);    }}int visited[MAXVNUM];void DFSTraverse(ALGraph A){    printf("图的深度遍历  ");    int v;    for(v=1; v<=A.vexnum; v++)        visited[v]=0;    for(v=1; v<=A.vexnum; v++)    {        if(!visited[v]) DFS(A,v);    }}VertexType GraphFirstAdj(ALGraph A,int v){    ArcNode *p=A.vertices[v].firstarc;    if(p==NULL)        return 0;    else        return p->adjvex;}VertexType GraphNextAdj(ALGraph A,int v,int w){    ArcNode *p=A.vertices[v].firstarc;    if(p==NULL) return 0;    else    {        while(p->adjvex!=w)        {            p=p->nextarc;        }        if(p->adjvex==w&&p->nextarc!=NULL)            return p->nextarc->adjvex;        else            return 0;    }}void DFS(ALGraph A,int v){    printf("%d ",A.vertices[v].data);    visited[v]=1;    VertexType w;    for(w=GraphFirstAdj(A,v); w; w=GraphNextAdj(A,v,w))    {        if(!visited[w]) DFS(A,w);    }}void print(ALGraph A){    int v;    ArcNode *p;    for(v=1; v<=A.vexnum; v++)    {        printf("%d ",v);        p=A.vertices[v].firstarc;        while(p!=NULL)        {            printf("%d ",p->adjvex);            p=p->nextarc;        }        printf("\n");    }}void degree(ALGraph  *A){    int v;    ArcNode *p;    for(v=1; v<=A->vexnum; v++)    {        A->vertices[v].indegree=0;        A->vertices[v].degree=0;    }    for(v=1; v<=A->vexnum; v++)    {        p=A->vertices[v].firstarc;        while(p!=NULL)        {            A->vertices[v].degree++;            A->vertices[p->adjvex].indegree++;            p=p->nextarc;        }    }    for(v=1; v<=A->vexnum; v++)    {        printf("顶点 <%d>     入度 %d       出度 %d\n",v,A->vertices[v].indegree, A->vertices[v].degree);    }}void toposort(ALGraph  A){    int top=0,k,v,stack[MAXVNUM];    for(v=1; v<=A.vexnum; v++)        if(A.vertices[v].indegree==0)            stack[top++]=v;    ArcNode *p;    printf("拓扑排序为 ");    while(top!=0)    {        v=stack[--top];        printf("%d -> ",A.vertices[v].data);        p=A.vertices[v].firstarc;        while(p!=NULL)        {            k=p->adjvex;            A.vertices[k].indegree--;            if(A.vertices[k].indegree==0)                stack[top++]=k;            p=p->nextarc;        }    }    puts("");}int main(){    ALGraph A;    CreatAdjList(&A);    printf("打印邻接表\n");    print(A);    printf("计算出度入度\n");    degree(&A);    toposort(A);    DFSTraverse(A);    return 0;}/*51,24,25,43,53,10,061,32,32,42,53,43,64,65,60,0*/



原创粉丝点击