邻接表创建图

来源:互联网 发布:西南大学网络学费多少 编辑:程序博客网 时间:2024/06/11 05:33
#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 v2arcnode *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);    }