实验二、线性表链式存储(单链表)的实现及应用

一、实验目的

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()

六、实验运行截图

 

以上内容仅个人见解与看法,如有错误请批评指正。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值