#include <iostream> using namespace std; #define INFINITY 65536//无穷大 #define MAX_VERTEX_NUM 10//最大顶点个数 typedef enum{DG,DN,UDG,UDN}GraphKind;//有向图,有向网,无向图,无向网 struct Graph { char vexs[MAX_VERTEX_NUM];//储存顶点 int arc[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵 int vexnum, arcnum;//顶点数和边(弧)数 GraphKind kind;//图的种类 }; //确定顶点序号 int LocateVex(Graph *G, char ch) { for (int i = 0; i < G->vexnum; i++) if (G->vexs[i] == ch) { return i;//返回顶点序号 break; } return -1; } void CreateUDN(Graph *G)//创建无向网 { int i, j; char v1, v2;//记录顶点名称 int w;//记录权值 cout << "请输入顶点个数:" << endl;cin >> G->vexnum; cout << "请输入边的个数:" << endl;cin >> G->arcnum; cout << "构造顶点:" << endl; for (int i = 0; i < G->vexnum; i++)//构造顶点 cin >> G->vexs[i]; for (int i = 0; i < G->vexnum; i++)//初始化邻接矩阵 for (int j = 0; j < G->vexnum; j++) G->arc[i][j] = 0; cout << "构造邻接矩阵:" << endl; for (int k = 0; k < G->arcnum; k++) { cin >> v1 >> v2 >> w; i = LocateVex(G, v1); j = LocateVex(G, v2); G->arc[j][i] = G->arc[i][j] = w; } } void CreateGraph(Graph *G) { switch (G->kind) { //case DG:return CreateDG(G); //case DN:return CreateDN(G); //case UDG:return CreateUDG(G); case UDN:return CreateUDN(G); } } //遍历邻接矩阵 void PrintArc(Graph *G) { int i, j; for (i = 0; i < G->vexnum; i++) { for (j = 0; j < G->vexnum; j++) cout << G->arc[i][j] << " "; cout << endl; } } //邻接表 struct ENode//边结点 { int index;//边所指向的点的序号 int info;//记录权值 struct ENode* next;//指向下一条边 }; struct VNode//顶点结点 { char data;//顶点名称 ENode* first;//指向顶点的第一个邻边 }; struct AGraph//记录图的信息 { int vexnum, arcnum;//顶点数和边数 VNode p[MAX_VERTEX_NUM];//顶点数组 GraphKind kind;//图的种类 }; int LocateVex(AGraph *G,char ch) { for (int i = 0; i < G->vexnum; i++) if (ch == G->p[i].data) { return i; break; } return -1; } //创建邻接表 void CreateAGraph(AGraph *G) { int i, j, info; char v1, v2; cout << "请输入顶点个数:" << endl; cin >> G->vexnum; cout << "请输入边的个数:" << endl; cin >> G->arcnum; cout << "构造顶点:" << endl; for (int i = 0; i < G->vexnum; i++)//构造顶点数组 { cin >> G->p[i].data; G->p[i].first = NULL; } cout << "构造邻接表:" << endl; for (int k = 0; k < G->arcnum; k++) { cin >> v1 >> v2 >> info; i = LocateVex(G, v1); j = LocateVex(G, v2); ENode *E = (ENode*)malloc(sizeof(ENode)); E->index = j; E->info = info; E->next = G->p[i].first;//头插法 G->p[i].first = E; } } //打印邻接表 void PrintAGraph(AGraph *G) { for (int i = 0; i < G->vexnum; i++) { cout << G->p[i].data; if (G->p[i].first != NULL) { ENode *p = G->p[i].first; while (p->next != NULL) { cout << "->" << p->index; p = p->next; } cout << "->" << p->index; } cout << endl; } } int main() { Graph *G=(Graph*)malloc(sizeof(Graph)); G->kind = UDN; CreateGraph(G); PrintArc(G); cout << endl; cout << "-------------------------------------" << endl; cout << "邻接表:" << endl; AGraph *AG=(AGraph*)malloc(sizeof(AGraph)); CreateAGraph(AG); PrintAGraph(AG); system("pause"); return 0; }
运行结果:
来源:https://www.cnblogs.com/cs0915/p/12238183.html