创建邻接表(AdjacencyList)

本文介绍了一种使用邻接表存储结构实现无向图的方法。通过定义结构体和相关函数,可以创建并打印无向图。具体步骤包括初始化图的基本信息、输入顶点和边的信息、创建边的连接,并最终输出邻接表形式的图。

#include<stdio.h>
/*----------------------------邻接表的存储结构---------------------------*/
#define  MAX_VERTEX_NUM     20

typedef int  VRType;
typedef int  VertexType;

struct ArcNode {
   int      adjvex;
   struct ArcNode *nextarc;
   VRType   weight;
};

struct VexNode {
  VertexType    data;
  struct ArcNode  *firstarc;
};

typedef struct {
  struct VexNode  adjlist[MAX_VERTEX_NUM];
  int vexnum,arcnum;
}ALGraph;

/*============================================================================*/
int LocateVex(ALGraph *G,VertexType v)
{
  int i;
  for(i = 0;i < G->vexnum;i ++)
    if(v == (G->adjlist[i]).data )
       return i;
}

int CreateUDG(ALGraph *G)
{
   int i,j,k,kind=1;
   VRType weight=0;
   VertexType v1,v2;
   struct ArcNode *p;

   printf(" 1-Create DG/n 2-Create UDG/n CHOICE :");
   scanf("%d",&kind);

   printf("/n/n The Graph's number of Vertex :"); scanf("%d",&(G->vexnum));
   printf(" The Graph's number of Arcnum :"); scanf("%d",&(G->arcnum));
   printf("/n");
   for(i=0;i<G->vexnum;i++) {
      printf(" The Graph's %d Vertex's NAME:",i+1); scanf("%d",&(G->adjlist[i].data));
      G->adjlist[i].firstarc = NULL;
   }

   for(k=0;k<G->arcnum;k++)
   {
     printf("/n The %d Arc ./n",k+1);
     printf(" The tail vertex:");do{ scanf("%d",&v1);if((v1<=0)||(v1>G->vexnum))printf(" ERROR/n The tail vertex:"); }while((v1<=0)||(v1>G->vexnum));
     printf(" The head vertex:");do{ scanf("%d",&v2);if((v2<=0)||(v2>G->vexnum))printf(" ERROR/n The head vertex:"); }while((v2<=0)||(v2>G->vexnum));
     /*printf(" The arc  weight:");do{ scanf("%d",&weight); if(weight < 0) printf(" ERROR/n The arc  weight:"); }while(weight < 0);*/

     i = LocateVex(G,v1); j = LocateVex(G,v2);

     p = (struct ArcNode *)malloc(sizeof(struct ArcNode));
     p->adjvex = j;
     p->nextarc = G->adjlist[i].firstarc;
     p->weight = weight;
     G->adjlist[i].firstarc = p;

     if(2 == kind){
       p = (struct ArcNode *)malloc(sizeof(struct ArcNode));
       p->adjvex = i;
       p->nextarc = G->adjlist[j].firstarc;
       p->weight = weight;
       G->adjlist[j].firstarc = p;
     }
   }
   return 0;
}

void Prin_ALGraph(ALGraph *G)
{
   int k;
   struct ArcNode *p;

   printf("/n/n The Adjacenacy Vertex  =>/n/n");
   for(k = 0;k <G->vexnum;k ++)
   {
      p = G->adjlist[k].firstarc;
      printf("  /tVertex %d :",k+1);
      while( p != NULL ){  printf(" (%d,%d) ",G->adjlist[k].data,G->adjlist[p->adjvex].data);   p = p->nextarc; }
      printf("/n");
   }

}
/*------------------------------------------------------------------------------*/
int main()
{
   ALGraph G;
   CreateUDG(&G);
   Prin_ALGraph(&G);
   getch();
}

邻接表是图的一种常见表示方式,它通过链表的形式来表示图中每个结点的邻居结点。邻接表可以用于有向图和无向图的表示。 邻接表创建过程如下: 1. 定义一个数组,数组的每个元素表示图中的一个结点。 2. 对于每个结点,定义一个链表,链表中存储该结点的所有邻居结点。 3. 遍历图中的每个结点,将其加入数组中。 4. 对于图中的每条边 (u, v),将结点 v 加入结点 u 的邻接表中,将结点 u 加入结点 v 的邻接表中。 下面是伪代码实现: ``` // 定义结点结构体 struct Node { int val; // 结点的值 Node* next; // 指向下一个邻居结点的指针 }; // 定义邻接表结构体 struct AdjacencyList { vector<Node*> nodes; // 结点数组 }; // 创建邻接表 AdjacencyList createGraph(int n, vector<vector<int>>& edges) { AdjacencyList graph; graph.nodes.resize(n); // 初始化结点数组 // 初始化每个结点的链表头 for (int i = 0; i < n; i++) { graph.nodes[i] = new Node{i, nullptr}; } // 将每个结点的所有邻居结点加入链表中 for (auto& edge : edges) { int u = edge[0], v = edge[1]; Node* node1 = new Node{v, graph.nodes[u]->next}; graph.nodes[u]->next = node1; Node* node2 = new Node{u, graph.nodes[v]->next}; graph.nodes[v]->next = node2; } return graph; } ``` 其中,n 表示图中结点的数量,edges 是一个二维数组,表示图中的所有边。二维数组的每个元素是一个长度为 2 的数组,表示一条边的起点和终点。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值