波大大12138 发表于 2020-7-13 10:58:07

代码出错帮忙看下

#先定义一个节点的类
class Node():
    #初始化
    def __init__(self,elem):
      self.elem=elem
      self.next=[]#节点对象一开始的数据区是有的但是next不知道该指向谁先设置为空
node=Node(100)

#定义单链表的类
class Singlelinklist():
    def __init__(self,node=None):#链表当中必须得存在一个属性指向第一个节点将链表与节点关联起来,属于类属性,因为在使用链表的时候不是拿类来操作的
      self.__head=node#自己内部的函数去使用,对外不暴露,所以将其私有化
    def is_empty(self):
       return self.__head==None
    def length(self):
      #cur游标用来移动遍历节点;将cur置于头一个头结点
      cur=self.__head=None
      #count用来记录数据
      count=0
      while cur!=None:
            count+=1
            cur=cur.next
      return count
    def travel(self):
      """遍历整个列表"""
      cur=self.__head
      while cur!=None:
            print(cur.elem)
            cur=cur.next
    def add(self,item):
      """链表头部添加元素"""
      pass
    def append(self,item):
      """链表尾部添加元素"""
      node=Node(item)
      if self.is_empty():
            self.__head=node
      else:
            cur=self.__head
            while cur.next!=None:
                cur=cur.next
            cur.next=node
    def insert(self,pos,item):
      """在指定的位置添加元素"""
      pass
    def remove(self,item):
      """删除节点"""
      pass
    def search(self,item):
      """查找节点是否存在"""
      pass
if __name__=='__main__':
    li=Singlelinklist()
    print(li.is_empty())
    print(li.length())
    li.append(1)
    print(li.is_empty())
    print(li.length())
    li.append(2)
    li.append(3)
    li.append(4)
    li.append(5)
    li.append(6)
    li.travel()



这个代码我要实现以上的功能但是出了点问题不知道错在哪里,麻烦帮忙指出来并修改一下

yhhpf 发表于 2020-7-13 11:06:05

      while cur!=None:
            count+=1
            cur=cur.next

这是要干嘛...cur的类型是列表呀!

sunrise085 发表于 2020-7-13 11:09:26

错误有两处:
第6行,节点初始化的时候,self.next应该为None,因为你后面在俩女表中插入介电的时候都是这么用的。
第17行,cur=self.__head=None   后面的这个=None是个什么鬼?删掉
#先定义一个节点的类
class Node():
    #初始化
    def __init__(self,elem):
      self.elem=elem
      self.next=None#节点对象一开始的数据区是有的但是next不知道该指向谁先设置为空
node=Node(100)

#定义单链表的类
class Singlelinklist():
    def __init__(self,node=None):#链表当中必须得存在一个属性指向第一个节点将链表与节点关联起来,属于类属性,因为在使用链表的时候不是拿类来操作的
      self.__head=node#自己内部的函数去使用,对外不暴露,所以将其私有化
    def is_empty(self):
       return self.__head==None
    def length(self):
      #cur游标用来移动遍历节点;将cur置于头一个头结点
      cur=self.__head
      #count用来记录数据
      count=0
      while cur!=None:
            count+=1
            cur=cur.next
      return count
    def travel(self):
      """遍历整个列表"""
      cur=self.__head
      while cur!=None:
            print(cur.elem)
            cur=cur.next
    def add(self,item):
      """链表头部添加元素"""
      pass
    def append(self,item):
      """链表尾部添加元素"""
      node=Node(item)
      if self.is_empty():
            self.__head=node
      else:
            cur=self.__head
            while cur.next!=None:
                cur=cur.next
            cur.next=node
    def insert(self,pos,item):
      """在指定的位置添加元素"""
      pass
    def remove(self,item):
      """删除节点"""
      pass
    def search(self,item):
      """查找节点是否存在"""
      pass
if __name__=='__main__':
    li=Singlelinklist()
    print(li.is_empty())
    print(li.length())
    li.append(1)
    print(li.is_empty())
    print(li.length())
    li.append(2)
    li.append(3)
    li.append(4)
    li.append(5)
    li.append(6)
    li.travel()

Stubborn 发表于 2020-7-13 11:11:42

本帖最后由 Stubborn 于 2020-7-13 11:16 编辑

问题比较多{:10_289:} ,参考下这个吧,比较小,找下自己的问题,还有疑问,再回复

class Node:
    def __init__(self, value):
      self.val = value
      self.next = None


class SingleStrand:

    def __init__(self):
      self._head = None
      self._length = 0

    @property
    def is_empty(self):
      return bool(self._head)

    @property
    def length(self):
      return self._length

    def __len__(self):
      return self._length

    def __contains__(self, val):
      cur = self._head
      while cur is not None:
            if cur.val == val:
                return True
            cur = cur.next
      return False

    def insert(self, val, idx):
      """指定位置插入"""
      if idx == 0:
            self.add(val)
      elif idx >= self.length:
            self.append(val)
      else:
            cur = self._head
            n = 1
            while cur.next:
                if n == idx: break
                cur = cur.next
                n += 1
            node = Node(val)
            node.next = cur.next
            cur.next = node
            self._length += 1

    def add(self, val):
      """头部添加"""
      node = Node(val)
      node.next = self._head
      self._head = node

      self._length += 1

    def append(self, val):
      """尾部添加"""
      cur = self._head
      if cur is None:
            self.add(val)
      else:
            node = Node(val)
            while cur.next:
                cur = cur.next
            cur.next = node

            self._length += 1

    def travel(self, cur=None):
      """单向链表的遍历
            递归演示
      """
      cur = self._head if cur is None else cur
      if cur.next is not None:
            return f"-->\t{cur.val}\t" + self.travel(cur.next)
      else:
            return f"-->{cur.val} --> <<travel over>>"

    def travel_(self):
      """单向链表的遍历
            非递归演示
      """
      cur = self._head
      string = f"<<travel start>>\t{cur.val}\t"
      while cur.next:
            cur = cur.next
            string += f"-->\t{cur.val}\t"
      return string + "<<travel over>>"

    def delete(self, val):
      if not self.is_empty:
            raise IndexError("Strand is empty")
      cur = self._head
      if cur.val == val:
            self._head = cur.next
      while cur.next:
            pre = cur
            cur = cur.next
            if cur.val == val:
                pre.next = cur.next


if __name__ == '__main__':
    t = SingleStrand()
    t.add(1)
    t.add(2)
    t.append(3)
    print(t.travel_())

lhgzbxhz 发表于 2020-7-13 11:11:58

1、不要用cur == None,要用cur is None,同理,cur != None应改为 cur is not None
2、node中的next应初始化为None:
class Node:
    # 初始化
    def __init__(self, elem):
      self.elem = elem
      self.next = None
3、在length()方法中
def length(self):
      #cur游标用来移动遍历节点;将cur置于头一个头结点
      cur=self.__head=None
      #count用来记录数据
      count=0
      while cur!=None:
            count+=1
            cur=cur.next
      return count
cur 都初始化为None了,后面就没有意义了
改成这样:
cur=self.__head

塔利班 发表于 2020-7-13 11:14:28

self.next=None
页: [1]
查看完整版本: 代码出错帮忙看下