• 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. }

  • 相关阅读:
    Sentinel1.8.6自定义错误页
    Qt多线程的多种方法之一 QThread
    技术突破,解决natapp免费域名动态变化问题
    国庆作业 10月1 用select实现服务器并发
    毅速科普课堂丨3D打印随形水路模具制造的一般流程
    SpringCloud 服务限流与熔断
    华为OD机考题(HJ41 称砝码)
    MySQL 的 C 语言接口
    python爬虫(1)
    [附源码]Java计算机毕业设计SSM儿童成长记录与分享系统
  • 原文地址:https://blog.csdn.net/qq_45303986/article/details/127409043