Python数据结构实验 链表的实现

一、实验目的

1.掌握用Python定义线性表的链式存储类型;

2.掌握用Python调试链表的基本方法;

3.掌握链表的基本操作,插入、删除、查找、以及有序链表的合并等算法的实现;  

二、实验环境

1.Windows操作系统的计算机

2.Python3.7环境平台和PyCharm编辑器

三、实验说明 

1.实现线性表的链式存储结构的基本操作。
2.实验中如无特别说明,均要求使用脚本(.py)方式编写代码。

3.自主编写程序,必要时参考相关资料。

4.实验学时:2学时

四、实验内容和步骤

1.实验内容

(1) 基础实验题

设计整数单链表的基本运算程序,并用相关数据进行测试。

参考框架:

class LinkNode:                                           #单链表结点类

        def __init__(self, data=None):             #构造函数

        ……

class LinkList:                                             #单链表类

       def __init__(self):                                #构造函数

       ……

       def CreateListF(self, a):         #头插法:由数组a整体建立单链表

       ……

       def CreateListR(self, a):         #尾插法:由数组a整体建立单链表

       ……

       def Add(self, e):        #在线性表的末尾添加一个元素e

       ……

       def getsize(self):                                 #返回长度

       ……

       def __getitem__(self,i):                      #求序号为i的元素

       ……

       def __setitem__(self, i, x):                 #设置序号为i的元素

       ……

       def GetNo(self,e):       #查找第一个为e的元素的序号

       ……

       def Insert(self, i, e):                   #在线性表中序号i位置插入元素e

       ……

       def Delete(self,i):       #在线性表中删除序号i位置的元素

       ……

        def display(self):       #输出线性表

       ……

if __name__ == '__main__':                     #主程序

       L=LinkList()

       ……

(2) 应用实验题

由1~ n(例如n =10 000 000)的n个整数建立顺序表a(采用列表表示)和带头结点的单链表h,编写一个实验程序输出分别将所有元素逆置的时间。

参考框架:

import time

class LinkNode:                                     #单链表结点类

        def __init__(self, data=None):       #构造方法

       ……

       def create1(n):                                 #建立顺序表

              a=[]

              ……

       def create2(n):                                  #尾插法建立单链表

              h=LinkNode()                           #建立头结点

              ……

        def reverse1(a):                                #求顺序表逆置的时间

              t1=time.time()                          #获取开始时间

              ……

              t2=time.time()                            #获取结束时间

              return t2-t1

       def reverse2(h):                                 #求单链表表逆置的时间

             t1=time.time()                          #获取开始时间

             ……

             t2=time.time()                             #获取结束时间

             return t2-t1

n=10000000                                             #主程序

a=create1(n)

h=create2(n)

print()

print("  求解结果")

print("  顺序表逆置时间: %.2f" %(reverse1(a)))

print("  单链表逆置时间: %.2f" %(reverse2(h)))

print()

2实验步骤

(1)分析实验内容,写出程序大致框架或完整的程序代码。

(2)进入Python集成环境。

(3)编辑程序并进行保存。

(4)运行程序,若有错误,修改错误后再次运行,如此反复进行到不显示出错为止。

(5)检查程序输出结果。

五、实验代码与结果(程序运行代码及其结果)

1. (1)给出算法的基本设计思想。

  (2)根据设计思想,采用Python语言描述算法,关键之处给出注释。

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 CreateListF(self,a):    #头插法

        for i in range(self,a):

            s=LinkNode(a[i])

            s.next=self.head.next

            self.head.next=s



    def CreateListR(self,a):    #尾插法

        t=self.head

        for i in range(0,len(a)):

            s=LinkNode(a[i])

            t.next=s

            t=s

        t.next=None



    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 Add(self,e):    #在线性表末尾添加元素e

        s=LinkNode(e)

        p=self.head

        while p.next is not None:

            p=p.next

        p.next=s



    def getsize(self):  #获取线性表长度

        p=self.head

        cnt=0

        while p.next is not None:

            cnt+=1

            p=p.next

        return cnt



    def __getitem__(self,i):    #求序号为i的元素

        assert i>=0

        p=self.geti(i)

        assert p is not None

        return p.data



    def __setitem__(self,i,x):  #设置序号为i的元素

        assert i>=0

        p=self.geti(i)

        assert p is not None

        p.data=e



    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):   #将元素e插入序号为i的位置

        assert i >=0

        s=LinkNode(e)

        p=self.geti(i-1)

        assert p is not None

        s.next=p.next

        p.next=s



    def Delete(self,i):

        assert i>=0

        p=self.geti(i-1)

        assert p!=None and p.next!=None

        p.next=p.next.next



    def display(self):      #打印单链表

        p=self.head.next

        while p is not None:

            print(p.data,end=' ')

            p=p.next

        print()



if __name__ == '__main__':

    L=LinkList()

    L.Add('a'),L.Add('b'),L.Add('c'),L.Add('d'),L.Add('e')

    print("L:",end=''),L.display()

    print("链表长度=%d"%(L.getsize()))

    a=int(input('请输入要查找的序号:'))

    print("第 %d 个元素为:%s"%(a,L.__getitem__(a)))

    b=str(input('请输入要查找的元素:'))

    print(" %s 元素的序号为:%d"%(b,L.GetNo(b)))

    c=int(input('请输入要插入元素的位置:'))

    d=str(input('请输入要插入的元素:'))

    L.Insert(c,d)

    print("L: ",end=''),L.display()

    e=int(input('请输入要删除元素的序号:'))

    L.Delete(e)

    print("L:",end=''),L.display()


2. (1)给出算法的基本设计思想。

  (2)根据设计思想,采用Python语言描述算法,关键之处给出注释。

import time

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 CreateListR(self,a):            #尾插法

        t=self.head

        for i in range(0,len(a)):

            s=LinkNode(a[i])

            t.next=s

            t=s

        t.next=None



    def Reverse(L):                     #置换

        p=L.head.next

        L.head.next=None

        while p!=None:

            q=p.next

            p.next=L.head.next

            L.head.next=p

            p=q





class SqList:                           #顺序表

    def __init__(self,capacity = 0):    #最大容量

        self.capacity = capacity        #用于存储数据

        self.data = [None] * self.capacity

        self.size = 0



    def getsize(self):                   #获取顺序表长度

        return self.size



    def createSqList(self,a):           #创建顺序表

        for i in range(len(a)):

            if self.size == self.capacity:

                self.resize(self,size * 2)

            self.data[self.size] = a[i]

            self.size += 1



    def resize(self,newcapacity):       #修改线性表的最大容量

        if newcapacity >= self.capacity:

            self.data = self.data + [None] * (newcapacity - self.capacity)

        else:

            self.data = self.data[:newcapacity]

        self.capacity = newcapacity



    def reverse(self):                  #置换函数

        i,j = 0, self.getsize()-1

        while i<j:

            self.data[i], self.data[j] = self.data[j], self.data[i]

            i += 1

            j -= 1



if __name__ =='__main__':

    a=SqList(10000001)

    a.createSqList(list(range(10000001)))

    t1=time.time()

    a.reverse()

    t2=time.time()

    t=t2-t1

    print("顺序表置换时间:",t)



    h=LinkList()

    h.CreateListR(range(1,10000001))

    t1=time.time()

    h.Reverse()

    t2=time.time()

    t=t2-t1

    print("单链表置换时间:",t)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值