构建有向图邻接表

      建立一个有向图的邻接表,首先要构思好它的邻接表里面包含哪些结构数据,然后根据哪些数据来建立相应的结构体。但也要注意数据的输入。

#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 10
typedef struct ArcNode             //弧节点结构体
{
     int adjvex;                            //该弧指向定点的位置
     int data;
     struct ArcNode * nextarc;    //指向下下一条弧的指针
}ArcNode;
typedef struct VNode             //定点结构体
{
     char data;
     ArcNode * firstarc;              //指向第一条弧的指针
}VNode, AdjList[MAX_SIZE];
typedef struct                         //创建图的结构体
{
     AdjList vertices;                   //顶点数组
     int vexnum, arcnum;           //顶点个数及弧的条数
}ALGraph;
int Find(ALGraph G, char ch)    //查找此节点位于顶点数组的那个位置
{
     int i;
     for(i = 0; i<G.vexnum; i++)
     {
          if(ch == G.vertices[i].data)
               break;
     }
     return i;
}
void Input(ALGraph & G)     //构建邻接表的输入操作
{
     int mark, data;               //mark是用来标记是否有下一条弧,data则用来保存要输入的数据
     ArcNode * p;
     char ch;
     printf("请输入图的顶点数和弧的条数。
");
     scanf("%d%d", &G.vexnum, &G.arcnum);
     printf("请输入顶点信息。
");
     getchar();
     for(int i = 0; i<G.vexnum; i++)
          {
               scanf("%c", &G.vertices[i].data);
               getchar();
         }
     printf("请按照各个顶点的顺序来输入弧节点。
");
     for(int i = 0; i<G.vexnum; i++)
     {
          mark = 1;
          G.vertices[i].firstarc = NULL;
          printf("请判断以%c为弧尾的弧。
", G.vertices[i].data);
          while(mark)
          {
               printf("判断是否有下一个弧,若有则输入1,无则输入0。
");
               scanf("%d", &mark);
               getchar();
               if(mark)
               {
                    p = (ArcNode *)malloc(sizeof(ArcNode));
                    p->nextarc = NULL;
                    printf("输入弧节点的信息:");
                    scanf("%c", &ch);
                    getchar();
                    scanf("%d", &data);
                    p->adjvex = Find(G, ch);
                    p->data = data;
                    p->nextarc = G.vertices[i].firstarc;
                    G.vertices[i].firstarc = p;
               }
          }
     }
}
void Output(ALGraph G)       //输出图的有关信息
{
     for(int i = 0; i<G.vexnum; i++)
     {
          printf("%c : ", G.vertices[i].data);
          while(G.vertices[i].firstarc)                  //输出每个节点弧中所包含的数据
          {
               printf("%d  ", G.vertices[i].firstarc->data);
               G.vertices[i].firstarc = G.vertices[i].firstarc->nextarc ;
          }
          printf("
");
     }
}
int main()
{
     ALGraph G;
     Input(G);
     Output(G);
     return 0;
}
原文地址:https://www.cnblogs.com/fengxmx/p/3823287.html