第2部分:线性表(一):列表和单链表

目录

目录

目录

前言

2.1  线性表的概念和表抽象数据类型

2.1.1 线性表的概念和性质

2.1.2 线性表抽象数据类型

2.1.3 线性表的实现

2.2 顺序表   

2.2.1 顺序表的基本现实方式

2.2.3 元素外置的顺序表

        2.3 链表

2.3.1 链表概述:

2.3.2 单链表

2.3.3 单链表的运算


前言

学习内容:

  • 线性表的概念
  • 线性表的抽象数据类型定义
  • 线性表的顺序表示和实现
  • 线性表的链式表示和实现
  • 顺序表和链表的比较

重点掌握:

  • 顺序表
    • 基本操作实现
    • 各操作对应时间复杂度分析
  • 链表
    • 基本操作实现
    • 各操作对应时间复杂度分析

2.1  线性表的概念和表抽象数据类型

        线性表是最基本的数据结构,经常用作其他数据结构的实现基础。python内置的list和tuple,可以看作线性表的实现。

2.1.1 线性表的概念和性质


2.1.2 线性表抽象数据类型

        线性表的操作:

         表抽象数据类型:

2.1.3 线性表的实现

2.2 顺序表   

内存及数据在内存中的存储方式:            

2.2.1 顺序表的基本现实方式

 插入数据(保序):

删除数据(保序):

 顺序表的结构定义:

表抽象数据类型代码如下:

class ADTList:    
    def __init__(self):
        self.maxn = 8
        self.num = 0
        self.elems = [8] * self.maxn        
        
    def is_empty(self):
        return not self.num
    
    def is_full(self):
        return self.num == self.maxn
    
    def len(self):        
        return self.num    
    
    def prepend(self,elem):
        if self.num == self.maxn:
            raise BufferError
        else:
            for i in range(self.num,-1,-1):
                self.elems[i] = self.elems[i-1]
            self.elems[0] = elem
            self.num += 1
    
    def append(self,elem):        
        if self.num == self.maxn:
            raise BufferError
        else:
            self.elems[self.num] = elem
            self.num += 1
    
    def insert(self,elem,i):
        if self.num == self.maxn:
            raise BufferError
        elif i > self.num:
            print("insert losed!use append().")
            return
        else:            
            for j in range(self.num,i-1,-1):
                self.elems[j] = self.elems[j-1]         
            self.elems[i-1] = elem
            self.num += 1
    
    def del_first(self):
        for i in range(self.num):
            self.elems[i] = self.elems[i+1]
        self.num -= 1        
    
    def del_last(self):
        if 0 == self.num:
            print("Is emptyed")
            return
        else:
            self.elems[self.num-1] = 0
            self.num -= 1
    
    def del_i(self,i):
        if 0 == self.num or i >= self.num:
            print("out of limt.")
            return
        else:
            for j in range(i-1,self.len(),1):
                self.elems[j] = self.elems[j+1]
            self.num -= 1
            
    def search(self,elem):
        for i in range(self.num):
            if elem == self.elems[i]:
                return i            
        return -1        
        
    def forall(self,op):
        pass
 
if __name__ == "__main__":
    alst = ADTList()    
    alst.prepend(0)
    alst.append(1)
    alst.append(4)
    alst.insert(3,2)
    alst.insert(2,1)
    alst.insert(6,3)
    for i in range(alst.len()):
       print(f"alst.elems[{i}]=",alst.elems[i])
       
    print("-" * 10)
    alst.del_first()
    for i in range(alst.len()):
       print(f"alst.elems[{i}]=",alst.elems[i])
       
    print("-" * 10)    
    alst.del_last()
    for i in range(alst.len()):
       print(f"alst.elems[{i}]=",alst.elems[i])
       
    print("-" * 10)
    alst.del_i(3)
    for i in range(alst.len()):
       print(f"alst.elems[{i}]=",alst.elems[i])
       
    print(alst.search(1))
    print(alst.search(2))

2.2.2 Python中顺序表实现:

Python中list列表各操作的时间复杂度:

2.2.3 元素外置的顺序表

 顺序表的两种形式:

  需要扩容时,用分离式动态表:

 动态顺序表: 

 顺序表的特点:

2.3 链表

2.3.1 链表概述:

2.3.2 单链表

 单链表示例: 

2.3.3 单链表的运算

 单链表的建立和遍历操作:

 代码如下:

 单链表的特点:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值