链表(LinkList)是由许多相同数据类型的数据按照特定顺序排列而成的顺序表。
特性:各个数据项在计算机内存中的位置是不连续且随机存放的
优点:数据的插入与删除相当方便
缺点:设计数据结构时比较麻烦,查找数据时,无法像数组那样随机读取数据,必须按序查找
单向链表:
在动态分配内存空间时,最常用的就是:单向链表(Single Link List)
一个单向链表节点:由数据字段与指针组成,指针指向下一个元素所在内存中的位置
由于单向链表所有节点都知道下一个节点在哪里,但是对于前一个节点却不知道,所以链表头指针很重要。
建立单向链表:
如果以动态分配产生链表节点的节点,可以先定义一个类,接着在该类里面定义一个指针字段,作用是指向下一个链表节点,另外该类里面至少一个数据字段。
eg:声明一个学生成绩链表,包含姓名,成绩两个数据字段 与一个指针
class student:
def __init__(self):
self.name=' '
self.score=0
self.next=None
完成节点类的声明后,可以动态建立链表的每一个节点了,假设要增加一个节点到链表的末尾,且ptr指向链表的第一个节点(尾插发建链表):
step 1:动态分配内存空间给新节点
step 2:将原链表尾部的next指针指向新元素所在内存
step 3:将ptr指针指向新节点的内存位置,表示这是新的链表链尾
step4:由于新节点为当前链表的最后一个元素,因此它的指针指向None
Python建立学生节点的单向链表 :
head=student() #建立链表头节点
head.next=None
ptr=head
select=0
while select !=2:
print('(1)新增 (2)离开=>')
try:
select=int(input('请输入一个选项:'))
except ValueError:
print('输入错误')
print('重新输入')
if select==1:
new_data=student() #新增
new_data.name=input('name:')
new_data.num=eval(input('ID numbe; '))
new_data.score=eval(input('score: '))
ptr.next=new_data
new_data.next=None
ptr=ptr.next
单向遍历链表:
ptr=head.next#设置存取指针从链表的头开始
while ptr!=None:
print('姓名:%s\t学号:%d \t成绩:%d'\
%(ptr.nsme,ptr.num,ptr.scor))
sumscore=sumscore+ptr.score
ptr=ptr.next
设计一个Python程序,根据学生信息建立单向链表,并遍历显示内容,输出所有学生平均成绩:
import sys #导入系统模块
class student:
def __init__(self):
self.name=' '
self.num=0
self.score=0
self.next=None
head=student() #建立链表头节点
head.next=None
ptr=head
select=0
sumscore=0
student_num=0
while select !=2:
print('(1)新增 (2)离开=>')
try:
select=int(input('请输入一个选项:'))
except ValueError:
print('输入错误')
print('重新输入')
if select==1:
new_data=student() #新增
new_data.name=input('name:')
new_data.num=eval(input('ID numbe; '))
new_data.score=eval(input('score: '))
ptr.next=new_data
student_num=student_num+1
new_data.next=None
ptr=ptr.next
ptr=head.next#设置存取指针从链表的头开始
while ptr!=None:
print('姓名:%s\t学号:%d \t成绩:%d'\
%(ptr.name,ptr.num,ptr.score))
sumscore=sumscore+ptr.score
ptr=ptr.next
if student_num!=0:
print('-----------------------------------------------')
print('学生平均成绩:%.2f'%(sumscore/student_num))
运行结果: