这里只实现了图的创建,并未实现更多的操作。顺便加上了一些邻接矩阵、邻接表、十字链表、邻接多重表的笔记。
所有cpp文件在:
Github GraphData Structure
邻接矩阵
# include<iostream>
using namespace std;
typedef char VertexType;
typedef int EdgeType;
# define MAXVEX 100
//邻接矩阵
typedef struct {
VertexType vexs[MAXVEX];
EdgeType arc[MAXVEX][MAXVEX];
int numVertexes, numEdges;
}MGraph;
// 创建邻接矩阵
void CreateMGraph(MGraph* G)
{
cout << "输入顶点数和边数:";
cin >> G->numVertexes >> G->numEdges;
for (int i = 0; i < G->numVertexes; i++) // 输入顶点的信息
cin >> G->vexs[i];
for (int i = 0; i < G->numVertexes; i++) // 对邻接矩阵的内容进行初始化
for (int j = 0; j < G->numVertexes; j++)
G->arc[i][j] = INFINITY;
int i, j, w;
for (int k = 0; k < G->numEdges; k++) // 读入边的信息,建立邻接矩阵
{
cout << "输入边(vi, vj)上的下标i和下标j,以及该条边的权:";
cin >> i >> j >> w;
G->arc[i][j] = w;
G->arc[j][i] = w;// 因为是无向图,所以这个邻接矩阵是个对称矩阵
}
}
int main() {
return 0;
}
邻接表
# include<iostream>
using namespace std;
typedef char VertexType;
typedef int EdgeType;
# define MAXVEX 100
// 邻接表
typedef struct EdgeNode { // 边表结点
int adjvex; // 邻接点域
EdgeType weight; // 存储权值,用于网图
struct EdgeNode* next; // 指向下个结点
}EdgeNode;
typedef struct VertexNode { // 顶点表结点
VertexType data;
EdgeNode* firstedge; // 边表头指针
}VertexNode, AdjList[MAXVEX];
typedef struct {
AdjList adjList;
int numVertexes, numEdges; // 图中当前顶点数和边数
}GraphAdjList;
// 创建邻接表
void createALGraph(GraphAdjList* G) {
cout << "输入顶点数和边数:";
cin >> G->numVertexes >> G->numEdges;
for (int i = 0; i < G->numVertexes; i++) { // 输入顶点信息
cin >> G->adjList[i].data; // 输入顶点信息
G->adjList[i].firstedge = NULL; // 将边表置空
}
int i, j;
EdgeNode* e;
for (int k = 0; k < G->numEdges; k++) {
cout << "输入边(vi,vj)上的序号:";
cin >> i >> j;
e = (EdgeNode*)malloc(sizeof(EdgeNode)); // 向内存申请一个边结点空间
e->adjvex = j;
e->next = G->adjList[i].firstedge; // 将边结点指向的位置指向这个i点原本的next
G->adjList[i].firstedge = e; // 将firstedge指向e
// 无向图,重复上述步骤,调换i和j
e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->adjvex = i;
e->next = G->adjList[j].firstedge;
G->adjList[j].firstedge = e;
}
}
int main() {
return 0;
}
十字链表
# include<iostream>
using namespace std;
typedef char VertexType;
typedef int EdgeType;
# define MAXSIZE 100
typedef struct EdgeNode {
int tailvex;
int headvex;
struct EdgeNode *headlink;
struct EdgeNode *taillink;
EdgeType weight;
}EdgeNode;
typedef struct VertexNode {
VertexType data;
EdgeNode *firstin;
EdgeNode *firstout;
}VertexNode, AdjList[MAXSIZE];
typedef struct {
AdjList adjList;
int numVertexes, numEdges;
}GraphOrthgonalList;
void createGraph(GraphOrthgonalList* G) {
cout << "请输入顶点个数、边数:";
cin >> G->numVertexes >> G->numEdges;
for (int i = 0; i < G->numVertexes; i++) { // 根据顶点个数初始化顶点
cin >> G->adjList[i].data;
G->adjList[i].firstin = NULL;
G->adjList[i].firstout = NULL;
}
int i, j;
EdgeNode *e;
for (int k = 0; k < G->numEdges; k++) { // 根据边数初始化边
cout << "输入该条边的两个顶点,先输出度再输入度";
cin >> i >> j;// 输入该条边的两个顶点
e = (EdgeNode*)malloc(sizeof(EdgeNode)); // 申请一个EdgeNode空间
e->tailvex = i;
e->headvex = j;
// 先添加好出度的信息
e->taillink = G->adjList[i].firstout;
G->adjList[i].firstout = e;
// 接着添加入度的信息,即把上面的结点插到headvex的链表里去
e->headlink = G->adjList[j].firstin;
G->adjList[j].firstin = e;
}
}
int main() {
return 0;
}
邻接多重表
# include<iostream>
using namespace std;
# define MAXSIZE 100
typedef char VertexType;
typedef int EdgeType;
typedef struct EdgeNode {
int mark; // 标记是否被遍历过(根据需求使用)
int ivex;
struct EdgeNode *ilink; // 依附于ivex的指针
int jvex;
struct EdgeNode *jlink; // 依附于jvex的指针
EdgeType weight; // 记录权值(根据需求使用)
}EdgeNode;
typedef struct VertexNode {
VertexType data; // 顶点的信息
EdgeNode *firstedge; // 顶点里的边指针
}VertexNode, AdjMultiList[MAXSIZE];
typedef struct {
AdjMultiList adjMultiList; // VertexNode数组
int numVertex, numEdge; // 顶点和边的数量
}GraphAdjMultiList;
void CreateGraph(GraphAdjMultiList* G) {
cout << "请输入顶点的数量和边的数量:" << endl;
cin >> G->numVertex >> G->numEdge;
for (int i = 0; i < G->numVertex; i++) {
cin >> G->adjMultiList[i].data;
G->adjMultiList[i].firstedge = NULL;
}
int i, j;
EdgeNode *e;
for (int k = 0; k < G->numEdge; k++) {
cout << "请输入该边的两个顶点:" << endl;
cin >> i >> j;
e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->ivex = i;
e->jvex = j;
e->ilink = G->adjMultiList[i].firstedge;
G->adjMultiList->firstedge = e;
e->jlink = G->adjMultiList[j].firstedge;
G->adjMultiList->firstedge = e;
}
}
int main() {
return 0;
}