图数据结构之邻接链表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的位置,这些都说明没有相邻边,那接下来这个邻接链表就是一种离散化的表示,有相邻节点才存储,这样就避免了空间的浪费,而且看起来特别直观。

代码如下:

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,这样形成一条链,所以这样的数据结构叫做邻接链表。

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寅恪光潜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值