博客
关于我
数据结构 实验四(图中两点间所有路径)
阅读量:338 次
发布时间:2019-03-04

本文共 4690 字,大约阅读时间需要 15 分钟。

邻接表是一种高效的数据存储方式,常用于表示图的结构。以下是使用邻接表存储点和边的代码示例,以及如何输出两点间所有路径的实现:

邻接表的实现代码

#include 
#include
using namespace std;#define VEX_MAXNUM 20#define STACK_H_INCLUDED#define STACK_INIT_SIZE 100 // 存储空间初始分配量#define STACKINCREMENT 10 // 存储空间分配增量typedef struct SqStack { int* base; int* top; int stacksize;} SqStack;void CreateStack(SqStack* S) { S->base = (int*)malloc(STACK_INIT_SIZE * sizeof(int)); if (!S->base) { cout << "存储空间分配失败!" << endl; exit(-1); } S->top = S->base; S->stacksize = STACK_INIT_SIZE;}void DestroySqStack(SqStack* S) { free(S->base); S->base = S->top = NULL; S->stacksize = 0;}void DisplaySqStack(SqStack* S) { int* p; if (S->top == S->base) { cout << "栈空!" << endl; exit(-1); } p = S->base; while (p < S->top - 1) cout << *p++ << "->"; cout << *p++;}void Push(SqStack* S, int data) { if (S->top - S->base == S->stacksize) { int* newbase = (int*)realloc(S->base, (S->stacksize + STACKINCREMENT) * sizeof(int)); if (!newbase) { cout << "存储空间分配失败!" << endl; exit(-1); } S->base = newbase; S->top = S->base + S->stacksize; S->stacksize += STACKINCREMENT; } *S->top++ = data;}void Pop(SqStack* S) { if (S->top == S->base) { cout << "栈空!" << endl; exit(-1); } S->top--;}int GetTop(SqStack* S) { if (S->top == S->base) { cout << "栈空!" << endl; exit(-1); } return *(S->top - 1);}int StackLength(SqStack* S) { return S->top - S->base;}int visited[VEX_MAXNUM];typedef struct EdgeNode { int vex_index; struct EdgeNode* next;} EdgeNode;typedef struct VexNode { int data; EdgeNode* edge;} VexNode, AdjList[VEX_MAXNUM];typedef struct Graph { AdjList list; int vexnum, edgenum;} Graph;int LocateIndex(Graph* G, int v) { int i = 0, j = G->vexnum - 1, mid; while (i <= j) { mid = (i + j) / 2; if (G->list[mid].data == v) break; else if (v > G->list[mid].data) i = mid + 1; else j = mid - 1; } if (i > j) { cout << "顶点不存在!" << endl; exit(-1); } return mid;}void CreateGraph(Graph* G) { cout << "请输入图的顶点数和边数:" << endl; cin >> G->vexnum >> G->edgenum; cout << "请输入顶点:" << endl; for (int i = 0; i < G->vexnum; i++) { cin >> G->list[i].data; G->list[i].edge = NULL; } cout << "请输入边:" << endl; for (int k = 0; k < G->edgenum; k++) { int v1, v2, i, j; EdgeNode* p, * q; cin >> v1 >> v2; i = LocateIndex(G, v1); j = LocateIndex(G, v2); p = (EdgeNode*)malloc(sizeof(EdgeNode)); p->vex_index = j; p->next = NULL; q = G->list[i].edge; if (!q) G->list[i].edge = p; else { while (q->next) q = q->next; q->next = p; } p = (EdgeNode*)malloc(sizeof(EdgeNode)); p->vex_index = i; p->next = NULL; q = G->list[j].edge; if (!q) G->list[j].edge = p; else { while (q->next) q = q->next; q->next = p; } }}void DestroyGraph(Graph* G) { VexNode* p; EdgeNode* q; for (int i = 0; i < G->vexnum; i++) { p = &G->list[i]; while (p->edge) { q = p->edge; p->edge = q->next; free(q); } }}void DFSALLPath(Graph* G, int index1, int index2, SqStack* S) { EdgeNode* p; visited[index1] = 1; Push(S, index1); if (index1 == index2) { DisplaySqStack(S); cout << endl; Pop(S); visited[index1] = 0; return; } p = G->list[index1].edge; while (p) { if (!visited[p->vex_index]) DFSALLPath(G, p->vex_index, index2, S); p = p->next; } Pop(S); visited[index1] = 0;}void PrintAllPath(Graph* G, int index1, int index2) { SqStack S; CreateStack(&S); for (int i = 0; i < G->vexnum; i++) visited[i] = 0; DFSALLPath(G, index1, index2, &S);}int main() { Graph G; int start, end; CreateGraph(&G); cout << "请输入起点:" << endl; cin >> start; cout << "请输入终点:" << endl; cin >> end; cout << "两顶点间的所有路径:" << endl; PrintAllPath(&G, LocateIndex(&G, start), LocateIndex(&G, end)); DestroyGraph(&G); return 0;}

代码解释

  • 邻接表的实现

    • 邻接表通过一个数组存储每个顶点的相邻顶点信息。每个顶点对应一个数据结构,包含一个边指针和一个顶点索引。
  • 图的创建

    • 使用CreateGraph函数输入顶点和边,顶点通过数组存储,边通过邻接表连接顶点。
  • 深度优先搜索(DFS)

    • DFSALLPath函数从起点开始,逐层遍历所有可能的路径,记录访问过的顶点,避免重复路径。
  • 路径输出

    • PrintAllPath函数使用一个栈保存路径信息,逐层展示所有从起点到终点的路径。
  • 代码执行流程

    • 首先创建图的数据结构,输入顶点和边信息。
    • 读取起点和终点,调用PrintAllPath函数输出所有路径。
    • 最后销毁图的数据结构,释放内存。
  • 通过上述代码,可以实现对任意图的邻接表存储,并输出两点间的所有路径。

    转载地址:http://wieq.baihongyu.com/

    你可能感兴趣的文章
    MQTT 持久会话与 Clean Session 详解
    查看>>
    MQTT工作笔记0007---剩余长度
    查看>>
    MQTT工作笔记0009---订阅主题和订阅确认
    查看>>
    Mqtt搭建代理服务器进行通信-浅析
    查看>>
    MS Edge浏览器“STATUS_INVALID_IMAGE_HASH“兼容性问题
    查看>>
    ms sql server 2008 sp2更新异常
    查看>>
    MS UC 2013-0-Prepare Tool
    查看>>
    MSBuild 教程(2)
    查看>>
    msbuild发布web应用程序
    查看>>
    MSB与LSB
    查看>>
    MSCRM调用外部JS文件
    查看>>
    MSCRM调用外部JS文件
    查看>>
    MSEdgeDriver (Chromium) 不适用于版本 >= 79.0.313 (Canary)
    查看>>
    MsEdgeTTS开源项目使用教程
    查看>>
    msf
    查看>>
    MSSQL数据库查询优化(一)
    查看>>
    MSSQL数据库迁移到Oracle(二)
    查看>>
    MSSQL日期格式转换函数(使用CONVERT)
    查看>>
    MSTP多生成树协议(第二课)
    查看>>
    MSTP是什么?有哪些专有名词?
    查看>>