如何用Python LinkedList实现电话簿?请求补全增删改查功能
基于链表实现电话簿功能的完整代码
以下是完善后的电话簿代码,包含插入、查看、更新、删除所有核心功能,同时适配了你原有的代码框架:
class Node: def __init__(self, name=" ", number=None): self.name = name self.number = number self.next = None class LinkedList: def __init__(self): self.head = None # 插入联系人:尾插法,添加到链表末尾 def Insert(self, name, number): new_node = Node(name, number) # 链表为空时直接作为头节点 if self.head is None: self.head = new_node return # 遍历到最后一个节点 current = self.head while current.next is not None: current = current.next current.next = new_node print(f"联系人 {name} 已添加") # 查看所有联系人 def display(self): if self.head is None: print("电话簿为空") return current = self.head print("\n===== 电话簿联系人 =====") index = 1 while current is not None: print(f"{index}. 姓名: {current.name}, 号码: {current.number}") current = current.next index += 1 print("======================\n") # 辅助方法:根据姓名查找联系人(忽略大小写) def find_contact(self, name): current = self.head while current is not None: if current.name.lower() == name.lower(): return current current = current.next return None # 更新联系人:可选择更新姓名/号码/两者 def Update(self, old_name, new_name=None, new_number=None): contact = self.find_contact(old_name) if not contact: print(f"未找到联系人 {old_name}") return if new_name: contact.name = new_name print(f"联系人姓名已更新为 {new_name}") if new_number: contact.number = new_number print(f"联系人号码已更新为 {new_number}") # 删除联系人 def Delete(self, name): current = self.head prev = None # 定位要删除的节点 while current is not None and current.name.lower() != name.lower(): prev = current current = current.next if current is None: print(f"未找到联系人 {name}") return # 删除头节点 if prev is None: self.head = current.next # 删除中间/尾节点 else: prev.next = current.next print(f"联系人 {name} 已删除") a_llist = LinkedList() print('**********Menu***********') print(" press [I] Insert Contact") print(" press [V] View All Contacts") print(" press [U] Update Contact") print(" press [D] Delete Contact") print(" press [X] Exit") while True: ch = str(input("\nEnter your choice :")) if ch == 'I' or ch == 'i': insrt = int(input("How many contacts you want to add? :")) for i in range(insrt): name = str(input("Enter name :")) num = int(input("Enter number :")) a_llist.Insert(name, num) elif ch == 'V' or ch == 'v': a_llist.display() elif ch == 'U' or ch == 'u': old_name = input("请输入要更新的联系人姓名: ") print("选择更新内容:") print("1. 更新姓名") print("2. 更新号码") print("3. 同时更新姓名和号码") update_choice = input("输入选项(1/2/3): ") new_name = None new_number = None if update_choice == '1': new_name = input("输入新姓名: ") elif update_choice == '2': new_number = int(input("输入新号码: ")) elif update_choice == '3': new_name = input("输入新姓名: ") new_number = int(input("输入新号码: ")) else: print("无效选项") continue a_llist.Update(old_name, new_name, new_number) elif ch == 'D' or ch == 'd': name = input("请输入要删除的联系人姓名: ") a_llist.Delete(name) elif ch == 'X' or ch == 'x': print("程序已退出") break else: print("invalid option ")
关键功能说明
1. 插入逻辑
采用尾插法将新联系人添加到链表末尾,确保联系人按添加顺序存储,遍历到链表最后一个节点后完成插入。
2. 查看功能
通过display方法遍历整个链表,逐个打印联系人信息,空链表时会给出明确提示。
3. 更新功能
新增了find_contact辅助方法快速定位联系人,支持单独更新姓名、单独更新号码,或同时更新两者,操作灵活。
4. 删除功能
处理三种删除场景:
- 删除头节点:直接将链表头指针指向第二个节点
- 删除中间节点:让前一个节点跳过当前节点,直接指向后一个节点
- 删除尾节点:将倒数第二个节点的
next设为None
内容的提问来源于stack exchange,提问作者Rachel
相关产品推荐
相关产品推荐

