Python 数据结构 之 串 的链式存储结构

来源:互联网 发布:js权威指南第六版 pdf 编辑:程序博客网 时间:2024/06/04 22:37

本文所采用的数据结构模板为 《数据结构教程》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 = data        self.next = Noneclass LKString(object):    """    串的链式存储结构    """    def __init__(self):        self.L = Node()        self.next = None        self.length = 0    def assign(self, cstr):        # 将字符串cstr 赋值给串s, 即生成一个值等于cstr的串self, 采用尾插法        p = self.L        for i, item in enumerate(cstr):            tmp = Node(item)            p.next = tmp            p = tmp            self.length += 1        p.next = None    def copy(self, lkstr):        # 将串 lkstr 的值复制给self        r = self.L        p = lkstr.L.next        j = lkstr.length        while j >= 0 and p:            tmp = Node(p.data)            r.next = tmp            r = tmp            p = p.next            self.length += 1        r.next = None    def show_str(self):        # 输出字符串,将字符串重头部到尾部显示出来        p = self.L        j = self.length        while j >= 0 and p.next:            p = p.next            print p.data,            j -= 1        print ""    def equal(self, lkstr):        # 判断两个串是否相等        if self.length != lkstr.length:            return False        j = self.length        r = self.L.next        p = lkstr.L.next        while j > 0:            if r.data != p.data:                return False            else:                j -= 1                r = r.next                p = p.next        return True    def get_length(self):        return self.length    def contact(self, lkstr):        # 返回由两个串s 和 t链接在一起形成的新串,采用尾插法        result = LKString()        r = result.L        # 将self插入到result中        len1 = self.length        p = self.L.next        while len1 > 0 and p:            tmp = Node(p.data)            r.next = tmp            r = tmp            len1 -= 1            result.length += 1            p = p.next        # 将lkstr插入到result中        q = lkstr.L.next        len2 = lkstr.length        while len2 > 0 and q:            tmp = Node(q.data)            r.next = tmp            r = tmp            len2 -= 1            result.length += 1            q = q.next        r.next = None        return result    def 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.L        r = result.L        for _ in range(i-1):            current = current.next        for _ in range(j):            current = current.next            tmp = Node(current.data)            r.next = tmp            r = tmp            result.length += 1        return result    def insstr(self, i, lkstr):        # 将串lkstr 插入到串self的第 i 个字符位置        if i <= 0 or i > self.length:            raise IndexError("Index is out!")        result = LKString()        r = result.L        current = self.L.next        for _ in range(i-1):            tmp = Node(current.data)            r.next = tmp            r = tmp            result.length += 1            current = current.next        tail = current        lkstr_cur = lkstr.L.next        lkstr_len = lkstr.length        while lkstr_len > 0 and lkstr_cur:            tmp = Node(lkstr_cur.data)            r.next = tmp            r = tmp            result.length += 1            lkstr_cur = lkstr_cur.next        while tail:            tmp = Node(tail.data)            r.next = tmp            r = tmp            result.length += 1            tail = tail.next        r.next = None        return result    def delstr(self, i, j):        # 从串s中删去第i个字符开始的长度为j 的字串, 并返回产生的新串        if i <= 0 or i > self.length:            raise IndexError("Index is out!")        result = LKString()        r = result.L        current = self.L.next        for _ in range(i-1):            tmp = Node(current.data)            r.next = tmp            r = tmp            result.length += 1            current = current.next        for _ in range(j):            current = current.next        while current:            tmp = Node(current.data)            r.next = tmp            r = tmp            result.length += 1            current = current.next        r.next = None        return result    def 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.L        current = self.L.next        for _ in range(i-1):            tmp = Node(current.data)            r.next = tmp            r = tmp            result.length += 1            current = current.next        for _ in range(j):            current = current.next        lkstr_cur = lkstr.L.next        while lkstr_cur:            tmp = Node(lkstr_cur.data)            r.next = tmp            r = tmp            result.length += 1            lkstr_cur = lkstr_cur.next        while current:            tmp = Node(current.data)            r.next = tmp            r = tmp            result.length += 1            current = current.next        r.next = None        return 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 数据结构 之 串 的链式存储结构

0 0