采用邻接表创建无向图G ,依次输出各顶点的度。
输入格式:
输入第一行中给出2个整数i(0<i≤10),j(j≥0),分别为图G的顶点数和边数。 输入第二行为顶点的信息,每个顶点只能用一个字符表示。 依次输入j行,每行输入一条边依附的顶点。
输出格式:
依次输出各顶点的度,行末没有最后的空格。
5 7
ABCDE
AB
AD
BC
BE
CD
CE
DE
代码实现如下:
#include<iostream>
using namespace std;
typedef int Status;
typedef char VerTexType;
#define MVNum 100 //最大顶点数
#define OK 1
typedef struct ArcNode{
int adjvex; //该边所指向的顶点的位置
struct ArcNode *nextarc; // 指向下一条边的指针
}ArcNode;
typedef struct VNode{ //顶点的信息
VerTexType data;
ArcNode *firstarc; //指向第一条依附该顶点的边的指针
}VNode,AdjList[MVNum]; //AdjList表示邻接表类型
typedef struct{ //邻接表
AdjList vertices;
int vexnum,arcnum; //图的当前顶点数和边数
}ALGraph;
Status LocateVex(ALGraph G,VerTexType x)
//CreateUDG里面用到的查找函数
{
for(int i=0;i<G.vexnum;i++)
{
if(G.vertices[i].data== x)
return i;
}
return -1;
}
Status CreateUDG(ALGraph &G)
{ //采用邻接表表示法,创建无向图
int i,j,k;
char v1,v2;
ArcNode *p1,*p2;
cin>>G.vexnum>>G.arcnum; //输入总的顶点数,总的边数
for(i=0;i<G.vexnum;i++) //输入各个点,构造表头结点表
{
cin>>G.vertices[i].data; //输入顶点值
G.vertices[i].firstarc=NULL; //初始化表头结点的指针域为NULL
}
for(k=0;k<G.arcnum;++k)
{
cin>>v1>>v2; //输入一条边依附的两个顶点
i=LocateVex(G,v1);
j=LocateVex(G,v2);
p1=new ArcNode; //生成一个新的结点*p1
p1->adjvex=j; //邻接点的序号为i
p1->nextarc=G.vertices[i].firstarc;
G.vertices[i].firstarc=p1;
//将新的结点插入顶点v1的边表头部
p2=new ArcNode;
p2->adjvex=i;
p2->nextarc=G.vertices[j].firstarc;
G.vertices[j].firstarc=p2;
//将新的结点*p2插入顶点vj的边表头部
}
return OK;
}
void Printf(ALGraph G) //打印函数,每个顶点关联的边数
{
int cnt,i;
ArcNode *p;
for(i=0;i<G.vexnum;i++)
{
cnt=0;
p=G.vertices[i].firstarc;
while(p!=NULL)
{
cnt++;
p=p->nextarc;
}
if(i==0)
cout<<cnt;
else
cout<<" "<<cnt;
}
}
int main()
{
ALGraph G;
CreateUDG (G);
Printf(G);
cout<<endl;
return 0;
}