#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define MVNUM 50
typedef bool VisitIf;
typedef char VerTex;
typedef struct ArcNode
{
VisitIf visitIf;
int ivex;
int jvex;
struct ArcNode* ilink;
struct ArcNode* jlink;
}ArcNode;
typedef struct VexNode
{
VerTex vex;
ArcNode* firstArc;
}Vex[MVNUM];
typedef struct
{
Vex Vertrices;
int vexnum;
int arcnum;
}AMLGraph;
void CleanCache()
{
char ch;
while ((ch = getchar()) != '\n' && ch != EOF);
}
int GetIndex(AMLGraph &G, VerTex vex)
{
for (int i = 0; i < G.vexnum; i++)
{
if (vex == G.Vertrices[i].vex)
{
return i;
}
}
return -1;
}
ArcNode* CreateArcNode()
{
ArcNode* newnode = (ArcNode*)malloc(sizeof(ArcNode));
if (NULL == newnode)
{
printf("分配内存失败!\n");
exit(-1);
}
return newnode;
}
void CreateUDM(AMLGraph &G)
{
printf("请输入顶点和边个数:\n");
scanf_s("%d%d", &G.vexnum, &G.arcnum);
for (int i = 0; i < G.vexnum; i++)
{
printf("请输入第%d个节点的信息:\n", i + 1);
CleanCache();
scanf_s("%c", &G.Vertrices[i].vex, 1);
G.Vertrices[i].firstArc = NULL;
}
for (int k = 0; k < G.arcnum; k++)
{
printf("请输入第%d条边的信息:\n", k + 1);
CleanCache();
VerTex ctemp1;
VerTex ctemp2;
scanf_s("%c%c", &ctemp1, 1, &ctemp2, 1);
int i = GetIndex(G, ctemp1);
int j = GetIndex(G, ctemp2);
ArcNode* arcNode = CreateArcNode();
arcNode->visitIf = false;
arcNode->ivex = i;
arcNode->ilink = G.Vertrices[i].firstArc;
G.Vertrices[i].firstArc = arcNode;
arcNode->jvex = j;
arcNode->jlink = G.Vertrices[j].firstArc;
G.Vertrices[j].firstArc = arcNode;
}
}
void PrintUDM(AMLGraph& G)
{
for (int i = 0; i < G.vexnum; i++)
{
printf("顶点:%c\n", G.Vertrices[i].vex);
printf("邻接点:");
ArcNode* ptemp = G.Vertrices[i].firstArc;
while (ptemp)
{
if (ptemp->ivex == i)
{
printf("%4c", G.Vertrices[ptemp->jvex].vex);
ptemp = ptemp->ilink;
}
else
{
printf("%4c", G.Vertrices[ptemp->ivex].vex);
ptemp = ptemp->jlink;
}
}
printf("\n");
}
}
int main(void)
{
AMLGraph G;
CreateUDM(G);
PrintUDM(G);
return 0;
}
没有注释,大家应该看不懂吧。可以先去看完其他文章理解一下多重邻接表的原理再看应该就可以理解啦。