• 假设无向、非加权图的数据元素为字符,采用邻接表存储结构。图的创建、存储结构输出等大部分操作的实现代码操作已经给出,请分别补充写出操作插入边、删除边的实现函数代码。
    有关说明:
    (1)插入边, int Insert_Edge(g,vi,vj)
    输入:图g,要插入边的两个顶点元素vi,vj;
    输出:返回插入的状态(成功、错误:边顶点不存在、错误:边重复),根据不同的状态会输出:
    Error:Vertex does not exist! 或
    Error:Edge repetition! 或
    Edge insertion succeeded!
    注:为了统一,邻接点链入链表时,链入在前面(表头位置)
    (2)删除边, int Delete_Edge(g,vi,vj)
    输入:图g,要删除边的两个顶点元素vi,vj;
    输出:返回删除的状态(成功、错误:边顶点不存在、错误:边不存在),根据不同的状态会输出:
    Error:Vertex does not exist!
    Error:Edge does not exist!
    Edge deletion succeeded!
    (3)主函数中操作的控制: 1—创建图 2—输出图的存储结构 3—插入边 4—删除边 0—退出
    创建图时,需要输入顶点个数、各个顶点元素、各条边,具体见样例;
    输出存储结构时,输出格式见样例;
    插入或删除边时,需要输入边的两个顶点元素;
    例如:
    1 //创建图操作
    5 //图顶点的个数
    abcde //顶点元素
    ** //输入边,**表示边输入结束
    2 //输出图结构操作
    3 //插入边操作
    ab //边顶点
    3
    bc
    4 //删除边操作
    de
    2
    0
    输出如下:
    Adjacency List is:
    a:
    b:
    c:
    d:
    e:
    Edge insertion succeeded!
    Edge insertion succeeded!
    Error:Edge does not exist!
    Adjacency List is:

    a:-->b

    b:-->c-->a

    c:-->b

    d:

    e:

    给出的代码如下: (请注意要求补充的函数的注释说明)

    #define _CRT_SECURE_NO_WARNINGS
    
    #include <iostream>
    
    #include <stdio.h>
    
    #include <stdlib.h>
    
    using namespace std;
    
    #define   Max_VertexNum 50     //允许图的顶点个数的最大值
    
    typedef   char  VertexType;  //定义数据元素(顶点)类型为char
    
    //********************************************************************************
    
    //邻接表存储结构
    
    struct  EdgeNode   //定义边存储结点
    
    { int adjvex;        //邻接点的存储位置
    
    EdgeNode  *next;   //指向下邻接点
    
    };      
    
    struct VertexNode   //定义顶点存储结点
    
    { VertexType vertex;       //数据元素
    
    struct EdgeNode *link;   //第一个邻接点
    
    };          
    
    typedef struct Graph   //定义邻接表图结构
    
    { int VexNum;        //图的顶点个数
    
    VertexNode Nodetable[Max_VertexNum];   //一维数组-邻接表    
    
    }  Graphlnk;      //定义邻接表存储的图类型
    
    //**********************************************************************************
    
    // 基于邻接表存储的 无向、非加权图的各种操作的实现
    
    //** 创建图
    
    void create_graph(Graphlnk &g)
    
    { VertexType v1, v2;
    
    int i, j;
    
    struct  EdgeNode *p, *q;
    
    cin >> g.VexNum;  //读入图的顶点个数
    
    while (g.VexNum < 0)
    
    cin >> g.VexNum;
    
    for (i = 0; i < g.VexNum; i++)
    
    { cin >> g.Nodetable[i].vertex;    //输入顶点元素
    
    g.Nodetable[i].link = NULL;      //邻接表初始化
    
    }
    
    cin >> v1 >> v2;     //输入边的两个顶点
    
    while (v1 != '*'&&v2 != '*')
    
    {   for (i = 0; i < g.VexNum; i++)
    
    if (g.Nodetable[i].vertex == v1) break;
    
        for (j = 0; j < g.VexNum; j++)
    
    if (g.Nodetable[j].vertex == v2) break;
    
      if (i >= g.VexNum || j >= g.VexNum)  cin >> v1 >> v2;    //边顶点不正确,重新读
    
      else      //链入邻接点
    
      { p = (struct  EdgeNode *)malloc(sizeof(struct  EdgeNode));
    
    p->adjvex = j;
    
    p->next = g.Nodetable[i].link;
    
    g.Nodetable[i].link = p;
    
    q = (struct  EdgeNode *)malloc(sizeof(struct  EdgeNode));
    
    q->adjvex = i;
    
    q->next = g.Nodetable[j].link;
    
    g.Nodetable[j].link = q;
    
    cin >> v1 >> v2;
    
      }
    
    }
    
    }
    
    void print_graph(Graphlnk  g)
    
    { int i;
    
    struct  EdgeNode *p;
    
    cout << "Adjacency List is:" << endl;
    
    for (i = 0; i < g.VexNum; i++)
    
    { cout << g.Nodetable[i].vertex << ":";
    
    p = g.Nodetable[i].link;
    
    while (p != NULL)
    
    { cout << "-->" << g.Nodetable[p->adjvex].vertex;
    
    p = p->next;
    
    }
    
    cout << endl;
    
    }
    
    }
    
    //**********************************************************************
    
         补充 插入边、删除边的函数
    
    //**********************************************************************
    
    int main()
    
    { Graphlnk g;
    
    int ic;
    
    VertexType vi, vj;
    
    int k;
    
    while (1)
    
    {    //请输入要执行的操作:";
    
    cin >> ic;
    
    while (ic < 0 || ic>4)
    
    cin >> ic;
    
    if (ic == 1)  create_graph(g);    //创建图
    
    if (ic == 2)  print_graph(g);       //输出图结构
    
    if (ic == 3)     //插入边
    
    { cin >> vi >> vj; 
    
      k = Insert_Edge(g, vi, vj);
    
      if (k == -1) cout << "Error:Vertex does not exist!" << endl;
    
      if(k==0) cout << "Error:Edge repetition!" << endl;
    
      if(k==1) cout << "Edge insertion succeeded!" << endl;
    
    }
    
    if (ic == 4)     //删除边
    
    { cin >> vi >> vj; 
    
      k = Delete_Edge(g, vi, vj);
    
      if (k == -1) cout << "Error:Vertex does not exist!." << endl;
    
      if (k == 0) cout << "Error:Edge does not exist!" << endl;
    
      if (k == 1) cout << "Edge deletion succeeded!" << endl;
    
    }
    
    if (ic == 0)  break;
    
    }
    
    return 0;
    
    }
    
    #define _CRT_SECURE_NO_WARNINGS
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    using namespace std;
    #define   Max_VertexNum 50     //允许图的顶点个数的最大值
    typedef   char  VertexType;  //定义数据元素(顶点)类型为char
    //********************************************************************************
    //邻接表存储结构
    
    struct  EdgeNode   //定义边存储结点
    {
        int adjvex;        //邻接点的存储位置
    
        EdgeNode *next;   //指向下邻接点
    
    };
    
    struct VertexNode   //定义顶点存储结点
    
    {
        VertexType vertex;       //数据元素
        struct EdgeNode *link;   //第一个邻接点
    
    };
    
    typedef struct Graph   //定义邻接表图结构
    
    {
        int VexNum;        //图的顶点个数
    
        VertexNode Nodetable[Max_VertexNum];   //一维数组-邻接表
    
    }  Graphlnk;      //定义邻接表存储的图类型
    
    //**********************************************************************************
    
    // 基于邻接表存储的 无向、非加权图的各种操作的实现
    
    //** 创建图
    
    void create_graph(Graphlnk &g) {
        VertexType v1, v2;
    
        int i, j;
    
        struct EdgeNode *p, *q;
    
        cin >> g.VexNum;  //读入图的顶点个数
    
        while (g.VexNum < 0)
    
            cin >> g.VexNum;
    
        for (i = 0; i < g.VexNum; i++) {
            cin >> g.Nodetable[i].vertex;    //输入顶点元素
    
            g.Nodetable[i].link = NULL;      //邻接表初始化
    
        }
    
        cin >> v1 >> v2;     //输入边的两个顶点
    
        while (v1 != '*' && v2 != '*') {
            for (i = 0; i < g.VexNum; i++)
    
                if (g.Nodetable[i].vertex == v1) break;
    
            for (j = 0; j < g.VexNum; j++)
    
                if (g.Nodetable[j].vertex == v2) break;
    
            if (i >= g.VexNum || j >= g.VexNum) cin >> v1 >> v2;    //边顶点不正确,重新读
    
            else      //链入邻接点
    
            {
                p = (struct EdgeNode *) malloc(sizeof(struct EdgeNode));
    
                p->adjvex = j;
    
                p->next = g.Nodetable[i].link;
    
                g.Nodetable[i].link = p;
    
                q = (struct EdgeNode *) malloc(sizeof(struct EdgeNode));
    
                q->adjvex = i;
    
                q->next = g.Nodetable[j].link;
    
                g.Nodetable[j].link = q;
    
                cin >> v1 >> v2;
    
            }
    
        }
    
    }
    
    void print_graph(Graphlnk  g)
    
    { int i;
    
        struct  EdgeNode *p;
    
        cout << "Adjacency List is:" << endl;
    
        for (i = 0; i < g.VexNum; i++)
    
        { cout << g.Nodetable[i].vertex << ":";
    
            p = g.Nodetable[i].link;
    
            while (p != NULL)
    
            { cout << "-->" << g.Nodetable[p->adjvex].vertex;
                p = p->next;
            }
    
            cout << endl;
    
        }
    
    }
    int getNum(Graphlnk g, VertexType vi) {
        for (int i = 0; i < g.VexNum; i++)
            if (g.Nodetable[i].vertex == vi) return i;
        return -1;
    }
    
    int Insert_Edge(Graphlnk &g, VertexType vi, VertexType vj) {
        int v1 = getNum(g,vi);
        int v2 = getNum(g,vj);
        if(v1<0 || v2 < 0) return -1;
        EdgeNode *p = g.Nodetable[v1].link;
        while(p) {
            if (p->adjvex == v2) return 0;
            p = p->next;
        }
        p = new EdgeNode;
        p->adjvex = v2;
        p->next = g.Nodetable[v1].link;
        g.Nodetable[v1].link = p;
        if(v1 == v2) return 1;
        p = new EdgeNode;
        p->adjvex = v1;
        p->next = g.Nodetable[v2].link;
        g.Nodetable[v2].link = p;
        return 1;
    }
    
    int  Delete_Edge(Graphlnk &g, VertexType vi, VertexType vj) {
        int v1 = getNum(g,vi);
        int v2 = getNum(g,vj);
        if(v1<0 || v2 < 0) return -1;
        EdgeNode *p = g.Nodetable[v1].link;
        if(p && p->adjvex == v2) {
            g.Nodetable[v1].link = p->next;
            if(v1 == v2) return 1;
        }
        while(p) {
            EdgeNode *pnext = p->next;
            if(pnext && pnext->adjvex == v2 ) {
                p->next = pnext->next;
                delete pnext;
                if(v1 == v2) return 1;
                break;
            }
            p = p->next;
    
        }
        p = g.Nodetable[v2].link;
        if(p && p->adjvex == v1) {
            g.Nodetable[v2].link = p->next;
            return 1;
        }
        while(p) {
            EdgeNode *pnext = p->next;
            if(pnext && pnext->adjvex == v1 ) {
                p->next = pnext->next;
                delete pnext;
                return 1;
            }
            p = p->next;
        }
        return 0;
    }
    int main() {
        Graphlnk g;
    
        int ic;
    
        VertexType vi, vj;
    
        int k;
    
        while (1) {    //请输入要执行的操作:";
    
            cin >> ic;
    
            while (ic < 0 || ic > 4)
    
                cin >> ic;
    
            if (ic == 1) create_graph(g);    //创建图
    
            if (ic == 2) print_graph(g);       //输出图结构
    
            if (ic == 3)     //插入边
    
            {
                cin >> vi >> vj;
    
                k = Insert_Edge(g, vi, vj);
    
                if (k == -1) cout << "Error:Vertex does not exist!" << endl;
    
                if (k == 0) cout << "Error:Edge repetition!" << endl;
    
                if (k == 1) cout << "Edge insertion succeeded!" << endl;
    
            }
    
            if (ic == 4)     //删除边
    
            {
                cin >> vi >> vj;
    
                k = Delete_Edge(g, vi, vj);
    
                if (k == -1) cout << "Error:Vertex does not exist!." << endl;
    
                if (k == 0) cout << "Error:Edge does not exist!" << endl;
    
                if (k == 1) cout << "Edge deletion succeeded!" << endl;
    
            }
    
            if (ic == 0) break;
    
        }
    
        return 0;
    
    }
    
  • 相关阅读:
    [学习笔记] SSD代码笔记 + EifficientNet backbone 练习
    [论文理解] CornerNet: Detecting Objects as Paired Keypoints
    [torch] torch.contiguous
    [tensorflow] tf2.0 简单例子
    [大坑]Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR
    本机Jenkins的使用
    安全工具acunetix使用
    cv2.matchTemplate()函数的应用,匹配图片后画出矩形
    python将PNG格式的图片转化成为jpg
    Python实现FTP文件的上传和下载
  • 原文地址:https://www.cnblogs.com/Accpted/p/13086096.html
Copyright © 2020-2023  润新知