- 1、本文档共81页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
线性表的逻辑及存储结构
数据结构与算法 ---第四讲 北方民族大学 计算机科学与工程学院 王伦津 研究员 4.3 线性表的链式存储结构 顺序结构的缺点: 第一,当进行插入与删除时,需移动元素。如果线性表很大,移动量就非常大。 第二,由于它要求一片连续的存贮区域,所以存贮要求较高,不能利用小块存贮区。 线性表采用链式存贮结构时称为线性链表,它的具体存储方法也可能有多种,我们这里先介绍以后继或前驱地址为链的存储方法,这样的链表也称单链表。具体的存贮映射方法是 a2 an ^ head len a1 图 4?2 单链表基本形式 表头 TLinearListLink 链结点 TLinkNode … … 对线性表中每个元素ai,为它分配一块存贮区。有两种分配方式,一是设计者对一片足够大的存贮区自行管理(分配与释放),这种方式称为静态方法。相应的链式结构称为静态链表。另一种方式是利用高级语言的动态存贮管理机制(如PASCAL中的new、dispose、C/C++中的malloc、free、new、delete等)。 在这种方式中,对存贮空间的使用不需涉及存贮管理的实现问题。在本课程中,以后一种方式为主。 每个元素的存贮区分为两大部分: 其中,内容部分用于存放元素本身的信息;“前驱/后继地址”部分存放该元素的前驱或后继的存贮地址。这里我们一般使用后继地址。 对表中最后一个结点,令其“后继地址”为空,作为链表的结束标志 为了能方便地访问链表,设置链表头结点,记下链表中首结点的地址(有时也要记尾结点地址)和链表中当前结点个数等有关链表的信息。这种头结点作为链表的描述结点,是对链表的整体的描述,是整个链表的代表,故它的类型可做为线性表的类型。 一个典型的单链表的形式如图 4?2所示 内容 前驱/后继地址 线性链表的面向对象描述 (一)元素与关系描述 下面是链表中结点的C++描述,它代表着线性表的元素和关系。 template class TElem //上面是模板声明,表明TElem是一个可变(调)类型,在使用TLinkNode时动态决定 struct TLinkNode { TElem info; //info的类型是可变的类模板TElem TLinkNode *next; //注: 这里的TLinkNode后可以省略TElem }; (二)链表对象描述 链表对象应该是前面介绍的线性表抽象类TLinearList0的派生 类,代表着整个线性链表。它需要记录首结点的地址和链表中 当前结点个数等有关链表的信息,并针对其设置有关操作 template class TElem class TLinearListLink : public TLinearList0TElem { protected: TLinkNodeTElem *head; TLinkNodeTElem *lastVisited; long lastVisitedIndex; TElem buffElem; void ReleaseAll(); public: TLinearListLink(void); ~TLinearListLink(void); virtual TElem Get(long idx); virtual TElem *GetAddress(long idx); virtual TElem *Set(long idx, TElem elem); virtual long CountElem(TElem elem); virtual TElem *Prior(long idx); virtual TElem *Next(long idx); virtual long Locate(TElem elem, long sn=1); virtual long Locate(TElem elem, long *foundElemIndex=NULL); virtual long LocateFirst(TElem elem); virtual long LocateNext(TElem elem); virtual TElem *Insert(TElem elem, long sn=1); virtual TElem *Delete(long sn=1); virtual long Delete(TIndexSelector sel, TElem *elemDeleted=NULL); virtual long DeleteByIndex(long *idxTobe
文档评论(0)