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