Python 数据结构 ---- 02 链表

1. 新增元素到单向链表

#新增数据节点,并建立单向链表
import sys

class student:
    def __init__(self):
        self.name=''
        self.Math=0
        self.Eng=0
        self.no=''
        self.next=None

head = student()  #建立链表的头部
head.next=None
ptr = head
Msum = Esum = num = student_no = 0
select = 0

while select !=2:
    print('(1)新增 (2)离开==>')
    try:
        select = int(input('请输入一个选项:'))
    except ValueError:
        print('输入错误')
        print('请重新输入\n')
    if select ==1:
        new_data = student() #新增下一个元素
        new_data.name=input('姓名:')
        new_data.no=input('学号:')
        new_data.Math=eval(input('数学成绩:'))
        new_data.Eng=eval(input('英语成绩:'))
        ptr.next=new_data  #存取指针位置为新元素所在位置
        new_data.next=None #下一个元素的net先设置为None
        prt=ptr.next
        num=num+1

ptr=head.next  #设置存取指针从链表的头部开始
print()
while ptr != None:
    print('姓名:%s\t 学号:%s\t 数学成绩:%d\t 英语成绩:%d\t'%(ptr.name,ptr.no,ptr.Math,ptr.Eng) )
    Msum=Msum+ptr.Math
    Esum=Esum+ptr.Eng
    student_no=student_no+1
    ptr=ptr.next  #将ptr移向下一个元素
if student_no != 0:
    print('---------------------------------------------------------------------')
    print('本链表中学生的数学平均成绩:%.2f 英语平均成绩:%.2f'%(Msum/student_no,Esum/student_no))

C:\Users\Amber\AppData\Local\Programs\Python\Python36\python.exe C:/Python/Exercises/CH03_01.py
(1)新增 (2)离开==>
请输入一个选项:1
姓名:andy
学号:1
数学成绩:98
英语成绩:97
(1)新增 (2)离开==>
请输入一个选项:1
姓名:may
学号:2
数学成绩:95
英语成绩:96
(1)新增 (2)离开==>
请输入一个选项:2

姓名:may     学号:2     数学成绩:95     英语成绩:96    
---------------------------------------------------------------------
本链表中学生的数学平均成绩:95.00 英语平均成绩:96.00

2. 基于Python单向链表实现尾部、任意位置添加,删除

# coding = utf-8
# 创建节点类
class Node(object):
    def __init__(self, data):
        # 定义指向域
        self.next = None
        # 定义数据域
        self.data = data

# 创建链表类
class LinkDict(object):
    def __init__(self):
        self._head = Node(None)
        self._length = 0

    # 尾部添加元素
    def append(self, data):
        # 构造新节点
        new_code = Node(data)
        # 查找尾部节点并定义游标指向头节点,向尾部添加新节点
        cur = self._head
        # 循环遍历
        while cur.next is not None:
            # 移动游标
            cur = cur.next
        else:
            # 向尾部添加新节点
            cur.next = new_code
            # 链表长度加1
            self._length += 1
        return self._length

    # 循环遍历链表元素
    def traval(self):
        cur = self._head
        while cur.next is not None:
            # 打印后边节点
            print(cur.next.data, "--->", end="")
            # 游标后移
            cur = cur.next
        else:
            print("None:now is terminal")

    # 任意位置添加元素
    def insert(self, pos, data):
        # 判断插入点
        if isinstance(pos, int):
            if pos < 0:
                link_dict.insert(0, data)
            elif pos > self._length:
                link_dict.append(data)
            else:
                # 构造新节点
                new_code = Node(data)
                # 构造游标
                cur = self._head
                # 构造计数器
                cnt = 0
                while cur.next is not None:
                    if cnt == pos:
                        # 让新节点有所指向
                        new_code.next = cur.next
                        # 让与新节点有关的节点有所指向
                        cur.next = new_code
                        self._length += 1
                        return
                    else:
                        # 移动游标
                        cur = cur.next
                        # 计数器加1
                        cnt += 1
        else:
            print("pos位置无效, 请确认")
            exit()

    def is_empty(self):
        if self._length == 0:
            print("链表为空")
            return True
        else:
            return False

    def remove(self, data):
        if link_dict.is_empty():
            return True
        else:
            cur = self._head
            while cur.next is not None:
                if cur.next.data == data:
                    # 删除节点
                    cur.next = cur.next.next
                    self._length -= 1
                    return
                else:
                    # 游标移动
                    cur = cur.next
            else:
                print("data is not in link_data")

if __name__ == "__main__":
    link_dict = LinkDict()
    print("尾 部 添 加:  ", end="")
    for i in range(10):
        link_dict.append(i)
    link_dict.traval()
    print("任意位置添加: ", end="")
    link_dict.insert(-1, "a")
    link_dict.insert(100, "z")
    link_dict.insert(6, "x")
    link_dict.traval()
    print("删 除 节 点: ", end="")
    link_dict.remove("a")
    link_dict.remove("x")
    link_dict.remove("z")

    link_dict.traval()

C:\Users\Amber\AppData\Local\Programs\Python\Python36\python.exe C:/Python/Exercises/CH03_02.1.py
尾 部 添 加:  0 --->1 --->2 --->3 --->4 --->5 --->6 --->7 --->8 --->9 --->None:now is terminal
任意位置添加: a --->0 --->1 --->2 --->3 --->4 --->x --->5 --->6 --->7 --->8 --->9 --->z --->None:now is terminal
删 除 节 点: 0 --->1 --->2 --->3 --->4 --->5 --->6 --->7 --->8 --->9 --->None:now is terminal

import sys

class employee:
    def __init__(self):
        self.num=0
        self.slary=0
        self.name=''
        self.next=None

def findnode(head,num):
    ptr = head

    while ptr != None:
        if ptr.num==num:
            return ptr
        ptr=ptr.next
    return ptr

def InsertNode(head,ptr,num,salary,name):
    InsertNode=employee()
    if not InsertNode:
        return None
    InsertNode.num=num
    InsertNode.salary=salary
    InsertNode.name=name
    InsertNode.next=None
    if ptr==None:  #插入第一个节点
        InsertNode.next=head
        return InsertNode
    else:
        if ptr.next==None: #插入最后一个节点
            ptr.next=InsertNode1041

        else:  #插入中间节点
            InsertNode.next=ptr.next
            ptr.next=InsertNode
    return head

position = 0
data=[[1001,32367],[1002,24388],[1003,27556],[1007,31299],[1012,42660],[1014,25676],[1018,44145],[1043,52182],\
      [1031,32769],[1037,21100],[1041,32196],[1046,25776]]
namedata=['Allen','Scott','Marry','John','Mark','Ricky','Lisa','Jessica','Hanson','Amy','Bob','Jack']
print('员工编号 薪水 员工编号 薪水 员工编号 薪水 员工编号 薪水')
print('--------------------------------------------------------------')
for i in range(3):
    for j in range(4):
        print('[%4d] $%d' %(data[j*3+i][0],data[j*3+i][1]),end='\t')
    print()
print('--------------------------------------------------------------')
head = employee() #建立链表的头部
head.next=None

if not head:
    print('Error!! 内存分配失败!!\n')
    sys.exit(1)
head.num=data[0][0]
head.name=namedata[0]
head.salary=data[0][1]
head.next=None
ptr=head
for i in range(1,12): #建立链表
    newnode=employee()
    newnode.next=None
    newnode.num=data[i][0]
    newnode.name=namedata[i]
    newnode.slary=data[i][1]
    newnode.next=None
    ptr.next=newnode
    ptr=ptr.next

while (True):
   print('请输入要插入其后的员工编号,如输入的编号不在此链表中')
   position=int(input('新输入的员工节点将视为此链表的链表头部,要结束插入过程,请输入-1'))
   if position==-1:
        break
   else:
        ptr=findnode(head,position)
        new_num=int(input('请输入新插入的员工编号:'))
        new_salary=int(input('请输入新插入的员工薪水:'))
        new_name=input('请输入新插入的员工姓名:')
        head=InsertNode(head,ptr,new_num,new_salary,new_name)
   print()
ptr=head
print('\t 员工编号     姓名\t  薪水')
print('\t=========================================================')
while ptr!=None:
   print('\t[%2d]\t[ %-7s]\t[%3d]'%(ptr.num,ptr.name,ptr.salary))
ptr=ptr.next

C:\Users\Amber\AppData\Local\Programs\Python\Python36\python.exe C:/Python/Exercises/CH03_02.py
员工编号 薪水 员工编号 薪水 员工编号 薪水 员工编号 薪水
--------------------------------------------------------------
[1001] $32367    [1007] $31299    [1018] $44145    [1037] $21100    
[1002] $24388    [1012] $42660    [1043] $52182    [1041] $32196    
[1003] $27556    [1014] $25676    [1031] $32769    [1046] $25776    
--------------------------------------------------------------
请输入要插入其后的员工编号,如输入的编号不在此链表中
新输入的员工节点将视为此链表的链表头部,要结束插入过程,请输入-11003
请输入新插入的员工编号:1088
请输入新插入的员工薪水:55555
请输入新插入的员工姓名:jjjjj


////以上程序还有待改善,执行有bug

import sys
class employee:
    def __init__(self):
        self.num=0
        self.slary=0
        self.name=''
        self.next=None

def del_ptr(head,ptr): #删除节点子程序
    top=head
    if ptr.num==head.num:  #Case1:要删除的节点在链表头部
        head=head.num
        print('已删除第%d号员工姓名:%s 薪资:%d'%(ptr.num,ptr.name,ptr.salary))
    else:
        while top.next!=ptr: #找到删除节点的前一个位置
            top=top.next
        if ptr.next==None:  #删除在链表末尾的节点
            top.next=None
            print('已删除第%d号员工姓名:%s 薪资:%d' % (ptr.num, ptr.name, ptr.salary))
        else:
            top.next=ptr.next #删除在列表中的任一节点
            print('已删除第%d号员工姓名:%s 薪资:%d' % (ptr.num, ptr.name, ptr.salary))
    return head  #返回链表

def main():
    findword=0
    namedata = ['Allen', 'Scott', 'Marry', 'John', 'Mark', 'Ricky', 'Lisa', 'Jessica', 'Hanson', 'Amy', 'Bob', 'Jack']
    data = [[1001, 32367], [1002, 24388], [1003, 27556], [1007, 31299], [1012, 42660], [1014, 25676], [1018, 44145],
            [1043, 52182], \
            [1031, 32769], [1037, 21100], [1041, 32196], [1046, 25776]]
    print('员工编号 薪水 员工编号 薪水 员工编号 薪水 员工编号 薪水')
    print('--------------------------------------------------------------')
    for i in range(3):
        for j in range(4):
            print('%2d [%3d]  ' % (data[j * 3 + i][0], data[j * 3 + i][1]), end='')
        print()
    head = employee() #建立链表头部
    if not head:
        print('Error!! 内存分配失败!!\n')
        sys.exit(0)
    head.num = data[0][0]
    head.name = namedata[0]
    head.salary = data[0][1]
    head.next = None
    ptr = head
    for i in range(1, 12):  # 建立链表
        newnode = employee()
        newnode.num = data[i][0]
        newnode.name = namedata[i]
        newnode.slary = data[i][1]
        newnode.num=data[i][0]
        newnode.next = None
        ptr.next = newnode
        ptr = ptr.next

    while (True):
        findword=int(input('请输入要删除的员工编号,要结束删除过程,请输入-1'))
        if (findword == -1):
            break
        else:
            ptr=head
            find = 0
            while ptr != None:
                if ptr.num==findword:
                    ptr=del_ptr(head,ptr)
                    find = find+1
                    head = ptr
                ptr=ptr.next
            if find == 0:
                print('#######没有找到#######')
        ptr = head
        print('\t员工编号   姓名\t薪水')  #打印剩余链表中的数据
        print('\t=======================================================')
        while(ptr!=None):
            print('\t[%2d]\t[ %-10s]\t[%3d]' % (ptr.num, ptr.name, ptr.salary))
            ptr=ptr.nextmain()


////以上程序还有待改善,执行有bug

猜你喜欢

转载自blog.csdn.net/f2157120/article/details/81432321
今日推荐