近期闲来无事,写个链表压压惊

编程入门 行业动态 更新时间:2024-10-10 00:30:02

近期闲来<a href=https://www.elefans.com/category/jswz/34/1749541.html style=无事,写个链表压压惊"/>

近期闲来无事,写个链表压压惊

近期忙着复习期末考试,没咋写代码,这不刷题的时候刷到了一道题,需要一点面线对象和单链表的知识,我就想,不如写一个单链表,顺带复习一下以前的知识点。

话不多说,直接上代码:

class LinkNode(object):  # 结点类def __init__(self):  # 默认构造函数self.Data = 0self.next = Noneclass SingleLinkList(object):  # 单链表类def __init__(self):  # 默认构造函数self.Header = LinkNode()  # 首结点self.Tail = None   # 尾结点self.len = 0self.Header.Data = self.len  # 利用空的header.data域存放链表长度def __del__(self):  # 析构函数print('Destructor call !!!')def init_single_linklist(self):  # 初始化单链表self.Header.next = Noneself.Tail = Noneself.Header.Data = 0self.len = 0def is_empty(self):  # 判断单链表是不是非空if self.len <= 0:return Trueelse:return Falsedef length_single_linklist(self):  # 返回链表的长度return self.lendef add_list(self, li):   # 在链表的后面添加一个列表,成为单链表for i in li:self.add_element_end(i)return Truedef clear_single_linklist(self):  # 清除链表的所有元素if self.is_empty():print('链表是空的,无法删除!!!')return Falsepointer = self.Headerwhile pointer.next is not None:pointer = pointer.nextdel pointer.Dataself.Header.next = Noneself.len = 0return Truedef destroy_single_linklist(self):  # 销毁单链表self.clear_single_linklist()del self.Headerprint('销毁单链表成功!!!')def add_element_head(self, a):  # 在链表的头部插入一个元素a_node = LinkNode()  # 新建一个结点a_node.Data = a  # 将这个结点的值赋值为用户传入的值pointer = self.Headerif self.len == 0:a_node.next = Nonepointer.next = a_nodeelse:a_node.next = pointer.nextpointer.next = a_nodeself.len += 1return adef add_element_middle(self, pos, b):# 在链表的中间(第pos个位置后面,# pos不是偏移,而是从1开始的绝对位置)插入一个元素# 1 <= pos <= lenif self.len in [0, 1]:print('这个链表的长度不足2,所以在链表进行尾部加入元素')self.add_element_end(b)return bif pos < 1 or pos >= self.len:print('您输入的位置超过了范围!')return Falseb_node = LinkNode()b_node.Data = bpointer = self.Headerfor i in range(0, pos):pointer = pointer.nextb_node.next = pointer.nextpointer.next = b_nodeself.len += 1return bdef add_element_end(self, c):  # 在链表的尾部插入一个元素pointer = self.Headerwhile pointer.next is not None:pointer = pointer.nextc_node = LinkNode()c_node.Data = cc_node.next = Nonepointer.next = c_nodeself.len += 1return cdef get_offset(self, e):  # 找某个元素的偏移量if self.is_empty():print('单链表是空的,没有元素')pointer = self.Headerif pointer.next.Data == e:return 0i = 0while pointer.next is not None:pointer = pointer.nexti += 1if pointer.Data == e:return i - 1if i > self.len:breakreturn Falsedef get_element(self, pos):  # 查找链表中第pos个位置的元素(pos为绝对位置,从1开始计数)if self.is_empty() or pos < 1 or pos > self.len:print('单链表为空或者您输入的数据超出范围!!!')return Falsepointer = self.Headerfor i in range(0, pos):pointer = pointer.nextreturn pointer.Datadef precursor_element(self, e):  # 寻找e的前驱元素if self.is_empty():print('单链表是空的,没有元素')return Falsepointer1 = self.Header.nextpointer2 = self.Headerif self.len == 1:print('您的单链表只有一个元素,不能找到前驱元素!!!')if pointer1.Data == e:print('您所要找的元素在单链表中是第一个元素,没有前驱元素!!!')return Falsei = 0while pointer1.next is not None:pointer2 = pointer2.nextpointer1 = pointer1.nextif pointer1.Data == e:i = 1return pointer2.Dataif i == 0:print('找不到您要查找的元素!!!')return Falsedef successor_element(self, e):  # 寻找e的后继元素if self.is_empty():print('单链表是空的,没有元素')return Falsepointer3 = self.Header.nextpointer4 = self.Headerif pointer3.Data == e:if pointer3.next is not None:return pointer3.next.Dataelse:print('您的单链表只有一个元素,不能找到后继元素!!!')return Falsei = 0while pointer3.next is not None:pointer4 = pointer4.nextpointer3 = pointer3.nextif pointer4.Data == e:i = 1return pointer3.Dataif pointer3.next is None and pointer3.Data == e:print('您要找的元素的前驱元素是最后一个元素,没有后继元素!!!')if i == 0:print('不存在你要找的元素!!!')return False# 这个函数有问题,需要再改进# def delete_element(self, e):  # 删除一个元素#     if self.is_empty():#         print('单链表是空的!!!')#         return False#     pointer = self.Header#     pointer_temp = self.Header.next#     i = 0#     while pointer_temp.next is not None:#         pointer_temp = pointer_temp.next#         pointer = pointer.next#         if pointer_temp.Data == e:#             q = pointer.next#             pointer.next = q.next#             q.next = None#             del q.Data#             i = 1#             self.len -= 1#             break#     if i == 0:#         print('没有你所要找的数据!!!')#         return False#     return edef delete_element_offset(self, pos):  # 删除一个位置的元素if self.is_empty():print('单链表是空的!!!')return Falseif pos < 1 or pos > self.len:print('超过了范围!!!')return Falsepointer = self.Headerfor i in range(0, pos):pointer = pointer.nextq = pointer.nextpointer.next = q.nextq.next = Nonedel q.Dataself.len -= 1def traverse_single_linklist(self):  # 遍历单链表if self.is_empty():print('链表是空的!!!')return Falsepointer = self.Headerprint('Header ->', end=' ')while pointer.next is not None:pointer = pointer.nextprint(pointer.Data, end=' -> ')print('None')return True# 测试单链表
def main():x = SingleLinkList()# x.init_single_linklist()# print('现在链表的长度是:{}'.format(x.length_single_linklist()))# print('链表是空的:{}'.format(x.is_empty()))# print('下面进行添加链表元素:')x.add_list([2, 5, 6, 0, 8, 9, 10, 15])# x.add_element_end(2)# x.add_element_head(5)# x.add_element_head(4)# x.add_element_end(3)# x.add_element_middle(5, 20)# print('现在链表的长度是:{}'.format(x.length_single_linklist()))# print('下面遍历链表:')# x.traverse_single_linklist()# x.clear_single_linklist()# x.traverse_single_linklist()# print('现在链表的长度是:{}'.format(x.length_single_linklist()))# print('链表是空的:{}'.format(x.is_empty()))# x.traverse_single_linklist()# x.destroy_single_linklist()x.traverse_single_linklist()# print(x.get_offset(15))# print(x.get_element(7))# print(x.precursor_element(17))# print(x.successor_element(151))# x.delete_element_offset(3)# x.delete_element(2)x.delete_element_offset(5)x.traverse_single_linklist()if __name__ == '__main__':main()

用这些代码去应付老师下发的链表作业完全足够了。(doge)

代码如有不懂得小朋友可以私信我,一起讨论,增强能力。

本人能力有限,代码难免有诸多疏漏之处,如遇错误还请批评指正,大家一起进步呀!

欢迎各位码友点赞、收藏。

更多推荐

近期闲来无事,写个链表压压惊

本文发布于:2024-02-19 14:45:36,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1764822.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:无事   闲来   链表   近期

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!