前面学过两种图的数据结构,有兴趣的可以查阅:图数据结构之字典实现(Python版)
https://blog.csdn.net/weixin_41896770/article/details/128125901
图数据结构之邻接矩阵Adjacency Matrix(Python版)
https://blog.csdn.net/weixin_41896770/article/details/128128667
实际上我们常用的邻接矩阵就是一种未离散化每个点的边集的邻接表,如果对于很多其他顶点没有相邻顶点的情况,将会浪费大量的存储空间,也就是说很多0的位置,这些都说明没有相邻边,那接下来这个邻接链表就是一种离散化的表示,有相邻节点才存储,这样就避免了空间的浪费,而且看起来特别直观。
代码如下:
- class Node():
- '''
- 实例化节点数据与链接指向
- '''
-
- def __init__(self, data):
- self.data = data
- self.next = None
-
-
- class AdjacencyListGraph():
- def __init__(self) -> None:
- self.graph = []
-
- def addNode(self, node):
- '''
- 节点添加到图中
- '''
- self.graph.append(node)
- return self.graph
-
- def AdjacencyList(self):
- '''
- 添加节点到邻接链表
- '''
- nodeList = []
- for node in self.graph:
- nodeList.append(node.data)
- nodeList.append('#')
-
- for node in self.graph:
- curNode0 = node
- print("请输入%s的相邻点,以#结束:" % curNode0.data)
- while True:
- curNode = Node('none')
- end = input(">>>").strip()
- if curNode0.data == end:
- print("相邻节点不能是自身")
- continue
- if end not in nodeList:
- print("图中没有此节点")
- continue
- if end == '#':
- break
- else:
- curNode.data = end # 新的邻接点
- # 链接指向
- curNode.next = curNode0.next
- curNode0.next = curNode
- curNode0 = curNode0.next
-
- def printGraph(self):
- for node in self.graph:
- print("%s的邻接链表:" % node.data, node.data, end="")
- while node.next != None:
- print("-->", node.next.data, end="")
- node = node.next
- print("\n")
-
-
- if __name__ == "__main__":
- n = int(input("请输入节点个数:").strip())
- adjacencyListGraph = AdjacencyListGraph()
- for i in range(0, n):
- data = input("请输入节点:").strip()
- data = Node(data)
- adjacencyListGraph.addNode(data)
- print("所有节点如下:")
- for n in adjacencyListGraph.graph:
- print(n.data, end=" ")
- print("\n")
-
- adjacencyListGraph.AdjacencyList()
- adjacencyListGraph.printGraph()
- '''
- 请输入节点个数:4
- 请输入节点:A
- 请输入节点:B
- 请输入节点:C
- 请输入节点:D
- 所有节点如下:
- A B C D
- 请输入A的相邻点,以#结束:
- >>>B
- >>>C
- >>>D
- >>>#
- 请输入B的相邻点,以#结束:
- >>>A
- >>>C
- >>>D
- >>>#
- 请输入C的相邻点,以#结束:
- >>>D
- >>>#
- 请输入D的相邻点,以#结束:
- >>>A
- >>>#
- A的邻接链表: A--> B--> C--> D
- B的邻接链表: B--> A--> C--> D
- C的邻接链表: C--> D
- D的邻接链表: D--> A
- '''
这种图的数据结构看起来就很直观了,A的相邻节点B,然后B的相邻节点C,这样形成一条链,所以这样的数据结构叫做邻接链表。
数据结构是一种现实的抽象,也就是说对于现实中的问题,我们要拿到计算机里面来存储,那需要一种抽象,比如列表、字典、矩阵、结构体等等,根据具体情况来组合成自己想要的数据结构。