标题:刚学不久派森
只看楼主
zxq0103
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2023-3-10
结帖率:0
已结贴  问题点数:20 回复次数:4 
刚学不久派森
跟着视频教程刚学没多久
自己写的链表方法,请大神给指点下哪里需要改
很多地方没写返回值,没抛出异常,只是写的打印提示
程序代码:
class Node:
    def __init__(self,value,next = None):
        self.value = value
        self.next = next

class LinkList:
    """
        链表操作:
        增,删,改,查,排
    """
    def __init__(self):  # 链表初始化
        self.head = Node(None)
        print("链表初始化成功")

    def init_list(self,merge): # 给链表装载数据
        """
            给链表挂接数据
        """
        p = self.head
        i = 0
        for item in merge:
            p.next = Node(item)
            p = p.next
            i += 1
        print("链表成功装载%d个数据"%i)

    def get_len(self): # 获取链表的长度
        """
            获取链表的长度
            return:返回链表节点数
        """
        p = self.head.next
        index = 1
        while p.next:
            p = p.next
            index += 1
        return index

    def show_list(self): # 遍历打印链表中所有节点的值
        """
            遍历链表,显示每个节点的值
        """
        p = self.head.next
        while p:
            print(p.value,end=" ")
            p= p.next
        print()
        print("-----------------")

    def is_empty(self): # 判断链表是否为空
        """
            判断链表是否为空
            True:有数据
            False:无数据
        """
        if self.head.next:
            return True
        else:
            return False

    def clear(self):  # 清空链表
        """
            链表清空
        """
        self.head.next = None
        print("链表已经清空!")

    def append(self,val): # 链表尾部增加数据
        """
            链表尾部增加节点数据
            val:要增加的值
        """
        p = self.head
        while p.next:
            p = p.next
        p.next = Node(val)

    def apptop(self, val): # 链表头部增加数据
        """
            链表头部增加节点数据
            val:要增加的值
        """
        t = Node(val)
        t.next = self.head.next
        self.head.next = t

    def insert(self, val, index): # 链表中间增加数据
            """
                链表中间插入的值,如果节点索引超出范围,将插入到链表末尾
                val:要插入的值
                index:要插入的节点索引(索引从0开始)
            """
            p = self.head
            item = 0
            if index >= 0:
                while item != index and p != None:
                    item +=1
                    p = p.next
                if p == None:
                    print("节点'%d'超出了链表的节点范围,所以插入到链表末尾"%index)
                    self.append(val)
                    return
                t = Node(val)
                t.next = p.next
                p.next = t
            print("节点'%d'为负值,所以插入到链表头部" % index)
            self.apptop(val)
            # print("节点'%d'成功插入目标值:"%index,val)

    def remove(self, val): # 删除链表中的某个值
        """
            删除链表中的值
            val:要删除的值
            return:返回删除值对应的节点索引
        """
        p = self.head
        while p.next:
            if p.next.value == val:
                p.next = p.next.next
                print("成功删除目标值:",val)
            p = p.next
        print("你要操作的值并不在链表中")

    def delete(self,index): # 删除链表中某个节点
        """
            删除链表中某个节点
            index:要删除的节点索引
            return:返回删除的值
        """
        p = self.head
        i = 0
        while p:
            if i == index:
                temp_value = p.next.value
                # print("成功删除节点'%d'的值:"%index, p.next.value)
                p.next = p.next.next
                return temp_value
            i += 1
            p = p.next
        print("你要操作的节点并不在链表中")
        return None

    def get_value(self, index): # 获取某个节点对应的值
        """
            获取节点值
            index:节点索引,从0开始
            return:返回节点对应的值
        """
        if index >= 0:
            p = self.head.next
            i = 0
            while p.next:
                if i == index:
                    return p.value
                p = p.next
                i += 1
            return p.value

    def get_index(self,val): # 获取某个值对应的节点
        """
            查找某个值对应的节点索引,
            val:要查找的值
            return:返回节点索引index,找到一个就返回
        """
        p = self.head.next
        index = 0
        while p:
            if p.value == val:
                print(val, "对应的节点索引为:", index)
                return index
            index += 1
            p = p.next
        print(val,"并不在链表中")

    def update(self,index,val): # 更改某个节点的值
        """
            更改某个节点的值
            index:节点索引
        """
        if index >= 0:
            p = self.head.next
            i = 0
            while p:
                if i == index:
                    p.value = val
                    print("节点'%d'对应的值更新为:"%index,val)
                    return
                i += 1
                p = p.next
        print("超出了链表的节点范围,更新失败")

    def move(self, index_1, index_2):  # 节点1移动到节点2
        """
        节点1到移动节点2,如果节点2超出范围,将移动到链表末尾
        index_1:待移动的节点索引[目标节点索引]
        index_2:欲移动到的节点索引[目的节点索引]
        """
        index = self.get_len()
        if index > index_1 >= 0:
            if index > index_2 >= 0:
                temp_value = self.delete(index_1)
                self.insert(temp_value, index_2)
            else:
                print("第2个节点超出了链表的范围,所以移动失败")
                return            
        else:
            print("第1个节点超出了链表的范围,所以移动失败")
            return

    def reversal(self): # 链表反转
        """
            链表反转
        """
        p = self.head.next # 先把链表头部后面的数据存到p
        self.head.next = None # 把链表清空
        if p:
            while p: # 循环取p里的数据添加到空链表的0位置
                self.apptop(p.value)
                p = p.next
            return
        print("空链表,无需反转")

    def order_up(self):  # 链表升序
        """
            链表升序
        """
        p = self.head.next
        index = self.get_len()
        for i in range(index):
            for x in range(i+1, index):
                if self.get_value(i) >= self.get_value(x):
                    self.move(x, i)

    def order_down(self): # 链表降序
        """
            链表降序
        """
        self.order_up()
        self.reversal()

    def to_list(self): # 链表到列表转换
        """
            链表到列表转换
            return:返回列表
        """
        list_my = []
        p = self.head.next
        while p:
            list_my.append(p.value)
            p = p.next
        return list_my


# 测试代码
if __name__ == "__main__":
    list01 = [3,22,8,7,32,14,48,3,1]
    link01 = LinkList()
    link01.init_list(list01)
    link01.show_list()

    link01.reversal()
    link01.show_list()
    link01.get_len()




[此贴子已经被作者于2023-3-10 12:17编辑过]

搜索更多相关主题的帖子: next index 节点 链表 def 
2023-03-10 12:15
东海ECS
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:Python
等 级:版主
威 望:19
帖 子:376
专家分:1454
注 册:2023-1-24
得分:20 
开始时,先定义了list01,后来又把list01改成了LinkList的对象,装载数据时又把list01传递给了merge,所以只输出了数据.

会当凌绝顶,一览众山小.
2023-03-11 08:17
东海ECS
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:Python
等 级:版主
威 望:19
帖 子:376
专家分:1454
注 册:2023-1-24
得分:0 
修改建议:

程序代码:

if __name__ == "__main__":
    import random
    list01 = [random.randint(1, 50) for i in range(9)]
    link02 = LinkList()
    link02.init_list(list01)
    link02.show_list()

    link02.reversal()
    link02.show_list()
    link02.get_len()



会当凌绝顶,一览众山小.
2023-03-11 08:21
zxq0103
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2023-3-10
得分:0 
回复 3楼 东海ECS
变量名有点乱是吧,谢谢
2023-03-14 06:30
zxq0103
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2023-3-10
得分:0 
昨天写的中置表达式到后置表达式的代码
程序代码:
    def mid_to_behind(str_my): # 中置表达式到后置表达式的转化
        """
            中置表达式转后置表达式:
            str_my:为中置表达式字符串,分隔符必需是逗号或空格
        """
        list_result = []  # 存放最终表达式
        stack_per = []  # 符号栈,存放符号
        list_str = str_my.split(",") if "," in str_my else str_my.split(" ") # 分割字符串
        for i in list_str:
            if i in ['*', '/', '**', '(', '//']: # 是符号,直接入栈
                stack_per.append(i)
            elif i in ['+', '-']: # 遇到'+'或'-',就判断栈顶符号是否优先
                if len(stack_per):
                    if stack_per[-1] in ['*', '/', '**', '//']: 
                        list_result.append(stack_per[-1]) # 栈顶高优先级运算符出并入表达式
                        stack_per.pop() # 弹出高优先级运算符
                stack_per.append(i) # 入栈低优先级运算符,空栈直接入栈
            elif i != ")":
                list_result.append(i) # 数字直接入表达式
            else:
                while True:
                    if stack_per[-1] != '(': # 遇到右')',弹栈直到出现左'('
                        list_result.append(stack_per[-1])
                        stack_per.pop()
                    else:
                        stack_per.pop()
                        break
        while len(stack_per) > 0: # 字符串检索完毕后,弹出栈内所有符号入表达式
            list_result.append(stack_per[-1])
            stack_per.pop()
        print("最终的后置表达式为:",list_result)
        return list_result

# 测试代码
if __name__ == "__main__":
    # str_01 = "( ( 36 - 20 ) / ( 4 + 4 ) - 12 ) / 5" # 结果为:-2.0
    # # str_01 = "( ( 110 - 100 ) / ( 1 + 4 ) + 3 ** 2 ) / 5" # 结果为:2.2
    # # str_01 = "( 1 + ( 2 * 3 - 4 ) / 2 ) * 5 - ( 12 - 4 ) / 2" # 结果为:6.0
    # # str_01 = "12 + ( 12 * 5 + 2 * 2 - 24 ) / 2" # 结果为:32.0
    # # str_01 = "3 + ( 6 * 7 - 2 ) * 2 - 2 * 3" # 结果为:77.0
    str_01 = "( ( 1 + 3 ) * ( 1 + 9 ) + 16 // ( 3 * 2 ) ) / 2 - 2 ** 4" # 结果为:5.0


[此贴子已经被作者于2023-3-14 06:52编辑过]

2023-03-14 06:31



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-511507-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.102261 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved