邻接表
创建一个邻接表表示法表示的无向图
算法如下:
- 按照输入顺序,依次将顶点存入顶点表中,使每个表头结点的指针域初始化为NULL。
- 创建邻接表(假设顶点信息唯一)
1 根据输入的一条边的两个顶点u和v,确定u和v在顶点表中的位置i和j
2 分别为u和v生成一个新的边结点pu和pv,
3 将其adjvex域分别赋值为j和i
4 分别将其插入顶点u和v的边链表头部(头插)
5 重复2.1-2.4直至所有边处理完毕
输入要求
输入有三部分组成
第一部分是2个整数n和m,表示图的定点数和边数
第二部分是由空格分割n个字符,表示n个顶点的信息。
第三部分由m行数据组成,每行数据是空格分割的2个字符,表示图中一条边的两个顶点
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MVNum 10
typedef struct ArcNode {
int adjvex; // 该边的起始点位置(下标)
struct ArcNode *nextarc; // 指向下一条边的指针
}ArcNode; // 边结点
typedef struct {
char data; // 顶点信息
ArcNode *firstarc; // 指向第一条依附该顶点的边
}VNode; // 表头结点
typedef struct
{
VNode vexs[MVNum]; // 顶点数组
int vexnum, arcnum;
}ALGraph;
void create(ALGraph &g);
void display(ALGraph &g){
int i = 0;
for (i=0; i<g.vexnum; i++){
printf("%c: ", g.vexs[i].data);
ArcNode *p = g.vexs[i].firstarc;
while(p!=NULL){
printf("%c ", g.vexs[p->adjvex].data);
p = p->nextarc;
}
printf("\n");
}
}
int main(){
ALGraph g;
create(g);
display(g);
}
void create(ALGraph &g){
// 先输入 顶点 边数
// printf("输入顶点数和边数\n");
scanf("%d %d",&g.vexnum, &g.arcnum);
getchar();
// 先把顶点表初始化
for(int k=0; k<g.vexnum; k++){
char e;
scanf("%c",&e);
g.vexs[k].data = e;
g.vexs[k].firstarc = NULL;
getchar();
}
// 在建立边链表 头插
ArcNode *p;
for(int k=0; k<g.arcnum; k++){
char a, b;
scanf("%c",&a);
getchar();
scanf("%c",&b);
getchar();
int i,j;
for(int d=0; d<g.vexnum; d++){
if(a==g.vexs[d].data)i=d;
if(b==g.vexs[d].data)j=d;
}
p = new ArcNode;
p->adjvex = j;
p->nextarc = g.vexs[i].firstarc;
g.vexs[i].firstarc = p;
p = new ArcNode;
p->adjvex = i;
p->nextarc = g.vexs[j].firstarc;
g.vexs[j].firstarc = p;
}
}