线性表 (单链表、循环链表-python实现)

一、线性表

  线性表的定义:

    线性表是具有相同数据类型的有限数据的序列。

  线性表的特点:

    出了第一个元素外,每个元素有且仅有一个直接前驱,除最后一个元素外有且只有一个后继。

    线性表是一种逻辑结构,表示元素之间的一一的相邻关系,顺序表和链表是指存储结构,两者属于不同的概念。

  线性表的顺序表示:

    线性表的顺序存储即数组的动态、静态分配,特点是可以随机访问。

  线性表的链式表示:

    线性表的链式存储即单链表、双连表、循环单链表以及循环双连表,特点是随机插入,不可随机访问。

    单链表的实现(python):

#定义每个节点
class Node:
    def __init__(self,data):
        self.data=data
        self.next=None

class linkList:
    #初始化头结点
    def __init__(self,n):
        self.head=Node(None)
        self.n=n
    #头插法建立链表
    def listCreateForward(self):
        if self.n==0:
            return False
        else:
            temp=self.head
            for i in range(1,self.n+1):
                print('请输入第{0}个节点:'.format(i))
                num = input()
                node = Node(num)
                node.next=temp.next
                temp.next = node
    #尾插法建立链表
    def listCreateBackward(self):
        if self.n==0:
            return False
        else:
            temp=self.head
            for i in range(1,self.n+1):
                print('请输入第{0}个节点:'.format(i))
                num = input()
                node = Node(num)
                temp.next=node
                temp=node
    #读取链表
    def readList(self):
        if self.n==0:
            print("空链表!")
        else:
            temp = self.head
            while temp.next!=None:
                temp = temp.next
                print(temp.data,end=' ')
    #链表长度
    def Length(self):
        i=0
        temp=self.head
        while temp.next!=None:
            temp=temp.next
            i+=1
        return i
    #按值查找
    def locateElem(self,num):
        i = 0
        temp = self.head
        while temp.next != None:
            temp = temp.next
            i += 1
            if int(temp.data)==num:
                return i
        return None
    #按位置查找
    def getElem(self,j):
        i = 0
        temp = self.head
        while temp.next != None:
            temp = temp.next
            i += 1
            if int(j)==i:
                return temp.data
        return None
    #按位置插入数字
    def listInsert(self,j,num):
        if int(j)<0:
            return None
        elif self.Length()<j:
            return None
        else:
            i = 0
            temp = self.head
            while temp.next != None:
                i += 1
                if int(j) == i:
                    node=Node(num)
                    node.next=temp.next
                    temp.next=node
                temp = temp.next
    #删除特定元素
    def deleteData(self,num):
        temp=self.head
        while True:
            if temp.next==None:
                break
            #当这个节点是尾节点时
            if int(temp.next.data)==num and temp.next.next==None:
                temp.next=None
                break
            elif int(temp.next.data)==num:
                temp.next=temp.next.next
            temp=temp.next
    #删除特定位置的元素
    def deleteElem(self,j):
        if j==1:
            self.head.next=self.head.next.next
        elif j==self.Length() :
            temp=self.head.next
            while True:
                if temp.next.next==None:
                    temp.next=None
                    break
                temp=temp.next
        elif j<self.Length():
            i=2
            temp=self.head.next
            while True:
                if i==j:
                    temp.next=temp.next.next
        else:
            print('erro!!!!')
            return None

linklist1=linkList(5)
linklist1.listCreateBackward()
linklist1.readList()
length=linklist1.Length()
print('length={0}'.format(length))
locate=linklist1.locateElem(5)
print('5在位置{0}'.format(locate))
data=linklist1.getElem(3)
print('第3个位置是{0}'.format(data))
linklist1.listInsert(1,111)
linklist1.readList()
print('\n删除111(第一个元素):')
linklist1.deleteData(111)
linklist1.readList()
print('\n删除5(末尾的元素)')
linklist1.deleteData(5)
linklist1.readList()
print('\n删除第一个元素:')
linklist1.deleteElem(1)
linklist1.readList()
print('\n删除末尾的元素')
linklist1.deleteElem(3)
linklist1.readList()



结果:
请输入第1个节点:
1
请输入第2个节点:
2
请输入第3个节点:
3
请输入第4个节点:
4
请输入第5个节点:
5
1 2 3 4 5 length=5
5在位置5
第3个位置是3
111 1 2 3 4 5 
删除111(第一个元素):
1 2 3 4 5 
删除5(末尾的元素)
1 2 3 4 
删除第一个元素:
2 3 4 
删除末尾的元素
2 3 

    循环链表的实现(python):其它部分与单链表相似

#定义节点
class Node:
    def __init__(self,data):
        self.data=data
        self.next=None

class circleList:
    # 初始化头结点
    def __init__(self,n):
        self.head=Node(None)
        self.head.next=self.head
        self.n = n

    # 头插法建立链表-
    def listCreateForward(self):
        if self.n==0:
            return False
        else:
            temp=self.head
            for i in range(1,self.n+1):
                print('请输入第{0}个节点:'.format(i))
                num = input()
                node = Node(num)
                node.next=temp.next
                temp.next = node
          temp=temp.next
# 尾插法建立链表 def listCreateBackward(self): if self.n==0: return False else: temp=self.head for i in range(1,self.n+1): print('请输入第{0}个节点:'.format(i)) num = input() node = Node(num) temp.next=node temp=node temp.next = self.head #读取循环链表 def readList(self): if self.n==0: print("空链表!") else: temp = self.head while temp.next!=self.head: temp = temp.next print(temp.data,end=' ') linklist1=circleList(5) linklist1.listCreateForward() linklist1.readList() linklist1=circleList(5) linklist1.listCreateBackward() linklist1.readList()

 

posted @ 2018-03-15 17:18  ybf&yyj  阅读(850)  评论(0编辑  收藏  举报