• c++数据结构:图(邻接表)


    邻接表是图的一种链式结构。

      邻接表的结构为:

    • 表节点
    • 头结点

     

    邻接表的表示方法:

    • 邻接表不唯一
    • 适合存储稀疏图,当有n个节点和e个边时,需要n个头结点,2e个边节点 
    • 时间复杂度为:O(n*e)
    • 空间复杂度为:   O(n+2e)

     

    • 顶点的出度为:链表节点的个数
    • 顶点的入度为:需要遍历整个单链表
    • 找出度易,找入度难
    • 想更容易的找到入度的话,可以构建逆邻接表:(指向反转)

    邻接矩阵和邻接表的区别:

    • 邻接矩阵是唯一的,邻接表不唯一
    • 邻接矩阵的空间复杂度:O(n^2)   邻接表为的空间复杂度:O(n+e)
    • 邻接矩阵多用于稠密图,邻接表多用于稀疏图

    图的邻接表结构:(图)

    1. #define Max_Num 50
    2. class table_node//表节点
    3. {
    4. public:
    5. int adjvex;//邻接点所在的位置
    6. table_node* nextarc;//下一个弧
    7. };
    8. class head_node//头结点
    9. {
    10. public:
    11. char data;//顶点数据
    12. table_node* firstarc;//首弧的位置
    13. };
    14. class ADList
    15. {
    16. public:
    17. head_node adlist[Max_Num];//邻接表
    18. int vexnum;//顶点个数
    19. int arcnum;//弧的数量
    20. int find_num(char a);//寻找顶点位置
    21. void add_DU();//无向图的生成
    22. };

    无向图的实现:

    1. int ADList::find_num(char a)寻找顶点位置
    2. {
    3. for (int i = 0; i < vexnum; i++)
    4. {
    5. if (adlist[i].data == a)//如果数组中查找到下标
    6. return i;//返回下标
    7. }
    8. return -1;//没有则返回-1
    9. }
    10. void ADList::add_DU()//无向图的生成
    11. {
    12. cin >> vexnum >> arcnum;//输入顶点个数,弧的数量
    13. for (int i = 0; i < vexnum; i++)
    14. {
    15. cin >> adlist[i].data;//输入顶点的数据
    16. adlist[i].firstarc->nextarc = nullptr;//首弧的指针初nextarc始化为nullptr
    17. }
    18. for (int i = 0; i < arcnum; i++)//添加弧
    19. {
    20. char n, m;
    21. cin >> n>>m;//输入顶点
    22. int x = find_num(n);//获取顶点数组位置
    23. int y = find_num(m);
    24. table_node* p = new table_node(x);//新的表节点
    25. table_node* p1 = new table_node(y);//新的表节点
    26. //利用尾插法插到链表中
    27. p1->nextarc = adlist[x].firstarc->nextarc;//将p1插到数组下标为x的单链表中
    28. adlist[x].firstarc->nextarc = p1;
    29. p->nextarc = adlist[y].firstarc->nextarc;//将p插到数组下标为y的单链表中
    30. adlist[y].firstarc->nextarc = p;
    31. }
    32. }

    无向网的实现:

    1. //邻接表(网)
    2. #define Max_Num 50
    3. class table_node//表节点
    4. {
    5. public:
    6. int adjvex;//邻接点所在的位置
    7. table_node* nextarc;//下一个弧
    8. int weight;//权值
    9. table_node(int i = 0,int w=0) :adjvex(i), weight(w),nextarc(nullptr) {}//构造函数
    10. };
    11. class head_node//头结点
    12. {
    13. public:
    14. char data;//顶点数据
    15. table_node* firstarc;//首弧的位置
    16. };
    17. class ADList
    18. {
    19. public:
    20. head_node adlist[Max_Num];//邻接表
    21. int vexnum;//顶点个数
    22. int arcnum;//弧的数量
    23. int find_num(char a);//寻找顶点位置
    24. void add_DU();//无向图的生成
    25. };
    26. int ADList::find_num(char a)寻找顶点位置
    27. {
    28. for (int i = 0; i < vexnum; i++)
    29. {
    30. if (adlist[i].data == a)//如果数组中查找到下标
    31. return i;//返回下标
    32. }
    33. return -1;//没有则返回-1
    34. }
    35. void ADList::add_DU()//无向图的生成
    36. {
    37. cin >> vexnum >> arcnum;//输入顶点个数,弧的数量
    38. for (int i = 0; i < vexnum; i++)
    39. {
    40. cin >> adlist[i].data;//输入顶点的数据
    41. adlist[i].firstarc->nextarc = nullptr;//首弧的指针初nextarc始化为nullptr
    42. }
    43. for (int i = 0; i < arcnum; i++)//添加弧
    44. {
    45. char n, m; int w;
    46. cin >> n>> m>>w;//输入两个顶点,和一个权值
    47. int x = find_num(n);//获取顶点数组位置
    48. int y = find_num(m);
    49. table_node* p = new table_node(x,w);//新的表节点
    50. table_node* p1 = new table_node(y,w);//新的表节点
    51. //利用尾插法插到链表中
    52. p1->nextarc = adlist[x].firstarc->nextarc;//将p1插到数组下表为x的单链表中
    53. adlist[x].firstarc->nextarc = p1;
    54. p->nextarc = adlist[y].firstarc->nextarc;//将p插到数组下表为y的单链表中
    55. adlist[y].firstarc->nextarc = p;
    56. }
    57. }

  • 相关阅读:
    [附源码]计算机毕业设计JAVA餐厅卫生安全系统
    6.1 Go语言中接口使用样例
    游戏服务器该如何选择
    RabbitMQ工作模式-工作队列
    Spring框架中部署log4j.xml
    Linux内核子系统 内核配置选项
    使用.Net6中的System.Text.Json遇到几个常见问题及解决方案
    基于51单片机的智能台灯设计
    Linux 多线程
    Tomcat运行流程、Servlet运行原理以及常用API
  • 原文地址:https://blog.csdn.net/qq_45303986/article/details/127409043