zoukankan      html  css  js  c++  java
  • 线性表 (单链表、循环链表-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('
    删除111(第一个元素):')
    linklist1.deleteData(111)
    linklist1.readList()
    print('
    删除5(末尾的元素)')
    linklist1.deleteData(5)
    linklist1.readList()
    print('
    删除第一个元素:')
    linklist1.deleteElem(1)
    linklist1.readList()
    print('
    删除末尾的元素')
    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()
  • 相关阅读:
    机器视觉行业分析
    lua sample code analysis
    My GPU info from "GPU Caps Viewer"
    网页hack程序编写
    debug redmine send email
    如何下载web资源
    看国内网络电视解决方案2
    看国内网络电视解决方案
    babel-polyfill使用与性能优化
    升级NGINX支持HTTP/2服务端推送
  • 原文地址:https://www.cnblogs.com/ybf-yyj/p/8574748.html
Copyright © 2011-2022 走看看