数据结构与算法----线性表

线性表数据结构相关的操作:

1、提供创建线性表的操作

2、信息检索操作(求表长、判空、表中查询指定数据。。。)

3、能改变表的内容(添加、删除、按指定条件添加删除。。。)

4、多个表的联合操作(合并、去重、排序。。。)

5、遍历


Class List: 

        List(self)        #表的构造,创建表

        is_empty(self)        #判表空

        len(self)        #求表长

        prepend(self, elem) #将新元素elem加入表中作为第一个元素

        append(self, elem)  #将新元素elem加入表中作为最后一个元素

        insert(self, elem, i)  #将新元素elem加入表中,作为第i个元素,其他元素的顺序不变

        del_first(self)   #删除表中的第一个元素

        del_last(self)    #删除表中的最后一个元素

        search(self, elem)  #查找元素elem在表中的位置,没有找到返回-1

        forall(self, op)  #对表中的每个元素做op操作


1、顺序表

实现方式:表中元素存放在一片足够大的连续存储区里,第一个元素存放在该区域的开始位置,其余元素依次存放。

Python中可以直接用list实现顺序表相关的操作。

2、链接表

(1)单链表

单链表的结点是一个二元组。其数据域elem保存着表元素的数据项,链接域next保存下一个结点的标识(链接)。

重点:

1、想要掌握一个单链表,就需要知道他的首结点,通过这个首结点就可以找到表的第一个元素,依次下去,能遍历整个表。

因此,需要一个变量来保存这个首结点的引用(链接),称之为表头变量或者表头指针。

2、为了能表示一个表的结束,需要给表的最后一个结点(表尾结点)的链接域这是一个不会作为对象标识的值,称为空链接,Python中用None标识,通过判断链接域=None,找到表尾结点。

3、类似于第2点,空表的判定就是根据表头结点的链接域为None来知道的(表没有元素就已经结束)。

定义一个简单的表结点类:

class Node:
    def __init__(self,value,next_ = None):
        self.value = value    #数据域
        self.next = next_   #链接域

'''
链接域命名为next_,是为了避免与Python标准函数next重名,这是个惯例
'''

定义单链表类及其相关操作:

class LinkList(object):
    
    #初始化单链表
    def __init__(self, node=None):   
        self.__head = node

    #遍历链表,求表长
    def __len__(self):
        cur = self.__head  #游标,用来遍历
        count = 0         #记录表长
        while cur:        #当cur==None,说明遍历完毕
            count += 1
            cur = cur.next
        return count

    #判空
    def is_empty(self):
        return self.__head == None  #若表头结点为空,则表空

    #添加元素
    def add(self,value):
        '''
        头插法:每次新增元素,插在表的开始位置
        1、先让新结点的next指向头结点
        2、再让头结点替换为新结点
        3、注意:必须顺序执行上述步骤,保证原链表不会丢失。     
        '''
        node = Node(value)
        node.next = self.__head
        self.__head = node

    #添加元素
    def append(self,value):
        '''
        尾插法
        '''
        node = Node(value)
        cur = self.__head
        if self.is_empty():
            self.__head = node
        else:
            while cur.next:
                cur = cur.next
            cur.next = node

    #插入元素到指定下标位置
    def insert(self, pos, value):
        if pos<=0:
            self.add(value)
        elif pos > len(self)-1:
            self.append(value)
        else:
            node = Node(value)
            prior = self.__head
            count = 0
            #在插入位置的前一个位置停下
            while count < (pos-1):
                prior = prior.next
                count += 1 
            #先将插入结点与结点后的结点连接,防止链表断掉,先连接后面的,在链接前面的
            node.next = prior.next
            prior.next=node

    #删除指定元素
    def remove(self, value):
        cur = self.__head
        prior = None
        while cur:
            if value == cur.value:
                #判断此结点是否为头结点
                if cur == self.__head:
                    self.__head = cur.next
                else:
                    prior.next = cur.next
                break
            #还没找到结点,有继续遍历
            else:
                prior = cur
                cur = cur.next

    #查找指定元素是否存在
    def search(self, value):
        cur = self.__head
        while cur:
            if value == cur.value:
                return True
            cur = cur.next
        return False

    #遍历打印整个表
    def traverse(self):
        cur = self.__head
        while cur:
            print(cur.value)  
            cur = cur.next 
单链表使用:

linklist=LinkList()                   #创建一个空链表,下面的各个功能测试在此基础上操作
#linklist=LinkList(Node(1))           #创建一个链表,第一个元素值为1
#***************************************************************************

print(linklist.__len__())             #得到链表的长度 0
print(linklist.is_empty())            #linklist是否为空表,True
#***************************************************************************

linklist.add(1)                       #add 头插法,每次插入链表的头部
linklist.add(2)
linklist.add(3)
print(linklist.traverse())            #结果:3 2 1
#***************************************************************************

linklist.append(1)                    #append 尾插法,每次插入链表的结尾
linklist.append(2)
linklist.append(3)
print(linklist.traverse())            #结果:1 2 3
#***************************************************************************

linklist.append(1)                    #append 尾插法,每次插入链表的结尾
linklist.append(2)
linklist.append(3)
linklist.insert(1,-4)
print(linklist.traverse())            #结果:1 -4 2 3  在下标为1的位置插入
#***************************************************************************

linklist.append(1)
linklist.append(2)
linklist.append(3)
linklist.append(2)
linklist.remove(2)                   
print(linklist.traverse())             #结果:1 3 删除元素2,注意:只删除了第一次出现2
#***************************************************************************

linklist.append(1)
linklist.append(2)
linklist.append(3)
print(linklist.search(2))              #结果:True 找到了存在元素值为2的结点

猜你喜欢

转载自blog.csdn.net/qq_31371757/article/details/83650920