You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 11:01:13