数据结构学习之(一)------线性表(Python)

一.概述

1.定义

2.基本操作

(1)结构初始化操作
(2)结构销毁操作
(3)引用型操作:查询,定位,找元素的前驱和后继,线性表的长度,判断是否为空
(4)加工型操作:插入,删除元素

二.存储结构

1.顺序存储:用一组地址连续的存储单元依次存放线性表中的元素

2.链式存储:用一组地址任意的存储单元存放线性表

三.顺序存储结构

1.时间复杂度分析

(1)初始化:O(1)

(2)查找:

(1)按位置查找:O(1)
(2)按值查找:
最好:O(1)
最坏:O(n)
平均:比较n/2次,时间复杂度是O(n)

(3)插入:O(n)

在第i 个位置插入e,要移动n-i+1个元素,而在第i个位置上插入的概率为Pi,平均移动次数为n/2 时间复杂度O(n)

(4)删除:O(n)

最好:删除最后一个
最坏:删除第一个,移动n-1
平均:移动次数(n-1)/2,时间复杂度O(n)

(5)总结:

顺序存储插入和删除操作开销较大

三.链式存储

1.分类:带头结点和不带头结点的链表

带头节点:头节点永远存在,为空时L.next=null,操作更加方便
不带头节点:空时为null

2.时间复杂度分析

(1)查找

按值查找:O(n)
按位置查找:

(2)插入

单是指插入本身而言,效率为O(1),由于定位操作,效率为O(n),比起顺序结构需要移动大部分数据,链式存储只需要改变指针的指向,所以十分高效,

(3)删除

同插入的分析

四.单链表的变形

1.循环单链表:最后一个节点的指针指向头节点,从任意位置出发都可以访问所有节点

2.带尾指针的循环单链表:

应用情形1:将两个单链表进行合并
应用情形2:经常要在最后一个元素后面添加新元素和在第一个元素面前插入新元素

3.双向链表:每个节点有两个指针,分别指向节点的前驱和后继

下面是python实现带头节点的单链表的基本操作

五.链表的基本操作Python实现代码

#定义节点类
class Node():
    def __init__(self,data,next=None):
        self.data=data
        self.next=next
#定义带头指针的单链表,头指针数据域为链表的长度        
class Linked_list():
    def __init__(self):
        self.head = Node(0)
    #顺序创建链表,即输入顺序和链表顺序一致
    def create_Linked_list_shunxu(self):
        element = input('input item:')
        if not element:
            pass
        else:
            node1 = Node(data=element)
            self.head.data=1
            self.head.next = node1
            currentnode=node1
            while True:
                element = input('input item:')
                if not element:
                    break
                else:
                    newnode=Node(data=element)
                    self.head.data+=1
                    currentnode.next=newnode
                    currentnode =newnode
    #逆序创建链表,即先输入的元素在链表的后面
    def create_Linked_list_nixu(self):
        element = input('input item:')
        if not element:
            pass
        else:
            node1 = Node(data=element)
            self.head.data=1
            self.head.next = node1
            currentnode=node1
            while True:
                element = input('input insert_item:')
                if not element:
                    break
                else:
                    newnode=Node(data=element)
                    self.head.data+=1
                    self.head.next=newnode
                    newnode.next=currentnode
                    currentnode=newnode
    #按值查找
    def seek_Linked_list_element(self, element):
        currentnode=self.head
        i=0
        while currentnode and currentnode.data!=element:
              i+=1
              currentnode = currentnode.next
        if currentnode==None:
            print('There is no item like this')
        else:
            return i
    #按位置查找
    def seek_Linked_list_pos(self, pos):
        currentnode=self.head
        i=0
        while currentnode and i<pos:
            i+=1
            currentnode=currentnode.next
        if currentnode :
            return currentnode.data
        else:
            print('out of index')
    #在某个位置插入元素
    def insert_Linked_list(self, element, pos):
        currentnode=self.head
        i=0
        while currentnode and i<pos-1:
            currentnode =currentnode.next
            i+=1
        if currentnode :
            insertnode=Node(element,currentnode.next)
            currentnode.next=insertnode
        else:
            print('Your pos might be out of index or illegal')
        self.head.data+=1
    #删除某个位置的元素
    def del_Linked_list(self, pos):
        currentnode=self.head
        i=0
        while pos<=self.head.data and i<pos-1:
            i+=1
            currentnode=currentnode.next
        if currentnode:
            mid_node=currentnode.next
            currentnode.next=mid_node.next
        self.head.data-=1
    #打印链表内容
    def print_Linked_list(self):
        currentnode=self.head
        if currentnode:
            currentnode=currentnode.next
            while currentnode :
                print(currentnode.data)
                currentnode = currentnode.next
        else:
            print('The Linked_list is empty')

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
综合试题及答案,帮助大家更好的复习.25、用一组地址连续的存储单元存放的元素一定构成线性。( ) A ) 平均情况下,快速排序法最快,堆积排序法最节省空间 若线性采用顺序存储结构,每个数据元素占用4个存储单元,第12个数据元素的存储地址为144,则第1个数据元素的存储地址是101。Loc(ai)=locl+(i—1)( ) 若长度为n的线性采用顺序存储结构,删除的第i个元素之前需要移动中n-i+1个元素。( )【这是插入的,删除的n-i】 确定串T在串S中首次出现的位置的操作称为串的模式匹配。( 深度为h的非空二叉树的第i层最多有2i-1 个结点。 散列的查找效率主要取决于所选择的散列函数与处理冲突的方法。 稀疏矩阵压缩存储后,必会失效掉随机存取功能 若一个有向图的邻接矩阵中,对角线以下元素均为0,则该图的拓扑有序序列必定存在。( ) 二叉树可以用0≤度≤2的有序树来示。 非空双向循环链中由q所指的结点后面插入一个由p指的结点的动作依次为:p->prior=q, p->next=q->next,q->next=p,q->prior->next←p。( ) 删除非空链式存储结构的堆栈(设栈顶指针为top)的一个元素的过程是依次执行:p=top,top= p->next,free (p)。( ) 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列。( ) 在索引顺序上实现分块查找,在等概率查找情况下,其平均查找长度不与的个数有关,而与每一块中的元素个数有关 无向图的邻接矩阵是对称的有向图的邻接矩阵是不对称的。( _ D _ C B D D C C A B ( C A B D D C B. C C D 如果某图的邻接矩阵是对角线元素均为零的上三角矩阵,则此图是 D D D C A D A D D B A D A B D B C B ( D A B D C 6___ ( C D D __ C A B D 针q所指 C A A D A D B  D A② D A、 )的有限集合 C _B A  C A  C A D ( D C A D B ( B D ( D _ A A ) ( C A ( B ( B D 只有在初始数据为逆序时,冒泡排序所执行的比较次数最多。(

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值