三个结构体表示邻接表
1.顶点头结点结构体
2.邻接点结构体
3.图的结构体
#include<iostream>
#include<queue>
#include<stack>
using namespace std
#include Maxvertex 50
//顶点结构体
struct vertex
{
char name[50];//顶点名字
struct edgenode * first; //领接点结构体指针
};
//邻结点结构体
struct edgenode
{
int pos;//顶点在顶点数组中位置
struct edgenode *next; //下一邻结点指针
int weight; //结点相关权重
};
//邻接表图结构体
struct graphlist
{
vertex head[Maxvertex]; //头结点数组
int vertexnum; //顶点数
int edgenum; //边数
};
int localvertex(graphlist &g, char *name)
{
for(int i=0;i<g.vertexnum;i++)
{
if(strcmp(g.head[i].name,name)==0)
{
return i;
}
}
retuen -1; //未发现。
}
//创建一个图
void creategraph(graph &g)
{
cout<<"输入图的顶点数和边数:顶点 边"<<endl;
cin>>g.vertexnum>>g.edgenum;
cout<<"输入"<<g.vertexnum<<"个顶点的值"<<endl;
for(int i=0;i<g.vertexnum;i++)
{
cin>>g.head[i].name;
g.head[i].first=NULL; //暂无领接点
}
cout<<"输入"<<g.edgenum<<"条边 顶点v1 顶点v2"<<endl;
char v1[50],v2[50];
for(int i=0;i<g.edgenum;i++)
{
cin>>v1>>v2;
int m=localvertex(g,v1); //m为头结点的链表,n是m的邻接点
int n=localvertex(g,v2);
//链表中加邻接点
edgenode *pnew=new edgenode;
//初始化邻接点
pnew->pos=n;//邻接点在顶点数组中的位置
//pnew用头插法添加到头结点的数组第m个元素对应的链表中
pnew->next=g.head[m].first;
g.head[m].first=pnew;
#if 1 //#if 0为有向图,反之为无向图
//以n为头节点的链表,m为邻接点
edgenode* pnew1=new edgenode;
//初始化邻接点
pnew1->pos=m;
pnew1->next=g.head[i].first;
g.head[i].first=pnew1;
#endif
}
}
//打印输出图
void printgraphlist(graphlist &g)
{
for(int i=0;i<g.vertexnum;i++)
{
edgenode* pnode=g.head[i].first;
cout<<g.head[i].name<<":";
while(pnode!=NULL)
{
int index=pnode->pos;
cout<<g.head[index].name<<",";
pnode=pnode->next;
}
cout<<endl;
}
cout<<endl;
}