llll35 2023-03-13 21:19 采纳率: 75%
浏览 18
已结题

双向非循环链表的长度

有没有同志帮忙看看这段代码的错误啊,一直停不下来只能stop的那种
双向非循环链表的长度(数据结构)
from DuNode import DuNode
class Do_nonCycLinkList:
    def __init__(self):
        self._head = DuNode(None)
        self._head.next = self._head
        self._head.prior = self._head

    def empty(self):
        return self._head.next is None

    def __len__(self):
        p = self._head
        count = 0
        while p !=None:
            count += 1
            p = p.next
        return count

    def clear(self):
        p = self._head.next
        self._head.next = None
        while p:
            q = p
            p = p.next
            del q

    def insert(self, i, item):
        if i < 0:
            raise IndexError('I is too small')
        previous = self._head
        count =  -1
        while previous and count < i - 1:
            previous = previous.next
            count += 1
        following = previous.next
        if previous is None:
            raise IndexError('i is too big')

        new_node = DuNode(item, previous, following)
        previous.next = new_node
        following.prior = new_node


    def remove(self, i):
        if i < 0:
            raise IndexError("I is too small,no element is in position i")
        previous = self._head
        t = -1
        while previous and t < i - 1:
            previous = previous.next
            t += 1
        if previous is None:
            raise IndexError("I is too big ,no element is in position i")
        current = previous.next
        if current is None:
            raise IndexError("I is too big ,no element is in position i")
        previous.next = current.next
        item = current.enty
        del current
        return item

    def retrieve(self, i):
        if i < 0:
            raise IndexError("I is too small,no element is in position i")
        p = self._head.next
        j = 0
        while p and j < i:
            p = p.next
            j += 1
        if p is None:
            raise IndexError("I is too big ,no element is in position i")
        else:
            return p.enty

    def contains(self, item):
        # """判断表中是否包含元素item"""
        current = self._head.next
        for i in range(self.__len__()):
            if current.entry[i] == item:
                return True
        return False

    def traverse(self):
        # """输出表中所有元素"""
        p = self._head.next
        l = []
        t = 0
        while p:
            t += 1
            l.append(p.entry)
            p = p.next
        # for c in l:
        return l

    def __str__(self):
        current = self._head.next
        element = ''
        t = 0
        while current:
            t += 1
            element += str(current.entry)
            current = current.next
        return element

if __name__ == '__main__':
    l =Do_nonCycLinkList()
    l.insert(0,1)
    l.insert(1,2)
    l.insert(2, 3)
   print(l)
    print(l.contains(4))


```

  • 写回答

3条回答 默认 最新

  • 码农学长 2023-03-13 21:44
    关注

    在代码的最后,print(l.contains(4))缩进错误,导致程序无法执行并卡在该行。应该将该行缩进调整到与上一行一致。

    此外,在remove方法中,item的属性应为entry而不是enty。

    以下是修改后的代码:

    
    from DuNode import DuNode
    
    class Do_nonCycLinkList:
        def __init__(self):
            self._head = DuNode(None)
            self._head.next = self._head
            self._head.prior = self._head
            
        def empty(self):
            return self._head.next is None
        
        def __len__(self):
            p = self._head.next
            count = 0
            while p != self._head:
                count += 1
                p = p.next
            return count
        
        def clear(self):
            p = self._head.next
            self._head.next = self._head
            while p != self._head:
                q = p
                p = p.next
                del q
                
        def insert(self, i, item):
            if i < 0:
                raise IndexError('I is too small')
            previous = self._head
            count = 0
            while previous.next != self._head and count < i:
                previous = previous.next
                count += 1
            if count < i:
                raise IndexError('i is too big')
            following = previous.next
            new_node = DuNode(item, previous, following)
            previous.next = new_node
            following.prior = new_node
            
        def remove(self, i):
            if i < 0:
                raise IndexError("I is too small,no element is in position i")
            previous = self._head
            t = 0
            while previous.next != self._head and t < i:
                previous = previous.next
                t += 1
            if t < i or previous.next == self._head:
                raise IndexError("I is too big ,no element is in position i")
            current = previous.next
            previous.next = current.next
            current.next.prior = previous
            item = current.entry
            del current
            return item
            
        def retrieve(self, i):
            if i < 0:
                raise IndexError("I is too small,no element is in position i")
            p = self._head.next
            j = 0
            while p != self._head and j < i:
                p = p.next
                j += 1
            if p == self._head:
                raise IndexError("I is too big ,no element is in position i")
            else:
                return p.entry
            
        def contains(self, item):
            current = self._head.next
            while current != self._head:
                if current.entry == item:
                    return True
                current = current.next
            return False
        
        def traverse(self):
            p = self._head.next
            l = []
            while p != self._head:
                l.append(p.entry)
                p = p.next
            return l
        
        def __str__(self):
            current = self._head.next
            element = ''
            while current != self._head:
                element += str(current.entry)
                current = current.next
            return element
    
    if __name__ == '__main__':
        l = Do_nonCycLinkList()
        l.insert(0, 1)
        l.insert(1, 2)
        l.insert(2, 3)
        print(l)
        print(l.contains(4))
    
    

    望采纳,谢谢

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月21日
  • 已采纳回答 3月13日
  • 创建了问题 3月13日

悬赏问题

  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探