一、实验目的
1.掌握线性表的链式存储结构的表示和实现方法。
2.掌握单链表基本操作的算法实现。
3.掌握单链表的应用。
二、实验环境
Thonny
三、实验内容
编写一个程序,实现单链表的各种基本运算(假设单链表的元素类型为char), 并在此基础上设计一个主程序完成如下功能:
(1)初始化单链表h;
(2)依次采用尾插法插入a、b、c、d、e元素;
(3)输出单链表h;
(4)输出单链表h的长度;
(5)判断单链表h是否为空;
(6)输出单链表h的第3个元素;
(7)输出元素a的位置
(8)在第4个元素位置上插入f元素
(9)输出单链表h;
(10)删除h的第3个元素;
(11)输出单链表h;
(12)释放单链表h。
四、实验要求
1、用pycharm工具创建文件或程序,输入代码后,进行编译运行。
2、观看程序运行结果,并根据结果进行思考,对程序进行修改和总结。
【核心算法提示】
1.链表建立操作的基本步骤:链表是一个动态的结构,它不需要分配空间,因此建立链表的过程是一个结点“逐个插入” 的过程。先建立一个只含头结点的空单链表,然后依次生成新结点,再不断地将其插入到链表的头部或尾部,分别称其为“头插法”和“尾插法”。
2. 链表查找操作的基本步骤:因链表是一种"顺序存取"的结构,则要在带头结点的链表中查找到第 i个元素,必须从头结点开始沿着后继指针依次"点数",直到点到第 i 个结点为止,如果查找成功,则用e返回第i个元素值。头结点可看成是第0个结点。
3. 链表插入操作的基本步骤:先确定要插入的位置,如果插入位置合法,则再生成新的结点,最后通过修改链将新结点插入到指定的位置上。
4. 链表删除操作的基本步骤:先确定要删除的结点位置,如果位置合法,则再通过修改链使被删结点从链表中“卸下”,最后释放被删结点的空间
五、实验源代码
class LinkNode: #单链表结点类
def __init__(self,data=None):
self.data=data
self.next=None
class LinkList: #单链表类
def __init__(self):
self.head=LinkNode()
self.head.next=None
def Add(self, e): #在线性表的末尾添加一个元素e
s=LinkNode(e)
p=self.head
while p.next is not None:
p=p.next
p.next=s
def geti(self, i): #返回序号为i的结点
p=self.head
j=-1
while (j<i and p is not None):
j+=1
p=p.next
return p
def display(self): #输出单链表
p=self.head.next
while p is not None:
print(p.data,end=' ')
p=p.next
print()
def getsize(self): #输出链表长度
p=self.head
cnt=0
while p.next is not None:
cnt+=1
p=p.next
return cnt
def is_empyt(self): #判断是否为空
if self.head is None:
print('列表为空')
elif self.head is not None:
print('列表不为空')
def __getitem__(self,i): #求序号i的元素
assert i>=0
p=self.geti(i)
assert p is not None
return p.data
def GetNo(self,e): #查找第一个为e的序号
j=0
p=self.head.next
while p is not None and p.data!=e:
j+=1
p=p.next
if p is None:
return -1
else:
return j
def Insert(self,i,e): #在i的位置插入e
assert i>=0
s=LinkNode(e)
p=self.geti(-1)
assert p is not None
s.next=p.next
p.next=s
def Delete(self,i): #删除第i个元素
assert i>=0
p=self.geti(i-1)
assert p!=None and p.next is not None
p.next=p.next.next
def DestorySequenceList(self): #释放链表
self.__init__()
if __name__=='__main__':
h=LinkList()
h.Add('a'),h.Add('b'),h.Add('c'),h.Add('d'),h.Add('e')
print("h: ",end=''),h.display()
print("链表长度=%d"%(h.getsize()))
h.is_empyt()
a=int(input('请输入要查找的序号:'))
print("第 %d 个元素为:%s"%(a,h.__getitem__(a)))
b=str(input('请输入要查找的元素:'))
print(" %s 元素的序号为:%d"%(b,h.GetNo(b)))
c=int(input('请输入要插入元素的位置:'))
d=str(input('请输入要插入的元素:'))
h.Insert(c,d) #在第c个位置上插入元素d
print("h: ",end=''),h.display()
e=int(input('请输入要删除元素的序号:'))
h.Delete(e) #删除第e个元素
print("h: ",end=''),h.display()
h.DestorySequenceList()
print("释放后h为: ",end=''),h.display()
六、实验运行截图
以上内容仅个人见解与看法,如有错误请批评指正。