#include<iostream>
using namespace std;
//边表的结点
typedef struct Arcnode {
//当前弧指向顶点的位置
int adjvex;
//指向下一条弧的指针
struct Arcnode* nextarc;
}Arcnode;
//顶点表结点
typedef struct Vnode {
//顶点信息
char data;
//指向第一条依附于该顶点的弧的指针
Arcnode* firstarc;
}Vnode;
//组合的邻接表
struct AGraph {
//邻接表
Vnode adjlist[10];
//顶点数和弧数
int v;
int e;
};
void insertedge(AGraph& g, int v1n, int v2n)//插入边
{
Arcnode* p;//建立边结点的指针
p = (Arcnode*)malloc(sizeof(Arcnode));//申请一个边结点空间
//以下三步为头插法建立链表,将v2插入到v1后面
p->adjvex = v2n;
p->nextarc = g.adjlist[v1n].firstarc;
g.adjlist[v1n].firstarc = p;
//这个下面的三步是建立无向图的步骤,将v1同时插入到v2后面
p = (Arcnode*)malloc(sizeof(Arcnode));
//v2->v1
p->adjvex = v1n;
p->nextarc = g.adjlist[v2n].firstarc;
g.adjlist[v2n].firstarc = p;
}
void CreatA(AGraph& g)//建立只有一个顶点没有边邻接表
{
char v1, v2;//v1和v2代表两个顶点,而不能输入下标位置
int v1n, v2n;//知道它的值还要知道他们在数组中的下标
cout << "请输入顶点数量:";
cin >> g.v;//存入顶点数
for (int i=0; i < g.v; i++)//从数组下标中为0遍历到小于顶点数量
{
cout << "请输入顶点信息:";
cin >> g.adjlist[i].data;//每次输入顶点数量保存在data域中
g.adjlist[i].firstarc = NULL;//因为还没有设置边所以指向空
}
//插入边
cout << "请输入边的数量:";
cin >> g.e;
for (int i = 0; i < g.e; i++)
{
cout << "v1->v2:";
cin >> v1 >> v2;
for (int i = 0; i < g.v; i++) {
if (g.adjlist[i].data == v1)
v1n = i;
if (g.adjlist[i].data == v2)
v2n = i;
}
insertedge(g, v1n, v2n);
}
}
void displayA(AGraph g)
{
Arcnode* p;
for (int i = 0; i < g.v; i++)
{
cout << g.adjlist[i].data << "->";
p = g.adjlist[i].firstarc;
while (p)
{
cout << g.adjlist[p->adjvex].data << "->";
p = p->nextarc;
}
if (p == NULL)
cout << "NULL";
cout << endl;
}
}
struct MGraph {
char vertex[10];
int edges[10][10];
int v, e;
};
void displayB(MGraph g)
{
cout << " ";
for (int i = 0; i < g.v; i++)
{
cout << g.vertex[i] << " ";
}
cout << endl;
for (int i = 0; i < g.v; i++)
{
cout << g.vertex[i] << " ";
for (int j = 0; j < g.v; j++)
{
cout << g.edges[i][j]<<" ";
}
cout << endl;
}
}
void AGtoMG(AGraph ga, MGraph& gm)
{
Arcnode* p;
for (int i = 0; i < ga.v; i++)
{
for (int j = 0; j < ga.v; j++)
gm.edges[i][j] = 0;
}
for (int i = 0; i < ga.v; i++)
{
gm.vertex[i] = ga.adjlist[i].data;
}
for (int i = 0; i < ga.v; i++)
{
p = ga.adjlist[i].firstarc;
while (p)
{
gm.edges[i][p->adjvex] = 1;
p = p->nextarc;
}
}
gm.e = ga.e;
gm.v = ga.v;
}
int main(int argc, const char* argv[])
{
AGraph ga;
MGraph gm;
CreatA(ga);
displayA(ga);
cout << endl;
AGtoMG(ga, gm);
displayB(gm);
system("pause");
return 0;
}