首页 > 编程语言 > 详细

Python数据结构与算法(二)—线性表

时间:2019-06-07 16:20:33      阅读:70      评论:0      收藏:0      [点我收藏+]

定义

线性表的定义是描述其逻辑结构,而通常会在线性表上进行的查找、插入、删除等操作。

线性表作为一种基本的数据结构类型,在计算机存储器中的映象(或表示)一般有两种形式,一种是顺序映象,一种是链式映象。

线性表的顺序存储

1.定义:若将线性表L=(a0,a1, ……,an-1)中的各元素依次存储于计算机一片连续的存储空间,这种机制表示为线性表的顺序存储结构。

2.特点:

  • 逻辑上相邻的元素 ai, ai+1,其存储位置也是相邻的;
  • 存储密度高,方便对数据的遍历查找。
  • 对表的插入和删除等运算的效率较差。

3.程序实现

在Python中,list存放于一片单一连续的内存块,故可借助于列表类型来描述线性表的顺序存储结构,而且列表本身就提供了丰富的接口满足这种数据结构的运算。

L = [1,2,3,4]
L.append(10)      #尾部增加元素
#[1, 2, 3, 4, 10]

L.insert(1,20)    #插入元素
#[1, 20, 2, 3, 4, 10]

L.remove(3)       #删除元素
#[1, 20, 2, 4, 10]     

L[4] = 30         #修改
#[1, 20, 2, 4, 30]

L.index(2)        #查找
#2

线性表的链式存储

1.定义:将线性表L=(a0,a1,……,an-1)中各元素分布在存储器的不同存储块,称为结点,每个结点(尾节点除外)中都持有一个指向下一个节点的引用,这样所得到的存储结构为链表结构。

技术分享图片

2.特点

  • 逻辑上相邻的元素 ai, ai+1,其存储位置也不一定相邻;
  • 存储稀疏,不必开辟整块存储空间。
  • 对表的插入和删除等运算的效率较高。
  • 逻辑结构复杂,不利于遍历。

3.程序实现

技术分享图片
  1 """
  2 链表程序实现
  3 重点代码
  4 
  5 思路分析
  6 1. 创建节点类,生成节点对象
  7   包含数据和下一个节点的引用
  8 2. 链表类,生成链表对象
  9   可以对链表进行数据操作
 10 """
 11 
 12 # 节点类
 13 class Node:
 14   def __init__(self, data, next=None):
 15     self.data = data
 16     self.next = next
 17 
 18 
 19 # 链表类
 20 class Linklist:
 21   """
 22   建立链表模型
 23   进行链表操作
 24   """
 25 
 26   def __init__(self):
 27     """
 28     初始化链表,生成一个头节点,表示链表开始节点
 29     """
 30     self.head = Node(None)
 31 
 32   # 初始添加一组链表节点
 33   def init_list(self, list_):
 34     p = self.head  # p为移动变量
 35     for i in list_:
 36       p.next = Node(i)
 37       p = p.next  # p向后移动一个节点
 38 
 39   # 遍历链表
 40   def show(self):
 41     p = self.head.next  # 第一个有效节点
 42     while p is not None:
 43       print(p.data, end= )
 44       p = p.next
 45     print()  # 换行
 46 
 47   # 获取链表长度
 48   def get_length(self):
 49     n = 0
 50     p = self.head
 51     while p.next is not None:
 52       n += 1
 53       p = p.next
 54     return n
 55 
 56   # 判断链表是否为空
 57   def is_empty(self):
 58     if self.get_length() == 0:
 59       return True
 60     else:
 61       return False
 62 
 63   # 清空链表
 64   def clear(self):
 65     self.head.next = None
 66 
 67   # 尾部插入节点
 68   def append(self,data):
 69     node = Node(data)  # 生成新节点
 70     p = self.head
 71     while p.next is not None:
 72       p = p.next
 73     p.next = node
 74 
 75   # 选择位置插入节点
 76   def insert(self,index,data):
 77     if index < 0 or index > self.get_length():
 78       raise IndexError("index out of range")
 79 
 80     # 定义p移动到插入位置的前一个
 81     p = self.head
 82     for i in range(index):
 83       p = p.next
 84 
 85     node = Node(data) # 生成节点
 86 
 87     # 插入
 88     node.next = p.next
 89     p.next = node
 90 
 91   # 删除节点
 92   def delete(self,data):
 93     p = self.head
 94     while p.next and p.next.data != data:
 95       p = p.next
 96     # 判断while循环结束原因
 97     if p.next is None:
 98       raise ValueError("value is error")
 99     else:
100       p.next = p.next.next
101 
102   # 获取节点值
103   def get_item(self,index):
104     if index < 0 or index >= self.get_length():
105       raise IndexError("index out of range")
106     p = self.head.next
107     for i in range(index):
108       p = p.next
109     return p.data
110 
111 
112 if __name__ == "__main__":
113   # 链表对象  
114   # link-->head
115   # link.head --> data == None
116   # link.head --> next == None
117   link = Linklist()
118   l = [1, 2, 3, 4, 5]
119   link.init_list(l)
120   link.show()  # 遍历数据
121   print("Link length:",link.get_length())
122   link.append(6)
123   link.insert(4,100)
124   link.show()
125   link.delete(3)
126   link.show()
127   print(link.get_item(3))
链表实现代码

Python数据结构与算法(二)—线性表

原文:https://www.cnblogs.com/maplethefox/p/10988401.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!