1.邻接矩阵法 (较为简单)
#include <iostream>
#include <algorithm>
#define INT_MAX 999
#define OK 1
#define ERROR -1
typedef int Status;
using namespace std;
typedef struct Graph{
int vexs[100]; //结点数组
int arcs[100][100]; //边数组
int vexnum, arcnum; //节点数、边数
}Graph;
Status create_graph(Graph &G) { //构建有向图
cin >> G.vexnum >> G.arcnum;
int node;
for (int i = 0; i < G.vexnum; i++) {
cin >> node;
G.vexs[i] = node;
}
for (int k = 0; k < G.vexnum; k++) {
for (int j = 0; j < G.vexnum; j++) {
G.arcs[k][j] = 0;
}
}
int v1, v2;
for (int i = 0; i < G.arcnum; i++) {
cin >> v1 >> v2;
int t1 = 0,t2=0;
while (G.vexs[t1] != v1)
t1++;
while (G.vexs[t2] != v2)
t2++;
G.arcs[t1][t2] = 1;
G.arcs[t2][t1] = 1;
}
return OK;
}
void print(Graph G) {
for (int i = 0; i < G.vexnum; i++) {
for (int j = 0; j < G.vexnum; j++) {
cout << G.arcs[i][j] << " ";
}
cout << endl;
}
}
int main() {
Graph G;
create_graph(G);
print(G);
system("pause");
return 0;
}
2.邻接表法(数组+链表形式)
#include <iostream> #include <algorithm> #define OK 1 #define ERROR 0 typedef int Status; using namespace std; typedef struct Arcnode{ int adjvex; struct Arcnode *next; }Arcnode; typedef struct Vnode { int data; Arcnode *first; }Vnode,Adjlist[100]; typedef struct { Adjlist vexs; bool visited[100]; int vexnum, arcnum; }Graph; Status create_graph(Graph &G) { cin >> G.vexnum >> G.arcnum; int x; for (int i = 0; i < G.vexnum; i++) { cin >> x; G.vexs[i].data = x; G.visited[i] = 0; G.vexs[i].first = NULL; } int v0, v1; Arcnode *p; for (int j = 0; j < G.arcnum; j++) { cin >> v0 >> v1; int t0 = 0, t1 = 0; while (G.vexs[t0].data != v0) t0++; while (G.vexs[t1].data != v1) t1++; p = (Arcnode*)malloc(sizeof(Arcnode)); p->adjvex = t1; p->next = G.vexs[t0].first; G.vexs[t0].first = p; } return OK; } void Findindegree(Graph G, int indegree[]) { for (int i = 0; i < G.vexnum; i++) { indegree[i] = 0; } for (int i = 0; i < G.vexnum; i++) { while (G.vexs[i].first != NULL) { indegree[G.vexs[i].first->adjvex]++; G.vexs[i].first = G.vexs[i].first->next; } } } void Findoutdegree(Graph G, int outdegree[]) { for (int i = 0; i < G.vexnum; i++) { outdegree[i] = 0; } for (int i = 0; i < G.vexnum; i++) { while (G.vexs[i].first != NULL) { outdegree[i]++; G.vexs[i].first = G.vexs[i].first->next; } } } int main() { Graph G; create_graph(G); int indegree[100]; int outdegree[100]; Findindegree(G,indegree); Findoutdegree(G, outdegree); for (int i = 0; i < G.vexnum; i++) { cout << outdegree[i] << " "; cout << indegree[i]; cout << endl; } system("pause"); return 0; }