图的构建(邻接表法)
程序员文章站
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);
}