参考:《大话数据结构》
邻接表的缺陷:不能同时关注出度和入度
十字链表:
(1)顶点表
firstin表示入边表头指针,指向该顶点的入边表中的第一个结点;firstout表示出边表头指针,指向该顶点的出边表中的第一个结点。
(2)边表结点
tailvex是弧起点在顶点表中的下标;headvex是弧终点在顶点表中的下标;headlink是指入边表指针域,指向终点相同的下一条边;taillink是指出边表指针域,指向起点相同的下一条边。如果是网还可以增加一个weight域来存储权值。
.h文件
#pragma once #define MAXVEX 20 typedef char VertexType; //顶点类型应由用户定义 typedef int EdgeType; //边上的权值类型应由用户定义 typedef struct EdgeNode //边表结点 { int tailvex; int headvex; EdgeType weight; struct EdgeNode *headlink; struct EdgeNode *taillink; }EdgeNode; typedef struct VertexNode //顶点表结点 { VertexType data; EdgeNode *firstin; //入边表头指针 EdgeNode *firstout; //出边表头指针 }VertextNode, CrossList[MAXVEX]; typedef struct { CrossList adjList; int numVertexes, numEdges; //图中当前顶点数和边数 }GraphCrossList; void CreateALGraph(GraphCrossList *G);
.cpp文件
#include "stdafx.h" #include "adjLinkGraph.h" #include <cstdlib> void CreateALGraph(GraphCrossList *G) { int i, j, k; EdgeNode *e; printf("输入顶点数和边数: "); scanf_s("%d,%d", &G->numVertexes, &G->numEdges); for (i = 0; i < G->numVertexes; i++) { printf("输入顶点数据: "); scanf_s("%d", &G->adjList[i].data); G->adjList[i].firstin = NULL; G->adjList[i].firstout = NULL; } for (k = 0; k < G->numEdges; k++) { printf("输入边<vi,vj>上的顶点序号: "); scanf_s("%d,%d", &i, &j); /* * firstin 入边表头指针,当前顶点作为弧起点 * firstout 出边表头指针,当前顶点作为弧终点 * * tailvex 弧起点 * headvex 弧终点 * * taillink 入边表头指针,当前结点作为弧起点 * headlink 出边表头指针,当前结点作为弧终点 */ e = (EdgeNode *)malloc(sizeof(EdgeNode)); e->tailvex = i; e->headvex = j; e->taillink = G->adjList[i].firstout; e->headlink = G->adjList[j].firstin; G->adjList[i].firstout = e; G->adjList[j].firstin = e; } }
创建并显示结果
// AdjecentTable.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "adjLinkGraph.h" void Display(GraphCrossList G) { int i; EdgeNode *e; printf("共%d个顶点,%d条弧 ",G.numVertexes,G.numEdges); for(i=0;i<G.numVertexes;i++) { printf("顶点%d入度:",G.adjList[i].data); e = G.adjList[i].firstin; while (e) { printf("%d ",G.adjList[e->tailvex].data); e = e->headlink; } printf("出度"); e = G.adjList[i].firstout; while (e) { printf("%d ",G.adjList[e->headvex].data); e = e->taillink; } printf(" "); } } int main() { GraphCrossList G; CreateALGraph(&G); printf("邻接表创建成功!"); Display(G); getchar(); return 0; }
结果: