前言
依稀记得大一C++课程布置的两个大作业,一是人工五子棋,二是利用链表写学生管理系统。昨日复习时过了一遍链表,结合最近运用的tkinter库,我决定将界面从cmd上搬下来,此篇作为我学生管理系统的笔记。
结点
链表很像缜密的间谍线,一列单线下来,间谍A是间谍B的上司,他传递信息给B,B间谍又发展自己的单下线C。那么当C被逮捕后,间谍A也不至于天天提心吊胆,因为C只掌握守口如瓶的B的信息。
十分类似,链表由一个个节点组成,节点包括数据域和指针域。这是节点不一定处于连续的物理内存上却有着很好的连续性的原因。
指针域包含的内容和链表类型有关,最为常见的单向链表和双向链表,其每个节点的指针域分别拥有指向下一个结点的指针和指向前后的两个指针。
指针:
class node():
def __init__(self,val = 0,prev=None,next = None):
self.prev = prev
self.next = next
self.val = val
if __name__ == '__main__':
a = node(1)
b = node(2)
a.next = b
b.prev = a
print(a.next)
print(b.prev)
print(a.next.val)
print(b.prev.val)
输出:
<__main__.node object at 0x0000024CF97ACFC8>
<__main__.node object at 0x0000024CF96873C8>
2
1
指针变量中存储的是地址,通过定义节点,我们能读改该地址储存的信息。学生管理系统,每个同学就是一个节点,而其性别、名字、成绩等等就是需要存储的信息。
链表
链表的常见操作有,添加元素(于头、尾、或指定地点),删除元素:
#传入结点
class LinkedList(object):
#初始化
def __init__(self):
self.head = ListNode()
self.tail = None
self.len = 0
#链表为空?
def is_empty(self):
if self.len == 0:
return True
else:
return False
#于链表头部添加元素
def add(self,newnode):
#指针需要相互指向
newnode.next = self.head
self.head.prev = newnode
self.head = newnode
self.len += 1
#于尾部添加元素
def append(self,newnode):
if self.is_empty():
self.head = newnode
else:
#遍历链表
current = self.head
#链表末尾?
while current.next != None:
current = current.next
current.next = newnode
newnode.prev = current
self.tail = newnode
self.len += 1
#找寻特定元素(传入标志位)
def find(self,findnodenum):
current = self.head
while current.next != None:
if current.num == findnode.num:
return current
#传入数值,找寻结点并在其后插入新结点
def insert(self,beinsertnum,newnode)
current = self.head
while current.next != None:
if current.num == beinsertnum:
#表尾
if current.next == None:
self.append(newnode)
else:
#顺序重要
current.next.prev = newnode
newnode.next = current.next
current.next = newnode
newnode.prev = current
如果节点类型及成员变量确定,那么将节点的组装放在链表内会让主函数变得简洁。
源代码
import tkinter as tk
from tkinter.simpledialog import askinteger, askstring
from PIL import ImageTk,Image,ImageGrab
from tkinter import Strin