本文采用邻接表的方法创建无向图、并采用查找函数
(来源于青岛大学王卓老师)
typedef struct Arcnode
{
int adjvex; // 该弧所指向的顶点的位置
struct Arcnode *nextarc; // 指向下一条弧的指针
int info; // 该弧相关信息的指针
} Arcnode;
typedef struct Vnode
{
char data; // 顶点信息
Arcnode *firstarc; // 指向第一条依附着该顶点的弧的指针
} Vnode, Adjlist[Maxnum];
typedef struct
{
Adjlist verices;
int vex, arc; // 图当前顶点数和弧数
int kind; // 图的类型
} ALG;
int locatevex(ALG G, char e)
{ // 查找对应顶点序号
int i;
for (int i = 0; i < G.vex; i++)
{
if (e == G.verices[i].data)
{
return i;
}
}
}
void creatUDG(ALG &G)
{ // 创建无向网
cout << "请分别输入您要创建的图的结点数和弧数:";
cin >> G.vex >> G.arc;
cout << "请输入你想创图的序列:(例如:abcde)";
for (int k = 0; k < G.vex; k++)
{ // 创建表头链表并初始化
cin >> G.verices[k].data;
G.verices[k].firstarc = NULL;
}
cout << "请输入您的图中所以弧"
<< "\n";
cout << "输入方式:弧头 弧尾:"
<< "\n";
for (int m = 0; m < G.arc; m++)
{
char v1, v2;
cin >> v1 >> v2;
int i = locatevex(G, v1); // 查找对应顶点序号
int j = locatevex(G, v2);
Arcnode *p1 = new Arcnode;
p1->adjvex = j; // 新结点头插入
p1->nextarc = G.verices[i].firstarc;
G.verices[i].firstarc = p1;
Arcnode *p2 = new Arcnode; // 另一个对称边的结点
p2->adjvex = i;
p2->nextarc = G.verices[j].firstarc;
G.verices[j].firstarc = p2;
}
}