图的表示方法---邻接多重表

//邻接多重表是无向图的另一种链式存储结构,相比较于邻接表,多重链表更易于删除弧等操作
//结构上,邻接多重表和邻接表的差别,仅仅在于同一条边在邻接表中用两个结点表示,而在邻接多重表中只有一个结点
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAX_VERTEX_NUM 20
typedef int Status;
#define OK 1
#define ERROR 0
typedef int InfoType;  //定义弧相关信息为整形
typedef char VertexType;    //定义顶点类型为字符型
typedef enum {unvisited,visited} VisitIF;    //定义{未访问,已访问}等枚举常量,同时定义VisitIF为枚举变量类型

typedef struct ArcNode
{
    VisitIF mark;             //访问标记
    int ivex,jvex;            //该弧所依附的两个顶点在顺序结构中的位置
    struct ArcNode *ilink,*jlink;  //分别指向依附这两个顶点的下一条边
    InfoType *info;           //该弧相关信息的指针
}ArcNode;                     //弧结构

typedef struct VNode
{
    VertexType data;            //顶点
    ArcNode *firstarc;          //指向第一条依附该顶点的弧的指针
}VNode,AMLList[MAX_VERTEX_NUM]; //顶点结构

typedef struct
{
    AMLList vertices;     //顶点数组
    int vexnum,arcnum;    //顶点数和弧数
}AMLGraph;                 //多重邻接表表示的图结构

Status CreateAMLGraph(AMLGraph *G);
int LocateVex(AMLGraph G,VertexType v);

int main()
{
    AMLGraph *G;
    G=(AMLGraph *)malloc(sizeof(AMLGraph));

    CreateAMLGraph(G);
    int i,j;
    //打印邻接多重表
    for(i=0;i<G->vexnum;i++)
    {
        ArcNode *p;
        p=(ArcNode *)malloc(sizeof(ArcNode));
        p=G->vertices[i].firstarc;
        printf("%c: ",G->vertices[i].data);
        while(p)
        {

            int n1,n2;
            n1=p->ivex;
            n2=p->jvex;
            printf("%c---%c ",G->vertices[n1].data,G->vertices[n2].data);
            if(p->ivex==i)
                p=p->ilink;
            else
                p=p->jlink;
        }
        printf("\n");
    }
    return 0;
}
int LocateVex(AMLGraph G,VertexType v)
{
    int i;
    for(i=0;i<G.vexnum;i++)
        if(G.vertices[i].data==v)
            return i;
}
//创建无向图
Status CreateAMLGraph(AMLGraph *G)
{
   int i,IncInfo;
    printf("输入顶点数量:");
    scanf("%d",&G->vexnum);
    printf("输入弧数量:");
    scanf("%d",&G->arcnum);
    printf("弧是否含有其他信息(否---0,是---1):");
    scanf("%d",&IncInfo);
    //头结点处理
    for(i=0;i<G->vexnum;i++)
    {
        fflush(stdin);
        printf("输入第%d个顶点:",i+1);
        scanf("%c",&G->vertices[i].data);    //输入头结点的顶点信息
        G->vertices[i].firstarc=NULL;        //初始化头结点的弧指针
    }
    //弧结点处理
    for(i=0;i<G->arcnum;i++)
    {
        char v1,v2;
        int node1,node2;
        fflush(stdin);
        printf("输入第%d条弧的依附的第一个结点:",i+1);
        scanf("%c",&v1);
        fflush(stdin);
        printf("输入第%d条弧的依附的第二个结点:",i+1);
        scanf("%c",&v2);

        node1=LocateVex(*G,v1);
        node2=LocateVex(*G,v2);

        ArcNode *p;
        p=(ArcNode *)malloc(sizeof(ArcNode));

        p->ivex=node1;
        p->jvex=node2;
        p->ilink=G->vertices[node1].firstarc;
        G->vertices[node1].firstarc=p;
        p->jlink=G->vertices[node2].firstarc;
        G->vertices[node2].firstarc=p;
        if(IncInfo)
        {
            int *info;
			info=(int *)malloc(sizeof(int));
            printf("输入弧的其他信息:");
            scanf("%d",info);
            p->info=info;
        }
        else
            p->info=NULL;
    }
    return OK;
}
对任意给定的(顶点数不小于20,边数不少于30,的类型可以是有向、无向、有向网、无向网),能够输入的顶点和边(或弧)的信息,并存储到相应存储结构(邻接矩阵、邻接表、十字链表、邻接多重表,任选其中两种类型),对自己所创建的完成以下操作: 对无向求每个顶点的度,或对有向求每个顶点的入度和出度(5分) 完成插入顶点和边(或弧)的功能(5分) 完成删除顶点和边(或弧)的功能(5分) 两种存储结构的转换(5分),如果其中一种存储结构为十字链表或邻接多重表则增加5分。 输出的深度优先遍历序列或广度优先遍历序列(5分) 求的深度优先或广度优先的生成树(或生成森林)(存储结构为孩子-兄弟链表),并对生成树进行遍历(15分) 判断的连通性,输出连通分量的个数(5分) 判断中是否存在环,无向5分,有向10分 给出顶点u和v,判断u到v是否存在路径(5分) 10、求顶点u到v的一条简单路径(10分) 11、求顶点u到v的所有简单路径(15分) 12、求顶点u到v的最短路径(10分) 13、求顶点u到其余各顶点的最短路径(15分) 14、求任两个顶点之间的最短路径(15分) 15、求最小生成树(15分) 16、对于有一个源点和一个汇点的有向网,求关键路径(20分) 编程环境可以是C、VC++、JAVA,每位同学从上述题目中选择100分的题目,注意,必须选择第1-6题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值