邻接表(无向图):
代码实现:
邻接表(无向图):
#include#include #define MVNum 100 //边表 typedef struct ArcNode { int adjvex;//该边另一条结点位置 struct ArcNode* nextarc;//指向下一条边的指针 int weight;//权值 }ArcNode; //顶点 typedef struct VNode { int date;//当前顶点信息 ArcNode* firstarc;//指向第一条边依附的指针 }VNode,AdjList[MVNum]; //邻接表 typedef struct { AdjList vertices;//存放顶点信息的数组 int vexnum, arcnum;//存放当前顶点数和弧数 }ALGraph; //定位函数 int LocateVex(ALGraph G, char v) { for (int i = 0; i < G.vexnum; i++) { if (G.vertices[i].date == v) return i; } } //创建 void Create(ALGraph& G) { int i, k; printf("输入总顶点数和边数:n"); scanf("%d%d",&G.vexnum, &G.arcnum);//输入总顶点数和边数 printf("分别输入各个顶点的值:n"); for (i = 0; i < G.vexnum; i++) { scanf("%d", &G.vertices[i].date);//输入顶点值 G.vertices[i].firstarc = NULL;//初始化指针域为空 } printf("分别输入各条边连接的两个顶点:n"); for ( k = 0; k < G.arcnum; k++) { int i, j, v1, v2; scanf("%d%d", &v1, &v2); //定位输入结点的位置 i = LocateVex(G, v1); j = LocateVex(G, v2); //指向该结点 ArcNode* p1 = (ArcNode*)malloc(sizeof(ArcNode)); p1->adjvex = j;//将输入结点的位置赋值给p1 //连接结点 p1->nextarc = G.vertices[i].firstarc;//p1的下一边的位置为顶点的第一条依附指针 G.vertices[i].firstarc = p1;//当前顶点的依附指针指向p1 //相互指向,无向网 ArcNode* p2 = (ArcNode*)malloc(sizeof(ArcNode)); p2->adjvex = i; p2->nextarc = G.vertices[j].firstarc; G.vertices[j].firstarc = p2; } } //输出表 void print(ALGraph& G) { printf("n"); printf("输出邻接表:n"); ArcNode* p; for (int i = 0; i < G.vexnum; i++) { printf("顶点%d:n", G.vertices[i].date); for (p=G.vertices[i].firstarc;p;p=p->nextarc) { printf(" 连接边的下标位置:(%d)", p->adjvex); } printf("n"); } } int main() { ALGraph G; Create(G); print(G); return 0; }
这便是邻接表(无向图)的实现。



