順序表和鏈表

 

內存

計算機的做用

  對數據進行存儲和運算。首先咱們須要知道咱們目前使用的計算機都是二進制的計算機,就覺得着計算機只能夠存儲和運算二進制的數據。例以下載好的一部電影,該電影能夠存儲到計算機中,計算機中存儲的是基於二進制的電影數據,而後咱們能夠經過相關的視頻播放軟件結合相關的硬件對電影的二進制數據進行相關的運算操做,所產生的結果就是咱們能夠看到電影的畫面和聽到音頻的聲音。node

闡述計算機如何計算1+2的結果?

  - 闡述:簡單理解爲,首先能夠將1和2輸入到計算機中,而後計算機會將1和2轉換成二進制的數據進行數據存儲,而後經過加法器進行兩個二進制數值的計算並返回結果。編程

  - 分析:上述的闡述中提到,計算機首先須要存儲1和2這兩個數值,那麼計算機如何進行數據的存儲呢?那麼毫無疑問,計算機能夠將數據直接存儲到內存中。數據結構

  - 變量:咱們在編程世界中,能夠將某個數值直接賦值給一個變量,可是最終數值會被存儲到計算機的內存中,所以咱們能夠理解爲,變量表示的就是計算機中進行數據存儲的某一塊內存。app

  - 如何形象化的理解計算機的內存?spa

    - 舉例:將計算機的內存空間映射到咱們現實生活中的話,內存就比如是咱們在現實生活中三維立體的空間。生活在北京的北漂們,幾乎都居住的是一個獨立的公寓或者合租在一個幾居室的某一個房間中,那麼北漂甲就比如是數據,而他所居住的房間則就是存儲數據的一塊內存空間。code

    - 分析:從上述案例中,咱們能夠得知北漂甲居住的房間會有兩個基本的屬性,其一就是房間空間的大小,其二就是房間的一個位置標識(門牌號)。那麼計算機中存儲數據的內存空間也會有這兩個最基本的屬性:內存空間大小和內存空間的地址。內存空間的大小能夠表示該空間能夠存儲數據值的大小範圍,內存空間的地址(用十六進制數值表示)能夠用來經過尋址定位、查找到該內存空間中所存儲的數據值。視頻

      - 如何理解 a = 10 這條賦值語句對應的內存圖呢?對象

  - 引用:當一個變量中存儲的是某一塊內存空間的地址,則該變量便可成爲那塊內存空間的引用。a=10,a就是10所在內存空間的一個引用。blog

  - 指向:當一個變量中存儲了一塊內存空間的地址,則稱該變量(引用)指向了那塊內存。ip

  - 不一樣類型數據佔用內存空間的大小:整形(4字節),浮點型(8字節),字符型(1字節)

順序表

集合中存儲的元素是有順序的。順序表的結構能夠分爲兩種形式:單數據類型和多數據類型。

單數據類型

在內存中如何存儲 int a = 10,20,30,如何取得每個數據值呢?

單數據類型順序表的內存圖(內存連續開啓)

  • 對應的內存空間是連續開闢的
  • 順序表的變量/引用存的(指向的)是內存空間的首地址
  • 順序表的弊端:順序表的結構須要預先知道數據大小來申請連續的存儲空間,而在進行擴充時又須要進行數據的搬遷。
  • Python中的 list 和 tuple 兩種類型採用了順序表的實現技術。

 鏈表

相對於順序表,鏈表結構能夠充分利用計算機內存空間,實現靈活的內存動態管理且進行擴充時不須要進行數據搬遷

單向鏈表

單向鏈表也叫單鏈表,是表中最簡單的一種形式,它的每一個節點包含兩個域,一個信息域(元素域)和一個連接域。這個連接指向鏈表中的下一個節點,而最後一個節點的連接域則指向一個空值。

  • 表中元素elem用來存放具體的數據。
  • 連接域next用來存放下一個節點的位置。
  • 變量p指向鏈表的頭節點(首節點)的位置,從p出發能找到表中的任意節點

 單向鏈表的抽象數據類型定義

  •  is_empty():鏈表是否爲空
  •  length():鏈表長度
  •  travel():遍歷整個鏈表
  •  add(item):鏈表頭部添加元素
  •  append(item):鏈表尾部添加元素
  •  insert(pos, item):指定位置添加元素
  • remove(item):刪除節點
  •  search(item):查找節點是否存在

 代碼實現

#封裝節點數據結構
class Node():
    def __init__(self,item):
        #存放鏈表中的元素
        self.item = item
        #存放下一個節點
        self.next = None
    def __str__(self):
        return self.item

#封裝鏈表數據結構
class Link():
    #初始化一個空列表
    def __init__(self):
        #該屬性永遠指向第一個節點
        self._head = None
    def isEmpty(self):
        return self._head == None
    def add(self,item):
        #建立一個新的節點對象
        node = Node(item)
        #將節點插入到鏈表的頭部,指向舊節點
        node.next =self._head
        #指向新節點
        self._head = node
    def travel(self):
        #cur等於第一個節點
        cur = self._head
        #若是cur不等於空則繼續循環
        while cur:
            print(cur.item)
            #此時cur等於下一個節點地址
            cur = cur.next
    def length(self):
        count = 0
        cur =self._head
        while cur:
            count +=1
            cur = cur.next
        return count
    def append(self,item):
        cur = self._head
        #pre 表示cur前面節點的地址
        pre = None
        node = Node(item)
        #若是鏈表爲空則新節點做爲鏈表中的第一個節點
        if self._head is None:
            self._head =node
            return
        #鏈表非空對應的插入狀況
        while cur:
            pre = cur
            cur = cur.next
        pre.next = node
    def insert(self,pos,item):
        cur = self._head
        pre = None
        node = Node(item)
        length = self.length()
        #對特殊狀況的處理
        if pos >length:
            self.append(item)
            return
        if pos <=0:
            self.add(item)
            return
        #正常處理
        for i in range(pos):
            pre = cur
            cur = cur.next
        pre.next = node
        node.next = cur
    def remove(self,item):
        cur = self._head
        pre = None
        #若是刪除的是第一個節點
        if item == cur.item:
            self._head = cur.next
            return
        while cur:
            if cur.item == item:
                pre.next = cur.next
                return
            else:
                pre = cur
                cur = cur.next
    def search(self,item):
        find = False
        cur = self._head
        while cur:
            if cur.item == item:
                find = True
                break
            cur = cur.next
        return find
link = Link()
link.add(10)
link.add("aa")
link.append('wl')
link.insert(11,666)
link.travel()
print(link.length())
相關文章
相關標籤/搜索