邻接表创建图

#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);
    

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值