严蔚敏版本的 图 邻接表 的 13个基本操作 真代码的完整C语言实现

本文详细介绍了使用C语言实现严蔚敏数据结构中图的邻接表结构的13个基本操作,包括创建、插入、删除等,旨在帮助读者深入理解图的存储与操作。
摘要由CSDN通过智能技术生成
#include "adjmap.h"
/*
 * 数据结构
 * 图 邻接表
 * 严蔚敏书上的全部13个关于图的基本操作
 * 由于严蔚敏的书上的操作要考虑有向图 有向网 无向图 无向网 非常的繁琐
 * 而且大部分不管无向有向 很多操作几乎大同小异 没有必要去重复实现
 * 因此为了程序的便捷只写一个有向网
 * 网上的代码自己太菜又看不懂 于是自己实现一个图
 * 和严蔚敏稍微有些区别的地方在于
 * 在ADT中 除了定义了firstarc外 还定义了tailarc用于方便链表的插入 size则记录了链表的长度
 *
 * 代码可以在QQ群322085520 向群主索要
 * 程序运行环境 编译通过 并运行成功
 * 编译器:MinGW gcc version 8.3
 * 操作系统:windows 10
 * IDE:CLion 2019.1
 * Cmake: 3.13
 *
 * 请勿在vc vs平台上运行本程序 不支持
 *
 * QQ 582521582
 * QQ群 322085520
 * 作者水平有限 BUG再所难免 欢迎阅读者指正 如有疑问和指正 请联系QQ或进QQ群讨论
 *
 * 程序测试用例如下
 * 请输入4个有向图中顶点的信息!
 * a b c d
 * 请输入5个有向图中弧的信息(各不超过8各字符) 弧尾 弧头 权值
 * a b 1
 * a d 1
 * b c 1
 * c a 1
 * c d 1
 * 顶点信息
 * [a] -> {1b -> 3d -> NULL}
 * 顶点信息
 * [b] -> {2c -> NULL}
 * 顶点信息
 * [c] -> {0a -> 3d -> NULL}
 * 顶点信息
 * [d] -> {NULL}
 * 索引为2的顶点 c
 * 将a顶点修改aa后查看结果 aa
 * 顶点c的第一个邻接点的位置和信息是 0 aa
 * -1
 * 顶点信息
 * [aa] -> {1b -> 2d -> NULL}
 * 顶点信息
 * [b] -> {NULL}
 * 顶点信息
 * [d] -> {NULL}
 * 删除顶点后的弧还剩 2个
 * 新的插入顶点e是否成功1
 * 请输入v w弧之间的权值weight
 * 1
 * 添加aa->e的一条弧是否成功:1
 * 顶点信息
 * [aa] -> {1b -> 2d -> 3e -> NULL}
 * 顶点信息
 * [b] -> {NULL}
 * 顶点信息
 * [d] -> {NULL}
 * 顶点信息
 * [e] -> {NULL}
 * 删除aa->d之间的弧是否成功:1
 * 顶点信息
 * [aa] -> {1b -> 3e -> NULL}
 * 顶点信息
 * [b] -> {NULL}
 * 顶点信息
 * [d] -> {NULL}
 * 顶点信息
 * [e] -> {NULL}
 * 请输入8个有向图中顶点的信息!
 * v1 v2 v3 v4 v5 v6 v7 v8
 * 请输入9个有向图中弧的信息(各不超过8各字符) 弧尾 弧头 权值
 * v1 v2 1
 * v1 v3 1
 * v2 v4 1
 * v2 v5 1
 * v4 v8 1
 * v5 v8 1
 * v3 v6 1
 * v3 v7 1
 * v6 v7 1
 * 顶点信息
 * [v1] -> {1v2 -> 2v3 -> NULL}
 * 顶点信息
 * [v2] -> {3v4 -> 4v5 -> NULL}
 * 顶点信息
 * [v3] -> {5v6 -> 6v7 -> NULL}
 * 顶点信息
 * [v4] -> {7v8 -> NULL}
 * 顶点信息
 * [v5] -> {7v8 -> NULL}
 * 顶点信息
 * [v6] -> {6v7 -> NULL}
 * 顶点信息
 * [v7] -> {NULL}
 * 顶点信息
 * [v8] -> {NULL}
 * DFS深度优先遍历图
 * v1 v2 v4 v8 v5 v3 v6 v7
 * BFS广度优先遍历图
 * v1 v2 v3 v4 v5 v6 v7 v8
 *
 * */
int main(void) {
    ALGraph *g = (ALGraph *) malloc(sizeof(ALGraph));
    createGraph(g, 4, 5);
    display(g);
    printf("索引为2的顶点 %s\n",getVex(g, 2));
    putVex(g, "a", "aa");
    printf("将a顶点修改aa后查看结果 %s\n", getVex(g, locateVex(g,"aa")));
    printf("顶点c的第一个邻接点的位置和信息是 %d %s\n", fristAdjVex(g, "c"), getVex(g, fristAdjVex(g, "c")));
    printf("b顶点中c的下一个节点信息序号是:%d\n", nextAdjVex(g, "b", "c"));
    deleteVex(g,"c");
    display(g);
    printf("删除顶点后的弧还剩 %d个\n", g->arc);
    printf("新的插入顶点e是否成功%d\n",insertVex(g, "e"));
    printf("添加aa->e的一条弧是否成功:%d\n",insertArc(g, "aa", "e"));
    display(g);
    printf("删除aa->d之间的弧是否成功:%d\n", deleteArc(g, "aa", "d"));
    display(g);
    ALGraph *graph = (ALGraph *) malloc(sizeof(ALGraph));
    createGraph(graph, 8, 9);
    display(graph);
    DFSTreverse(graph);
    BFSTreverse(graph);
    free(g);
    free(graph);
    return 0;
}
//
// Created by QQ 582521582 on 2019/5/17.
//

#ifndef ADJMAP_ADJMAP_H
#define ADJMAP_ADJMAP_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <assert.h>
#define  MAX_VEX_NUM 32 //顶点信息 最大32个
#define throwException(e) fputs(e,stderr)
typedef struct ArcNode{
    int index;//表示顶点在数组下标的位置
    int weight;//权值 如果是图默认为1
    struct ArcNode* nextarc;
}ArcNode;
typedef struct {
    char vexinfo[8];//存放顶点信息
    ArcNode* firstarc;//关联弧
    ArcNode* tailarc;//因为每次都是在后面插入 所以我们维护一个尾指针 方便插入
  
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值