图的建立的两种方法(领接矩阵,领接表)
//图的建立的实现->邻结矩阵和邻结表两种表示方法 #include <cstdio> #include <cstdlib> //#define _OJ_ typedef struct Graph1 { int nv; int ne; int elem[100][100]; } Graph1, *Graph; typedef struct Edge1 { int v1, v2; // int weight;权重 } Edge1, *Edge; Graph creat_graph(int vertex, int edge2) { int i, j; Graph g; g = (Graph) malloc (sizeof(Graph1)); g->nv = vertex; g->ne = edge2; for(i = 0;i < vertex; i++) { for(j = 0;j < vertex; j++) { g->elem[i][j] = 0; } } return g; } void inser_v(Graph g, int v1, int v2) { g->elem[v1][v2] = 1; g->elem[v2][v1] = 1;//无向图则要写两个 == 1, 或者 == weight } Graph build_graph(void) { Graph g; Edge e; int nv, ne, i; scanf("%d %d", &nv, &ne); g = creat_graph(nv,ne); if(ne > 0) { e = (Edge) malloc (sizeof(Edge1)); for(i = 0;i < ne; i++) { scanf("%d %d", &e->v1, &e->v2); inser_v(g, e->v1, e->v2); } } return g; } int main(int argc, char const *argv[]) { #ifndef _OJ_ //ONLINE_JUDGE freopen("input.txt", "r", stdin); #endif int i, j; Graph g; g = build_graph(); for(i = 0;i < g->nv; i++) { for(j = 0;j < g->nv; j++) { printf("%d ", g->elem[i][j]); } printf("\n"); } return 0; }
更为简单的一种方法如下
// -------------------------------------------------------------------------------- // 更为简单的方法 int elem[100][100]; int i, j, nv, ne, v1, v2; scanf("%d %d", &nv, &ne); for(i = 0;i < nv; i++) { for(j = 0;j < nv; j++) { elem[i][j] = 0; } } for(i = 0;i < ne; i++) { scanf("%d %d", &v1, &v2); elem[v1][v2] = 1; elem[v2][v1] = 1; }
----------------------------------------------------------------------------------------------------------------------
利用邻接表建立图
Firstcell-> | nextnode-> | next-> | null |
firstcell-> | nextnode-> | null | |
firstcell-> | nextnode-> | null | |
firstcell-> | nextnode-> | next-> | null |
---------------------------------------------------------------------------------------------------------------------------------------------
//图的建立的实现->邻结矩阵和邻结表两种表示方法以及深度遍历 #include <cstdio> #include <cstdlib> //#define _OJ_ int visit[100]; typedef struct Lnode { int data; //邻结点的位置下标 // int weight; struct Lnode *next; //表由多排的链表组成 } Lnode, *Linklist; typedef struct Fnode { int elem; //每个顶点的信息 是数字或是字符 Linklist firstcell; //构成多个头节点 } Fnode1[100]; typedef struct Graph1 { int nv; int ne; Fnode1 G; //图由顶点数,边数,和邻接表组成 } Graph1, *Graph; typedef struct Edge1 { int v1; int v2; // int weight; //边由两个顶点的值构成 } Edge1, *Edge; Graph creat_graph(int vertex, int edge) //分配边数和节点数并初始化 { int i; Graph g; g = (Graph) malloc (sizeof(Graph1)); g->nv = vertex; g->ne = edge; for(i = 0;i < vertex; i++) { g->G[i].firstcell = NULL; //把每一个头接点赋初值 g->G[i].elem = i; //输入每个节点的信息 } return g; } void inser_edge(Graph g, Edge e) { Linklist L, L1; L = (Linklist) malloc (sizeof(Lnode)); L->data = e->v2; L->next = g->G[e->v1].firstcell; g->G[e->v1].firstcell = L; //无向图的插入两边 每次增加一个节点将其插入在最前面 L1 = (Linklist) malloc (sizeof(Lnode)); L1->data = e->v1; L1->next = g->G[e->v2].firstcell; g->G[e->v2].firstcell = L1; } Graph build_Graph(void) { Graph g; Edge e; int i, j, vertex, edge; scanf("%d %d", &vertex, &edge); g = creat_graph(vertex, edge); if(edge > 0) { e = (Edge) malloc (sizeof(Edge1)); for(i = 0;i < edge; i++) { scanf("%d %d", &e->v1, &e->v2); inser_edge(g, e); } return g; } } void DFS(Graph g, int v) { int i; visit[v] = 1; printf("%d ", g->G[v].elem); while (g->G[v].firstcell->next != NULL) { if(visit[g->G[v].firstcell->data] == 0) DFS(g, g->G[v].firstcell->data); g->G[v].firstcell = g->G[v].firstcell->next; } } void BFS_travers(Graph g) { int i; for(i = 0;i < g->nv; i++) visit[i] = 0; for(i = 0;i < g->nv; i++) if(visit[i] == 0) DFS(g, i); } int main(int argc, char const *argv[]) { #ifndef _OJ_ //ONLINE_JUDGE freopen("input.txt", "r", stdin); #endif int i, j; Graph g; g = build_Graph(); // printf("%d %d\n", g->nv, g->ne); // for(i = 0;i < g->nv; i++) { // //printf("%p\n", g->G[i].firstcell); //循环重复的遍历每一条链表 // printf("%d -> ", i); // while (g->G[i].firstcell != NULL) { // printf("%d ",g->G[i].firstcell->data); // g->G[i].firstcell = g->G[i].firstcell->next; // } // printf("\n"); // } BFS_travers(g); return 0; } /* 9 10 0 1 1 2 2 3 1 4 0 4 0 8 8 5 5 4 5 6 6 7 0 -> 8 4 1 1 -> 4 2 0 2 -> 3 1 3 -> 2 4 -> 5 0 1 5 -> 6 4 8 6 -> 7 5 7 -> 6 8 -> 5 0 建立无误 */