数据基础结构 15_第1页
数据基础结构 15_第2页
数据基础结构 15_第3页
数据基础结构 15_第4页
数据基础结构 15_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

郭炜信息科学技术学院数据结构与算法

(Python描述)课程信息教材数据结构与算法(Python语言实现)郭炜编著清华大学出版社另有Java语言实现,C/C++语言实现两本,均已经由清华大学出版社出版线性表3线性表线性表是一个元素构成的序列该序列有唯一的头元素和尾元素,除了头元素外,每个元素都有唯一的前驱元素,除了尾元素外,每个元素都有唯一的后继元素线性表中的元素属于相同的数据类型,即每个元素所占的空间必须相同。依据存储方式不同分为顺序表和链表两种顺序表信息科学技术学院河北草原天路顺序表即Python的列表,以及其它语言中的数组元素在内存中连续存放每个元素都有唯一序号(下标),且根据序号访问(包括读取和修改)元素的时间复杂度是O(1)的---随机访问下标为i的元素前驱下标为i-1,后继下标为i+1序号操作含义时间复杂度1init(n)生成一个n个元素的顺序表,元素值随机O(1)2init(a0,a1,....an)生成元素为a0,a1,....an的顺序表O(n)3length()求表中元素个数O(1)4append(x)在表的尾部添加一个元素xO(1)5pop()删除表尾元素O(1)6get(i)返回下标为i的元素O(1)7set(i,x)将下标为i的元素设置为xO(1)8find(x)查找元素x在表中的位置O(n)9insert(i,x)在下标i处插入元素xO(n)10remove(i)删除下标为i的元素O(n)顺序表支持的操作顺序表的append的O(1)复杂度的实现总是分配多于实际元素个数的空间(容量大于元素个数)元素个数小于容量时,append操作复杂度O(1)元素个数等于容量时,append导致重新分配空间,且要拷贝原有元素到新空间,复杂度O(n)顺序表的append的O(1)复杂度的实现重新分配空间时,新容量为旧容量的k倍(k>1且固定),可确保append操作的平均复杂度是O(1)。Python的list取k=1.2左右

链表概述信息科学技术学院宁夏中卫沙坡头链表元素在内存中并非连续存放,元素之间通过指针链接每个结点除了元素,还有next指针,指向后继不支持随机访问。访问第i个元素,复杂度为O(n)已经找到插入或删除位置的情况下,插入和删除元素的复杂度O(1),且不需要复制或移动结点有多种形式:

单链表

循环单链表

双向链表

循环双向链表单链表信息科学技术学院张掖冰沟丹霞单链表classLinkList: classNode:#表结点 def__init__(self,data,next=None): self.data,self.next=data,next def__init__(self): self.head=self.tail=None self.size=0单链表 defprintList(self):#打印全部结点 ptr=self.head whileptrisnotNone: print(ptr.data,end=",") ptr=ptr.next单链表插入元素 definsert(self,p,data):#在结点p后面插入元素

nd=LinkList.Node(data,None) ifself.tailisp:#新增的结点是新表尾

self.tail=nd nd.next=p.next p.next=nd self.size+=1单链表插入元素(1)执行nd=Node(data,None)新建结点nd单链表插入元素(2)执行nd.next=p.next单链表插入元素(3)执行p.next=nd,完成插入单链表删除元素删除p后面的元素(1)初始状态,将要删除'a'结点单链表删除元素删除p后面的元素(2)执行p.next=p.next.next,完成删除单链表删除元素 defdelete(self,p):#删除p后面的结点

ifself.tailisp.next: self.tail=p p.next=p.next.next self.size-=1

#结点空间会被Python自动回收判断变量是否为None,应写pisNone,pisnotNone最好不要写p==None,p!=None单链表 defpopFront(self):#删除前端元素 ifself.headisNone: raise\ Exception("PoppingfrontforEmptylinklist.") else: self.head=self.head.next self.size-=1 ifself.size==0: self.head=self.tail=None defpushBack(self,data):#在尾部添加元素 ifself.size==0: self.pushFront(data) else: self.insert(self.tail,data)单链表 defpushFront(self,data):#在链表前端插入一个元素data nd=LinkList.Node(data,self.head) self.head=nd self.size+=1 ifself.tailisNone: self.tail=nd单链表 defclear(self): self.head=self.tail=None self.size=0 def__iter__(self): self.ptr=self.head returnself def__next__(self): ifself.ptrisNone: raiseStopIteration()#引发异常

else: data=self.ptr.data self.ptr=self.ptr.next returndata单链表linkLst=LinkList()linkLst.pushFront(0)linkLst.pushFront(1)foriinrange(2,5): linkLst.pushBack(i)forxinlinkLst: #>>1,0,2,3,4, print(x,end=",")上述实现方式没有实现“隐藏”,不是很好的实现方式带头结点的单链表带头结点的空单链表为避免链表为空是做特殊处理,可以为链表增加一个空闲头结点带头结点的非空单链表带头结点的单链表构造函数:classLinkList: def__init__(self): self.head=self.tail=LinkList.Node(None,None) self.size=0为避免链表为空是做特殊处理,可以为链表增加一个空闲头结点循环单链表'a'1813tailsizetailsize空表tail.next即头结点循环单链表在表首或表尾添加元素,以及删除表首元素,复杂度都是O(1)的。双向链表信息科学技术学院张掖平山湖大峡谷双向链表(双链表)每个结点有next指针指向后继,有prev指针指向前驱带头结点的双向链表classDoubleLinkList: class_Node: def__init__(self,data,prev=None,next=None): self.data,self.prev,self.next=data,prev,next双向链表插入结点在结点p后面插入新结点nd(1)执行nd=Node(data,None,None)新建结点nd双向链表插入结点在结点p后面插入新结点nd(2)执行nd.prev,nd.next=p,p.next双向链表插入结点在结点p后面插入新结点nd

(3)执行p.next.prev=nd双向链表插入结点在结点p后面插入新结点nd

(4)执行p.next=nd,插入完成双向链表删除结点删除结点p(1)初始状态,将要删除'a'结点双向链表删除结点删除结点p(2)执行p.prev.next=p.next双向链表删除结点删除结点p(3)执行p.nex.prev=p.prev,完成删除双向链表实现classDoubleLinkList: class_Node: def__init__(self,data,prev=None,next=None): self.data,self.prev,self.next=data,prev,next class_Iterator: def__init__(self,p): self.ptr=p defgetData(self): returnself.ptr.data defsetData(self,data): self.ptr.data=data def__next__(self): self.ptr=self.ptr.next ifself.ptrisNone: returnNone else: returnDoubleLinkList._Iterator(self.ptr)双向链表实现 defprev(self): self.ptr=self.ptr.prev returnDoubleLinkList._Iterator(self.ptr) def__init__(self): self._head=self._tail=\ DoubleLinkList._Node(None,None,None) self._size=0 def_insert(self,p,data): nd=DoubleLinkList._Node(data,p,p.next) ifself._tailisp:#新增的结点是新表尾

self._tail=nd ifp.next: p.next.prev=nd p.next=nd self._size+=1双向链表实现 def_delete(self,p):#删除结点p ifself._size==0orpisself._head: raiseException("Illegaldeleting.") else: p.prev.next=p.next ifp.next:#如果p有后继

p.next.prev=p.prev ifself._tailisp: self._tail=p.prev self._size-=1 defclear(self): self._tail=self._head self._head.next=self._head.prev=None self.size=0 defbegin(self): returnDoubleLinkList._Iterator(self._head.next) defend(self): returnNone双向链表实现 definsert(self,i,data):#在迭代器i指向的结点后面插入元素

self._insert(i.ptr,data) defdelete(self,i):#删除迭代器i指向的结点

self._delete(i.ptr) defpushFront(self,data):#在链表前端插入一个元素

self._insert(self._head,data) defpopFront(self): self._delete(self._head.next) defpushBack(self,data): self._insert(self._tail,data) defpopBack(self): self._delete(self._tail) def__iter__(self): self.ptr=self._head.next returnself双向链表实现 def__next__(self): ifself.ptrisNone: raiseStopIteration()#引发异常

else: data=self.ptr.data self.ptr=self.ptr.next returndata deffind(self,val):#查找元素val,找到返回迭代器,找不到返回None ptr=self._head.next whileptrisnotNone: ifptr.data==val: returnDoubleLinkList._Iterator(ptr) ptr=ptr.next returnself.end()双向链表实现 defprintList(self): ptr=self._head.next whileptrisnotNone: print(ptr.data,end=",") ptr=ptr.nextlinkLst=DoubleLinkList()foriinrange(5): linkLst.pushBack(i)i=linkLst.begin()whilei!=linkLst.end():#>>0,1,2,3,4, print(i.getD

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论