参考:datastructs_and_algorithm/list_udg.c at master · wangkuiwu/datastructs_and_algorithm (github.com)
参考:c语言实现无向图的邻接表储存_LiQiyao的博客-CSDN博客
#include<stdio.h>
#include<stdlib.h>
/* 最大顶点数 */
#define MAX_VERTEX_NUM 100
#define isLetter(a) ((((a)>='a')&&((a)<='z')) || (((a)>='A')&&((a)<='Z')))
// 邻接表中链表中的结点
typedef struct ArcNode{
int adjvex; //边所指向的另一个顶点的下标
struct ArcNode *nextarc; //指向表头结点的下一条边
}ArcNode;
// 邻接表中表的顶点
typedef struct VNode{
char vertex; //顶点值
ArcNode *firstarc; //指向第一条依附该顶点的边
}VNode, AdjList[MAX_VERTEX_NUM];
// 邻接表
typedef struct{
AdjList adjlist; //顶点数组
int vexnum; //无向图的顶点数
int arcnum; //无向图的边数
}ALGraph;
/*
* 读取一个输入字符
*/
static char read_char()
{
char ch;
do {
ch = getchar();
} while(!isLetter(ch));
return ch;
}
/*
* 返回顶点u在邻接表存储的无向图G中的位置(下标)
* 如不存在则返回-1
*/
int LocateVex(ALGraph *G, char u)
{
int i;
for(i=0; i < G->vexnum; i++)
{
if( G->adjlist[i].vertex == u)
{
return i;
}
}
return -1;
}
void CreateALGraph(ALGraph *G)
{
ArcNode *p, *q;
int i, j, k, x;
char v1, v2;
//输入顶点数与边数
printf("输入无向图的顶点个数和边的数目(以空格隔开):");
scanf("%d %d", &G->vexnum, &G->arcnum);
printf("\n输入各个顶点值:\n");
for(x = 0; x < G->vexnum; x++)
{
printf("顶点(%d): ", x);
// 输入表头数组数据域的值
G->adjlist[x].vertex = read_char();
// 表头数组链域置空
G->adjlist[x].firstarc = NULL;
}
k = 0;
// 输入图中每一条边
while( k < G->arcnum )
{
// 输入有边连接的顶点对
printf("\n输入有边连接的顶点对\n");
printf("边(%d): ", k+1);
printf("输入边的顶点1:");
v1 = read_char();
printf("边(%d): ", k+1);
printf("输入边的顶点2:");
v2 = read_char();
i = LocateVex(G, v1);
j = LocateVex(G, v2);
if( ( i == -1 ) || ( j == -1 ) )
{
printf("该边不存在,请重新输入\n");
}
else
{
// 边计数
k++;
// 申请空间,生成表结点
p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = j;
// p指针指向当前顶点指向的结点
p->nextarc = G->adjlist[i].firstarc;
// 结点 j 插入第 i 个链表
G->adjlist[i].firstarc = p;
q = (ArcNode *)malloc(sizeof(ArcNode));
q->adjvex = i;
q->nextarc = G->adjlist[j].firstarc;
// 结点 i 插入第 j 个链表
G->adjlist[j].firstarc = q;
}
}
}
/*
* 打印邻接表
*/
void PrintUDG(ALGraph G)
{
int i;
ArcNode *p;
printf("\n打印无向图邻接表:\n");
for(i = 0; i < G.vexnum; i++)
{
printf("%d(%c): ",i, G.adjlist[i].vertex);
p = G.adjlist[i].firstarc;
while( p != NULL)
{
printf("->%d(%c) ", p->adjvex, G.adjlist[p->adjvex].vertex);
p = p->nextarc;
}
printf("\n");
}
}
int main()
{
ALGraph G;
CreateALGraph(&G);
PrintUDG(G);
return 0;
}