邻接矩阵

#include <stdio.h>
#include <stdlib.h>
#include <data.h>

#define MAX_VERTEX_NUM 20//最大顶点个数
#define VRType int //顶点间关系
#define InfoType char//储存弧或额外信息的指针变量
#define VertexType int//顶点数据类型
typedef enum{DG,DN,UDG,UDN}GraphKind;//枚举图的四种类型
typedef struct//邻接矩阵
{
    VRType adj;//对于无权图为0或1
    //对于有权图为权值
    InfoType *info;//弧或边含有的额外信息指针
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct //图
{
    VertexType vexs[MAX_VERTEX_NUM];//储存顶点数据
    AdjMatrix arcs;//邻接矩阵记录顶点关系
    int vexnum,arcnum;//顶点数,弧边
    GraphKind kind;
}MGraph;


//找顶点在图中的位置
int LocateVex(MGraph *G,VertexType v)
{
    int i=0;
    for(;i<G->vexnum;i++)
    {
        if(G->vexs[i]==v)
        {
            break;
        }
    }
    if(i>=G->vexnum)
    {
        printf("未找到顶点位置\n");
        return -1;
    }

    return i;
}

//构造有向图
void CreateDG(MGraph *G)
{
    scanf("%d%d",&(G->vexnum),&(G->arcnum));//输入顶点数和边数
    for(int i=0;i<G->vexnum;i++)
    {
        scanf("%d",&(G->vexs[i]));
    }//依次输入顶点
    for(int i=0;i<G->vexnum;i++)
    {
        for(int j=0;j<G->vexnum;j++)
        {
            G->arcs[i][j].adj=0;
            G->arcs[i][j].info=NULL;
        }
    }//初始化邻接矩阵,全部不可通,指针为NULL

    for(int k=0;k<G->arcnum;k++)
    {
        int v1,v2;
        scanf("%d%d",v1,v2);
        int i=LocateVex(G,v1);
        int j=LocateVex(G,v2);
        if(i==-1||j==-1)
        {
            printf("此顶点不存在");
            return ;
        }
        G->arcs[i][j].adj=1;
    }
}
//构造无向图
void CreateDN(MGraph *G)
{
    scanf("%d%d",&(G->vexnum),&(G->arcnum));
    for(int i=0;i<G->vexnum;i++)
    {
        scanf("%d",&(G->vexs[i]));
    }
    for(int i=0;i<G->vexnum;i++)
    {
        for(int j=0;j<G->vexnum;j++)
        {
            G->arcs[i][j].adj=0;
            G->arcs[i][j].info=NULL;
        }
    }
    for(int k=0;k<G->arcnum;k++)
    {
        int v1,v2;
        scanf("%d%d",&v1,&v2);
        int i=LocateVex(G,v1);
        int j=LocateVex(G,v2);
        if(i==-1||j==-1)
        {
            printf("此顶点不存在\n");
            return ;
        }
        G->arcs[i][j].adj=1;
        G->arcs[j][i].adj=1;//与有向图不同,无向图关于对角线对称
    }
}
//构造有向网
void CreateUDG(MGraph *G)
{
    scanf("%d%d",&(G->vexnum),&(G->arcnum));
    for(int i=0;i<G->vexnum;i++)
    {
        scanf("%d",&(G->vexs[i]));
    }
    for(int i=0;i<G->vexnum;i++)
    {
        for(int j=0;j<G->vexnum;j++)
        {
            G->arcs[i][j].adj=INT_MAX;//有权图不连通时为无穷大
            G->arcs[i][j].info=NULL;
        }
    }
    for(int k=0;k<G->arcnum;k++)
    {
        int v1,v2,w;
        scanf("%d%d%d",&v1,&v2,&w);
        int i=LocateVex(G,v1);
        int j=LocateVex(G,v2);
        if(i==-1||j==-1)
        {
            printf("此顶点不存在\n");
            return;
        }
        G->arcs[i][j].adj=w;
    }
}
//构造无向网
void CreateUDN(MGraph *G)
{
    scanf("%d%d",&(G->vexnum),&(G->arcnum));
    for(int i=0;i<G->vexnum;i++)
    {
        scanf("%d",&(G->vexs[i]));
    }
    for(int i=0;i<G->vexnum;i++)
    {
        for(int j=0;j<G->vexnum;j++)
        {
            G->arcs[i][j].adj=INT_MAX;
            G->arcs[i][j].info=NULL;
        }
    }
    for(int k=0;k<G->arcnum;k++)
    {
        int v1,v2,w;
        scanf("%d%d%d",&v1,&v2,&w);
        int i=LocateVex(G,v1);
        int j=LocateVex(G,v2);
        if(i==-1||j==-1)
        {
            printf("此顶点不存在\n");
            return;
        }
        G->arcs[i][j].adj=w;
        G->arcs[j][i].adj=w;
    }
}
//创建图
void CreateGraph(MGraph *G)
{
    scanf("%d",&(G->kind));
    switch(G->kind)
    {
    case DG:
        return CreateDG(G);
        break;
    case DN:
        return CreateDN(G);
        break;
    case UDG:
        return CreateUDG(G);
        break;
    case UDN:
        return CreateUDN(G);
        break;
    default:
        break;
    }
}
//遍历图的权值
void PrintGraph(MGraph G)
{
    for(int i=0;i<G.vexnum;i++)
    {
        for(int j=0;j<G.vexnum;j++)
        {
            printf("%d",G.arcs[i][j].adj);
        }
        printf("\n");
    }
}

int main()
{
    MGraph G;
    CreateGraph(&G);
    PrintGraph(G);
    return 0;
}

邻接表

#include <stdio.h>
#include <stdlib.h>
#include <data.h>

#define MAX_VERTEX_NUM 20//最大顶点个数
#define VertexType int //顶点数据类型
#define InfoType int //边包含的信息类型
typedef struct ArcNode//边的节点结构
{
    int adjvex;//邻接点在数组中的下标位置
    struct ArcNode *nextarc;//指向下一个边界点
    InfoType *info;//信息域
}ArcNode;
typedef struct VNode
{
    VertexType data;//顶点数据域
    ArcNode *firstarc;//指向邻接点的指针
}VNode,AdjList[MAX_VERTEX_NUM];//储存各链表头结点的数组
typedef struct {
    AdjList vertices;//链表头结点数组
    int vexnum,arcnum;//记录顶点数和边数
    int kind;//记录图的种类
}ALGraph;

无欲则刚
76 声望15 粉丝

« 上一篇
图(2)
下一篇 »
深度优先搜索