欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

图的构建(邻接表法)

程序员文章站 2022-05-21 16:45:13
...
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<stdlib.h>
#include<math.h>
#include<malloc.h>
#include<string.h>
using namespace std;
#define maxvertexnum 20
typedef struct node//邻接的节点
{
       int index;//节点的标识
       node * next;//下一个节点的指针
       int weight;//邻接边的权值
}edgenode;
typedef struct vertexnode//顶点和它的邻接点
{
    int index;//顶点的标识
    edgenode * firstedge;//邻接点的单链表
}vertexnode,adjlist[maxvertexnum];
typedef struct//图
{
     adjlist adj;//顶点数组
     int n;//图的顶点数
     int e;//图的边数
}graph;
void creategraph(graph &g){
     int i,j,k;
     edgenode *p;
     cout<<"输入图的顶点数和边数"<<endl;
     cin>>g.n>>g.e;
     //建立顶点数组
     for(i=1;i<=g.n;i++){
         g.adj[i].index=i;//输入顶点的标识
         g.adj[i].firstedge=NULL;//顶点的邻接点的单链表指向null
     }
     //建立每个顶点的邻接点单链表
     cout<<"输入相邻接的两点"<<endl;
     for(k=1;k<=g.e;k++){

        cin>>i>>j;
        p=(edgenode *)malloc(sizeof(edgenode));
        p->index=j;
        p->next=g.adj[i].firstedge;
        g.adj[i].firstedge=p;
        //如果是无向图
        p=(edgenode *)malloc(sizeof(edgenode));
        p->index=i;
        p->next=g.adj[j].firstedge;
        g.adj[j].firstedge=p;
     }
}
void displaygraph(graph g)//遍历邻接表
{
     for(int i=1;i<=g.n;i++){
        cout<<i;
        edgenode *p;
        p=g.adj[i].firstedge;
        while(p){
           cout<<"->"<<p->index;
           p=p->next;
        }
        cout<<endl;
     }
}
int main ()
{
     graph g;
     creategraph(g);
     displaygraph(g);
}