#include<iostream>
#include<malloc.h>
#include<string.h>
#include<string>
#include<iomanip>
using namespace std;
typedef char ver[4];
typedef char info;
typedef int vr;
#define max 50 //最大顶点个数
typedef struct arcnode //节点的类型的定义
{
int adj; // 弧指向的顶点的信息
info *info; //与弧相关的信息
struct arcnode *nextarc;//指向下一个与该顶点向邻接的顶点
}arcnode;
typedef struct vnode
{
ver data; //储存顶点
arcnode *firstarc; //第一个与该顶点邻接的顶点
}vnode,adjlist[max];
typedef struct
{
adjlist vertex;
int vexnum,arcnum; //图的顶点数目与弧的数目
}adjgraph;
int locate(adjgraph g,ver v) //返回图中顶点对应的位置
{
int i;
for(i=0;i<g.vexnum;i++)
if(strcmp(g.vertex[i].data,v)==0)
return i;
return -1;
}
void creategraph(adjgraph *g) //采用邻接表储存结构 创建无向图
{
int i,j,k;
ver v1,v2; //定义两个顶点v1 v2
arcnode *p;
cout<<"请输入图的顶点数,边数(逗号分割):"<<endl;
cin>>(*g).vexnum>>(*g).arcnum; // 输入顶点数 和 边数
cout<<"请输入n个顶点的值:"<<endl;
for(i=0;i<g->vexnum;i++) //
{
cin>>g->vertex[i].data;
g->vertex[i].firstarc=NULL; //将相关联的顶点置为空
}
cout<<"请输入弧尾和弧头:"<<endl;
for(k=0;k<g->arcnum;k++)
{
cin>>v1>>v2;
i=locate(*g,v1); //查找该v1顶点是否存在
j=locate(*g,v2); //同理
//j为弧头 i为弧尾 创建邻接表
p=(arcnode*)malloc(sizeof(arcnode));
p->adj=j;
p->info=NULL;
p->nextarc=g->vertex[i].firstarc;
g->vertex[i].firstarc=p;
//i为弧头j为弧尾创建邻接表
p=(arcnode*)malloc(sizeof(arcnode));
p->adj=i;
p->info=NULL;
p->nextarc=g->vertex[j].firstarc;
g->vertex[j].firstarc=p;
}
}
void displaygraph(adjgraph g) //输出图的邻接矩阵
{
int i;
arcnode *p;
cout<<g.vexnum<<"个顶点:"<<endl;
for(i=0;i<g.vexnum;i++)
cout<<g.vertex[i].data<<" "; //输出各个顶点
cout<<endl;
cout<<2*g.arcnum<<"条边"<<endl;
for(i=0;i<g.vexnum;i++)
{
p=g.vertex[i].firstarc;
while(p)
{
cout<<g.vertex[i].data<<"->"<<g.vertex[p->adj].data<<" ";
p=p->nextarc;
}
cout<<endl;
}
}
int main()
{
adjgraph g;
cout<<"采用邻接矩阵创建无向图g:"<<endl;
creategraph(&g);
cout<<"输出无向图g:"<<endl;
displaygraph(g);
}
邻接表创建图
最新推荐文章于 2021-03-20 23:21:34 发布