采用经典的数据结构算法,略有改动。
#include <stdio.h>
#include <stdlib.h>
#define ElenType int
#define InfoType char
#define VertextType int//顶点信息
#define Status int//返回值类型
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define MAX_VERTEX_NUM 20
//顶点的最大数量
//讨论无向图(虽然arc代表弧)的邻接表,采用经典的代码命名
/*表节点*/
typedef struct ArcNode{
int adjvex;//该边所指向的顶点位置
ArcNode *nextarc;//指向下一条边
InfoType *info;//边的信息
}ArcNode;
typedef struct VNode{
VertextType data;//顶点信息
ArcNode *firstarc;//指向第一条依附于该点的边
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct{
AdjList vertices;
int vexnum,arcnum;//图的顶点数和边数
}ALGraph;//Adjacency List Graph
/*创建图*/
void CreateALG(ALGraph &G){
int i,j,k;
ArcNode *an;
printf("输入图的顶点数和边数:");
scanf("%d%d",&G.vexnum,&G.arcnum);
printf("请输入%d个顶点的值:\n",G.vexnum);
for(k=0;k<G.vexnum;k++){
scanf("%d",&G.vertices[k].data);
G.vertices[k].firstarc = NULL;
}
for(k=0;k<G.arcnum;k++){
printf("请输入第%d条边的两个结点位置:",k+1);
/*如果输入的是结点的值,还要通过LocateVex函数来查找结点在图中的位置*/
/*这里简单起见。直接输入*/
scanf("%d%d",&i,&j);
an = (ArcNode*)malloc(sizeof(ArcNode));
an->info = NULL;//没有信息
an->adjvex = j;//先是i到j
an->nextarc = G.vertices[i].firstarc;//前插法
G.vertices[i].firstarc = an;
an = (ArcNode*)malloc(sizeof(ArcNode));
an->info = NULL;//没有信息
an->adjvex = i;//同时j也会到i
an->nextarc = G.vertices[j].firstarc;
G.vertices[j].firstarc = an;
}
}
/*打印邻接表*/
void DisPlayALG(ALGraph G){
printf("<结点的值(这里同时也是序号位置)>--位置->\n");
for(int i=0;i<G.vexnum;i++){
printf("<%d>--",i);
while(G.vertices[i].firstarc){//第i个结点的邻接结点没打印完
printf("%d->",G.vertices[i].firstarc->adjvex);
G.vertices[i].firstarc = G.vertices[i].firstarc->nextarc;//移动指针
}
printf("\n");
}
}
int main(){
ALGraph G;
CreateALG(G);
DisPlayALG(G);
return 0;
}
运行结果:
对应的图是这个: