本文所采用的数据结构模板为 《数据结构教程》C语言版,李春葆、尹为民等著。

改篇所涉及到的是 串 的链式存储结构。

用Python仿照C语言来实现。

文章转载请注明:  Python 数据结构 之 串 的链式存储结构

代码地址:

https://github.com/WenkeZhou/PythonDataStructure/blob/master/struct/String/LKString.py

串 的链式存储结构:

# !/usr/bin/env python
# -*- coding: utf-8 -*-__author__ = 'MrHero'class Node(object):# 节点def __init__(self, data=None):self.data = dataself.next = Noneclass LKString(object):"""串的链式存储结构"""def __init__(self):self.L = Node()self.next = Noneself.length = 0def assign(self, cstr):# 将字符串cstr 赋值给串s, 即生成一个值等于cstr的串self, 采用尾插法p = self.Lfor i, item in enumerate(cstr):tmp = Node(item)p.next = tmpp = tmpself.length += 1p.next = Nonedef copy(self, lkstr):# 将串 lkstr 的值复制给selfr = self.Lp = lkstr.L.nextj = lkstr.lengthwhile j >= 0 and p:tmp = Node(p.data)r.next = tmpr = tmpp = p.nextself.length += 1r.next = Nonedef show_str(self):# 输出字符串,将字符串重头部到尾部显示出来p = self.Lj = self.lengthwhile j >= 0 and p.next:p = p.nextprint p.data,j -= 1print ""def equal(self, lkstr):# 判断两个串是否相等if self.length != lkstr.length:return Falsej = self.lengthr = self.L.nextp = lkstr.L.nextwhile j > 0:if r.data != p.data:return Falseelse:j -= 1r = r.nextp = p.nextreturn Truedef get_length(self):return self.lengthdef contact(self, lkstr):# 返回由两个串s 和 t链接在一起形成的新串,采用尾插法result = LKString()r = result.L# 将self插入到result中len1 = self.lengthp = self.L.nextwhile len1 > 0 and p:tmp = Node(p.data)r.next = tmpr = tmplen1 -= 1result.length += 1p = p.next# 将lkstr插入到result中q = lkstr.L.nextlen2 = lkstr.lengthwhile len2 > 0 and q:tmp = Node(q.data)r.next = tmpr = tmplen2 -= 1result.length += 1q = q.nextr.next = Nonereturn resultdef substr(self, i, j):# 串self, 将第 i 个字符开始的 j个字符串生成以个子串result = LKString()if i < 0 or i > self.length or i + j -1 > self.length:raise IndexError("Index is out of range.")current = self.Lr = result.Lfor _ in range(i-1):current = current.nextfor _ in range(j):current = current.nexttmp = Node(current.data)r.next = tmpr = tmpresult.length += 1return resultdef insstr(self, i, lkstr):# 将串lkstr 插入到串self的第 i 个字符位置if i <= 0 or i > self.length:raise IndexError("Index is out!")result = LKString()r = result.Lcurrent = self.L.nextfor _ in range(i-1):tmp = Node(current.data)r.next = tmpr = tmpresult.length += 1current = current.nexttail = currentlkstr_cur = lkstr.L.nextlkstr_len = lkstr.lengthwhile lkstr_len > 0 and lkstr_cur:tmp = Node(lkstr_cur.data)r.next = tmpr = tmpresult.length += 1lkstr_cur = lkstr_cur.nextwhile tail:tmp = Node(tail.data)r.next = tmpr = tmpresult.length += 1tail = tail.nextr.next = Nonereturn resultdef delstr(self, i, j):# 从串s中删去第i个字符开始的长度为j 的字串, 并返回产生的新串if i <= 0 or i > self.length:raise IndexError("Index is out!")result = LKString()r = result.Lcurrent = self.L.nextfor _ in range(i-1):tmp = Node(current.data)r.next = tmpr = tmpresult.length += 1current = current.nextfor _ in range(j):current = current.nextwhile current:tmp = Node(current.data)r.next = tmpr = tmpresult.length += 1current = current.nextr.next = Nonereturn resultdef repstr(self, i, j, lkstr):if i <= 0 or i > self.length or i + j - 1 > self.length:raise IndexError("Index is out of range!")result = LKString()r = result.Lcurrent = self.L.nextfor _ in range(i-1):tmp = Node(current.data)r.next = tmpr = tmpresult.length += 1current = current.nextfor _ in range(j):current = current.nextlkstr_cur = lkstr.L.nextwhile lkstr_cur:tmp = Node(lkstr_cur.data)r.next = tmpr = tmpresult.length += 1lkstr_cur = lkstr_cur.nextwhile current:tmp = Node(current.data)r.next = tmpr = tmpresult.length += 1current = current.nextr.next = Nonereturn resultif __name__ == '__main__':ss = "abcdefghijklmn"test1 = LKString()test1.assign(ss)test1.show_str()test2 = LKString()test2.copy(test1)test2.show_str()ss2 = "abcde123"test3 = LKString()test3.assign(ss2)print test2.equal(test3)test4 = test3.contact(test2)test4.show_str()test5 = test4.substr(2, 5)test5.show_str()ss3 = "!!!!"tests = LKString()tests.assign(ss3)ss4 = "1234567890"tests2 = LKString()tests2.assign(ss4)test6 = test4.insstr(3, test5)test6.show_str()test7 = test6.delstr(3, 3)test7.show_str()test8 = tests2.repstr(3, 5, tests)test8.show_str()

文章转载请注明:  Python 数据结构 之 串 的链式存储结构

Python 数据结构 之 串 的链式存储结构相关推荐

  1. 数据结构-线性表(链式存储结构)

    线性表(链式存储结构) 特点: 用一组任意的存储单元存储线性表的数据结构,这组存储单元可以是连续的,也可以是不连续的. 对数据结构ai来说,除了存储其本身的信息之外,还需存储一个指示其后继的信息(即直 ...

  2. (数据结构)二叉树的链式存储结构

    二叉树的顺序存储的缺点 因为并不是每个二叉树都是完全二叉树,普通二叉树使用顺序表存储或多或少会存在空间浪费的现象 图 1 普通二叉树的转化 如上图 1,普通二叉树里只有二个元素,最好的存储方式当然是开 ...

  3. 数据结构与算法4——链式存储结构

    前面所讲的线性表的顺序存储结构,它最大的缺点就是插入和删除时需要移动大量元素,这显然就需要耗费时间. 线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以在内存中未被 ...

  4. BJFU_数据结构习题_218基于链式存储结构的图书信息表的最贵图书的查找

    欢迎登录北京林业大学OJ系统 http://www.bjfuacm.com 218基于链式存储结构的图书信息表的最贵图书的查找 描述 定义一个包含图书信息(书号.书名.价格)的链表,读入相应的图书数据 ...

  5. BJFU_数据结构习题_219基于链式存储结构的图书信息表的最爱图书的查找

    欢迎登录北京林业大学OJ系统 http://www.bjfuacm.com 219基于链式存储结构的图书信息表的最爱图书的查找 描述 定义一个包含图书信息(书号.书名.价格)的链表,读入相应的图书数据 ...

  6. BJFU_数据结构习题_222基于链式存储结构的图书信息表的旧图书的出库

    欢迎登录北京林业大学OJ系统 http://www.bjfuacm.com 222基于链式存储结构的图书信息表的旧图书的出库 描述 定义一个包含图书信息(书号.书名.价格)的链表,读入相应的图书数据来 ...

  7. php数据结构链表代码,数据结构之线性表——链式存储结构之单链表(php代码实现)...

    /** * * 1. 类LNode用作创建单链表时,生成新的节点. * 2. 类SingleLinkList用于创建单链表以及对单链表的一些操作方法(实例化此类就相当于创建了一个空链表) * 3. C ...

  8. 数据结构之线性表——链式存储结构之单链表(php代码实现)

    <?php /**** 1. 类LNode用作创建单链表时,生成新的节点.* 2. 类SingleLinkList用于创建单链表以及对单链表的一些操作方法(实例化此类就相当于创建了一个空链表)* ...

  9. 串--串的定义,顺序、链式存储结构,BF、KMP模式匹配算法(C语言描述)

    此文章仅作为自己学习过程中的记录和总结,同时会有意地去用英文来做笔记,一些术语的英译不太准确,内容如有错漏也请多指教,谢谢! 一.串(String)的定义: 串(String):由零个或多个字符组成的 ...

最新文章

  1. Navicat Premium 数据库设计器和报表有什么作用
  2. 2-2 Time类的定义_JAVA
  3. sap.m.SplitApp
  4. js 将内部函数变成全局函数_js中三种作用域详解(全局,函数,块级)
  5. 汽车上的一些名词缩写解释
  6. 如何使用alt键+数字键盘上的数字键打出特殊符号
  7. 一万个“无序”数查找两个重复数,在O(N)的基础上再快一点
  8. 计算数据个数mysql thinkphp_ThinkPHP5 (mySQL) 统计各个时间段内的订单量
  9. Lync Server 2010迁移至Lync Server 2013部署系列 Part14:A/V服务器目录迁移
  10. BIM族库下载——Revit家用电器族库
  11. 如何利用echarts制作地图
  12. YUI:globle object
  13. vue.cli项目封装全局axios,封装请求,封装公共的api和调用请求的全过程
  14. 信息学奥赛一本通C++语言-----1142:单词的长度
  15. 在淘宝做前端的这三年 — 第三年
  16. 关于video标签,禁止点击播放时自动全屏,和video出现诡异窗口重叠
  17. SAP物料主数据修改利润中心
  18. 分享6个2020年对我帮助很大的软件
  19. 搭建Win7调试ACPI的环境
  20. 如何解决chrome一打开就是360搜索页面(亲测有效)

热门文章

  1. ShaderJoy —— 烟花爆炸特效【GLSL】
  2. CSS笔记(美化超链接)
  3. 今天是世界读书日,包邮赠送几本技术书 !
  4. Mysql 计算两个时间差函数
  5. 为了反击爬虫,前端工程师的脑洞可以有多大?
  6. T7983 大芳的逆行板载
  7. 信号的基本概念及分类
  8. Nodejs发送https Post请求时出现socket hang up错误的解决办法汇总
  9. 策略梯度方法介绍——带基线的REINFORCE
  10. 《卸甲笔记》-单行函数对比之二