• 图数据结构之邻接链表Adjacency List(Python版)


    前面学过两种图的数据结构,有兴趣的可以查阅:图数据结构之字典实现(Python版)icon-default.png?t=M85Bhttps://blog.csdn.net/weixin_41896770/article/details/128125901

    图数据结构之邻接矩阵Adjacency Matrix(Python版)icon-default.png?t=M85Bhttps://blog.csdn.net/weixin_41896770/article/details/128128667

    实际上我们常用的邻接矩阵就是一种未离散化每个点的边集的邻接表,如果对于很多其他顶点没有相邻顶点的情况,将会浪费大量的存储空间,也就是说很多0的位置,这些都说明没有相邻边,那接下来这个邻接链表就是一种离散化的表示,有相邻节点才存储,这样就避免了空间的浪费,而且看起来特别直观。

    代码如下:

    1. class Node():
    2. '''
    3. 实例化节点数据与链接指向
    4. '''
    5. def __init__(self, data):
    6. self.data = data
    7. self.next = None
    8. class AdjacencyListGraph():
    9. def __init__(self) -> None:
    10. self.graph = []
    11. def addNode(self, node):
    12. '''
    13. 节点添加到图中
    14. '''
    15. self.graph.append(node)
    16. return self.graph
    17. def AdjacencyList(self):
    18. '''
    19. 添加节点到邻接链表
    20. '''
    21. nodeList = []
    22. for node in self.graph:
    23. nodeList.append(node.data)
    24. nodeList.append('#')
    25. for node in self.graph:
    26. curNode0 = node
    27. print("请输入%s的相邻点,以#结束:" % curNode0.data)
    28. while True:
    29. curNode = Node('none')
    30. end = input(">>>").strip()
    31. if curNode0.data == end:
    32. print("相邻节点不能是自身")
    33. continue
    34. if end not in nodeList:
    35. print("图中没有此节点")
    36. continue
    37. if end == '#':
    38. break
    39. else:
    40. curNode.data = end # 新的邻接点
    41. # 链接指向
    42. curNode.next = curNode0.next
    43. curNode0.next = curNode
    44. curNode0 = curNode0.next
    45. def printGraph(self):
    46. for node in self.graph:
    47. print("%s的邻接链表:" % node.data, node.data, end="")
    48. while node.next != None:
    49. print("-->", node.next.data, end="")
    50. node = node.next
    51. print("\n")
    52. if __name__ == "__main__":
    53. n = int(input("请输入节点个数:").strip())
    54. adjacencyListGraph = AdjacencyListGraph()
    55. for i in range(0, n):
    56. data = input("请输入节点:").strip()
    57. data = Node(data)
    58. adjacencyListGraph.addNode(data)
    59. print("所有节点如下:")
    60. for n in adjacencyListGraph.graph:
    61. print(n.data, end=" ")
    62. print("\n")
    63. adjacencyListGraph.AdjacencyList()
    64. adjacencyListGraph.printGraph()
    1. '''
    2. 请输入节点个数:4
    3. 请输入节点:A
    4. 请输入节点:B
    5. 请输入节点:C
    6. 请输入节点:D
    7. 所有节点如下:
    8. A B C D
    9. 请输入A的相邻点,以#结束:
    10. >>>B
    11. >>>C
    12. >>>D
    13. >>>#
    14. 请输入B的相邻点,以#结束:
    15. >>>A
    16. >>>C
    17. >>>D
    18. >>>#
    19. 请输入C的相邻点,以#结束:
    20. >>>D
    21. >>>#
    22. 请输入D的相邻点,以#结束:
    23. >>>A
    24. >>>#
    25. A的邻接链表: A--> B--> C--> D
    26. B的邻接链表: B--> A--> C--> D
    27. C的邻接链表: C--> D
    28. D的邻接链表: D--> A
    29. '''

    这种图的数据结构看起来就很直观了,A的相邻节点B,然后B的相邻节点C,这样形成一条链,所以这样的数据结构叫做邻接链表。

    数据结构是一种现实的抽象,也就是说对于现实中的问题,我们要拿到计算机里面来存储,那需要一种抽象,比如列表、字典、矩阵、结构体等等,根据具体情况来组合成自己想要的数据结构。

  • 相关阅读:
    带您聚焦第十四届中国航展新看点
    汽车ECU软件升级方案介绍
    Java实现图片保存到pdf的某个位置2
    地图资源下载工具2.0
    【Spring Boot自动装配】
    jsonXML格式化核心代码
    143. 重排链表
    [SpringMVC笔记] SpringMVC-12-放行静态资源访问
    竞赛 深度学习OCR中文识别 - opencv python
    乔哥的系统
  • 原文地址:https://blog.csdn.net/weixin_41896770/article/details/128130006