图的建立的两种方法(领接矩阵,领接表)

//图的建立的实现->邻结矩阵和邻结表两种表示方法

#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("
");
     }
  
    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
", g->nv, g->ne);

    // for(i = 0;i < g->nv; i++) {
    //   //printf("%p
", 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("
");
    //  }
     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    建立无误
*/
原文地址:https://www.cnblogs.com/airfand/p/5011049.html