数据结构-图的邻接矩阵和邻接表的存储实现

实验内容:1.掌握图的邻接矩阵的存储定义;

2.掌握图的邻接表的实现。      。

实验内容:

编写一个程序,设计带权图的邻接矩阵与邻接表的创建和输出运算,并在此基础上设计一个主程序完成以下功能:

建立如图1所示的有向图G的邻接矩阵,并输出;

建立如图1所示的有向图G的邻接表,并输出;

销毁图G的邻接表。  

主要步骤

  1. 定义邻接矩阵类型;
  2. 定义邻接表类型;
  3. 创建邻接矩阵:输入顶点数和边数。

4.初始化邻接矩阵

for (i=0;i<G.Vnum;i++){

for(j=0;j<G.Vnum;j++){

   G.edges[i][j]=INF;

   }

    }

5.有向图起始点、终点及权值的输入

for(i=0;i<G.Enum;i++) {

     int weight;

        char F,T;

        printf("第%d对:",i+1);

        scanf("%c %c %d",&F,&T,&weight);  //输入存在边的两顶点

        getchar();

        for (from=0;from<G.Vnum;from++){

            if(G.vexs[from]==F)

                for(to=0;to<G.Vnum;to++){

                  if(G.vexs[to]==T)

                      G.edges[from][to] = weight;

                }

        }

        printf("\n");

    }

 6.输出邻接矩阵

     printf("图G的邻接矩阵:\n");

     for (i=0;i<G.Vnum;i++)

    {

        for(j=0;j<G.Vnum;j++)

        {

           printf("%d\t",G.edges[i][j]);

        }

        printf("\n");

}

  1. 创建邻接表:

8输出邻接表;销毁邻接表

9.主函数:定义有向图G的邻接矩阵,顶点数为6,边数为10,分别输出G的邻接矩阵和邻接表,销毁邻接表。

程序代码

#include <stdio.h>
#include <malloc.h>
#define INF 32767    //定义∞
#define Vmax 100    //最大顶点个数
typedef  char  VType;      //顶点字符型
typedef   int  EType;      //边,矩阵元素int型

typedef  struct
{
      VType  vexs[Vmax];         //顶点表:存图的所有顶点,比如abcd四个顶点,放入数组中
	  EType  edges[Vmax][Vmax];  //邻接矩阵—边表 值为0 1整数
	  int  Vnum, Enum;          // 图的顶点数和边数
}MGraph;
typedef struct node
{
    EType  adjvex;         //该边的关联点编号
    struct node *next;    //指向下一条边的指针
    int weight;     //该边的相关信息,如权值(用整型表示)
}EdgeNode;//边结点
typedef struct
{
    VType vertex;
    EdgeNode *firstedge;   //指向第一个边结点
}VertexNode;//顶点结点
typedef struct
{
    VertexNode vexlist[Vmax];//顶点结点数组
    int vexnum,arcnum;//顶点数、边数
}AdjGraph;//图的邻接表
/*创建邻接矩阵*/
void creatGraph(MGraph &G)
{
    int i,j,from,to;
    printf("请输入顶点的个数和边的条数:\n");
    scanf("%d %d",&G.Vnum,&G.Enum);
    getchar();
    printf("请输入顶点:\n");
    for(i=0;i<G.Vnum;i++)
    {
        scanf("%c",&G.vexs[i]);
    }
    getchar();

    for (i=0;i<G.Vnum;i++)       //初始化邻接矩阵
    {
        for(j=0;j<G.Vnum;j++)
        {
            G.edges[i][j]=INF;
        }
    }
       //确认存在边的顶点
    printf("请输入之间存在边的顶点(两两输入):\n");
    for(i=0;i<G.Enum;i++)
    {
    	int weight; 
        char F,T;
        printf("第%d对:",i+1);
        scanf("%c %c %d",&F,&T,&weight);  //输入存在边的两顶点 
        getchar();
        for (from=0;from<G.Vnum;from++)
        {
            if(G.vexs[from]==F)
                for(to=0;to<G.Vnum;to++)
                {
                  if(G.vexs[to]==T)
                      G.edges[from][to] = weight;
                }
        }
        printf("\n");
    } 
      //输出邻接矩阵
     printf("图G的邻接矩阵:\n");
     for (i=0;i<G.Vnum;i++)
    {
        for(j=0;j<G.Vnum;j++)
        {

            printf("%d\t",G.edges[i][j]);

        }
        printf("\n");
    }
}
/*将邻接矩阵转化为邻接表*/
void MatToList(MGraph G,AdjGraph *& g)
{
    int i,j;
    EdgeNode * p;
    g =(AdjGraph *)malloc(sizeof(AdjGraph));
    for(i=0;i<G.Vnum;i++)
        g->vexlist[i].firstedge=NULL;  //将邻接表中所有头结点的指针域置为空
    for(i=0;i<G.Vnum;i++)
        for(j=G.Vnum-1;j>=0;j--)       //检查邻接矩阵中的每个元素
            if(G.edges[i][j]!=INF)
            {
                p=(EdgeNode *)malloc(sizeof(EdgeNode));
                p->adjvex=j;
                p->next=g->vexlist[i].firstedge;  //头插法插入结点p
                g->vexlist[i].firstedge=p;
            }
     g->vexnum=G.Vnum; G.Enum=g->arcnum;
     //输出邻接表
     printf("图G的邻接表:\n");
     for(i=0;i<g->vexnum;i++)
     {
         p=g->vexlist[i].firstedge;
         printf("%c->",G.vexs[i]);
         while(p!=NULL)
         {
             printf("%d->",p->adjvex);
             p=p->next;
         }
         printf("NULL\n");
     }
}

void DestroyAdj(AdjGraph *&G)  //销毁图的邻接表
{ int i;
 EdgeNode *pre,*p;
 for (i=0;i<G->vexnum;i++)   //扫描所有的单链表
 { pre=G->vexlist[i].firstedge; //p指向第i个单链表的首结点
  if (pre!=NULL)
  { p=pre->next;
   while (p!=NULL)   //释放第i个单链表的所有边结点
   { free(pre);
    pre=p; p=p->next;
   }
   free(pre);
  }
 }
 free(G);      //释放头结点数组
}

int main()
{
 MGraph G;
 AdjGraph *g;
 creatGraph(G);   //建立邻接矩阵

 printf("将g转换为邻接表G\n");
 MatToList(G,g);    //输出邻接表G
 DestroyAdj(g);    //销毁邻接表
return 1;
}




猜你喜欢

转载自blog.csdn.net/m0_54570435/article/details/130399790