数据结构图应用实验报告 - C语言实现

实验目的

  1. 掌握数据结构图的基本概念和应用。
  2. 了解图的存储方式:邻接矩阵和邻接表。
  3. 掌握图的遍历算法:深度优先搜索和广度优先搜索。

实验原理

图是一种非线性结构,由顶点和边组成。图的存储方式主要有两种:

  1. 邻接矩阵:用二维数组表示图中的顶点和边,数组元素的值表示两个顶点之间是否存在边。
  2. 邻接表:用链表来表示图中的顶点和边,每个顶点对应一个链表,链表中的结点存储与该顶点相连的边信息。

图的遍历算法有两种:

  1. 深度优先搜索 (DFS):从一个顶点开始,沿着一条路径一直走到不能再走为止,然后回溯到上一个顶点,再沿着另一条路径继续搜索,直到所有顶点都被访问过。
  2. 广度优先搜索 (BFS):从一个顶点开始,先访问该顶点的所有邻居,然后再访问这些邻居的邻居,以此类推,直到所有顶点都被访问过。

实验内容

  1. 用邻接矩阵实现图的存储方式。
  2. 用邻接表实现图的存储方式。
  3. 实现深度优先搜索算法。
  4. 实现广度优先搜索算法。

实验步骤

1. 邻接矩阵实现图的存储方式

#define MAXSIZE 100

typedef struct graph {
    int vertex[MAXSIZE]; //顶点集合
    int edge[MAXSIZE][MAXSIZE]; //邻接矩阵
    int vertexNum, edgeNum; //顶点数和边数
} Graph;

void initGraph(Graph *g) {
    int i, j;
    for(i = 0; i < MAXSIZE; i++) {
        g->vertex[i] = i;
        for(j = 0; j < MAXSIZE; j++) {
            g->edge[i][j] = 0;
        }
    }
    g->vertexNum = 0;
    g->edgeNum = 0;
}

void addEdge(Graph *g, int u, int v) {
    g->edge[u][v] = 1;
    g->edge[v][u] = 1;
    g->edgeNum++;
}

2. 邻接表实现图的存储方式

#define MAXSIZE 100

typedef struct graph {
    int vertex; //顶点
    struct edge *head; //边链表头指针
} Graph;

typedef struct edge {
    int vertex; //边的终点
    struct edge *next; //下一条边的指针
} Edge;

void initGraph(Graph *g) {
    int i;
    for(i = 0; i < MAXSIZE; i++) {
        g[i].vertex = i;
        g[i].head = NULL;
    }
}

void addEdge(Graph *g, int u, int v) {
    Edge *e1, *e2;
    e1 = (Edge *)malloc(sizeof(Edge));
    e1->vertex = v;
    e1->next = g[u].head;
    g[u].head = e1;
    e2 = (Edge *)malloc(sizeof(Edge));
    e2->vertex = u;
    e2->next = g[v].head;
    g[v].head = e2;
}

3. 深度优先搜索算法

void DFS(Graph g, int v, int visited[]) {
    int i;
    visited[v] = 1;
    printf("%d ", v);
    for(i = 0; i < MAXSIZE; i++) {
        if(g.edge[v][i] == 1 && visited[i] == 0) {
            DFS(g, i, visited);
        }
    }
}

4. 广度优先搜索算法

void BFS(Graph g, int v, int visited[]) {
    int queue[MAXSIZE];
    int front = 0, rear = 0;
    int i, u;
    visited[v] = 1;
    printf("%d ", v);
    queue[rear++] = v;
    while(front != rear) {
        u = queue[front++];
        for(i = 0; i < MAXSIZE; i++) {
            if(g.edge[u][i] == 1 && visited[i] == 0) {
                visited[i] = 1;
                printf("%d ", i);
                queue[rear++] = i;
            }
        }
    }
}

实验结果

输入图的顶点数和边数,以及每条边的起点和终点,程序将输出邻接矩阵和邻接表,并分别进行深度优先搜索和广度优先搜索。

实验结论

通过本次实验,我掌握了数据结构图的基本概念和应用,了解了图的存储方式和遍历算法。邻接矩阵和邻接表分别适用于不同的场景,深度优先搜索和广度优先搜索也有各自的优缺点。在实际应用中,应根据具体情况进行选择。

数据结构图应用实验报告 - C语言实现邻接矩阵、邻接表及遍历算法

原文地址: https://www.cveoy.top/t/topic/n39N 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录