鱼C论坛

 找回密码
 立即注册
查看: 1601|回复: 5

[已解决]代码出错帮忙看下

[复制链接]
发表于 2020-7-13 10:58:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#先定义一个节点的类
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()

这个代码我要实现以上的功能但是出了点问题不知道错在哪里,麻烦帮忙指出来并修改一下
最佳答案
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()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-13 11:06:05 | 显示全部楼层
        while cur!=None:
            count+=1
            cur=cur.next

这是要干嘛...cur的类型是列表呀!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-13 11:11:42 | 显示全部楼层
本帖最后由 Stubborn 于 2020-7-13 11:16 编辑

问题比较多 ,参考下这个吧,比较小,找下自己的问题,还有疑问,再回复
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_())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-13 11:14:28 | 显示全部楼层
self.next=None
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 02:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表