### 內存
- 計算機的作用
- 存儲和運算二進制的數據。
內存
-
計算機的作用
- 存儲和運算二進制的數據。
-
問題:計算機如何計算1+2?
- 現將1和2(0010)進行存儲
- 計算機會使用加法寄存器進行加法運算
-
變量的概念
- 引用==變量。變量就是我們為存儲數據單獨開辟的內存空間。
-
形象化理解內存(內存的大小和地址)
- 開辟好的內存空間會有兩個默認的屬性:大小,地址
- 大小:衡量該塊內存能夠存儲數據的大小
- bit(位):只可以存放一位二進制的數
- byte(字節):8bit
- kb:1024byte
- 10Mb:1010241024*8
- 作用:可以衡量該內存存儲數據大小的范圍
- 地址:16進制的數表示
- 作用:定位內存空間的位置
- 變量/引用:內存空間的地址
-
理解a=10的內存圖(指向)
- 如果一個變量表示的是某一塊內存空間的地址,則該變量指向該塊內存空間。
- 如果一個變量指向了某一塊內存空間,則該變量就可以代替/表示這塊內存中存儲的數值
- 如果一個變量表示的是某一塊內存空間的地址,則該變量指向該塊內存空間。
-
不同數據占用內存空間的大小
- 整數:4字節
- 浮點型:
- float:4字節
- double:8字節
- 字符型(char):1字節
### 順序表
- 集合中存儲的元素是有順序的,順序表的結構可以分為兩種形式:單數據類型和多數據類型。
- python中的列表和元組就屬於多數據類型的順序表


順序表
-
集合中存儲的元素是有順序的,順序表的結構可以分為兩種形式:單數據類型和多數據類型。
-
python中的列表和元組就屬於多數據類型的順序表
-
單數據類型順序表的內存圖(內存連續開啟)
-
多數據類型順序表的內存圖(內存非連續開辟)
-
順序表的弊端:順序表的結構需要預先知道數據大小來申請連續的存儲空間,而在進行擴充時又需要進行數據的搬遷。
鏈表:相對於順序表,鏈表結構可以充分利用計算機內存空間,實現靈活的內存動態管理且進行擴充時不需要進行數據搬遷。
- 鏈表(Linked list)是一種常見的基礎數據結構,是一種線性表,但是不像順序表一樣連續存儲數據,而是每一個結點(數據存儲單元)里存放下一個結點的信息(即地址)
. 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 #為存儲下一個節點的地址
class Link():
#構建一個空鏈表
def __init__(self):
#_head要指向第一個節點,如果沒有節點則指向None
self._head = None
def add(self,item):
#1.創建一個新節點
node = Node(item)
node.next = self._head
self._head = node
def travel(self):
# print(self._head.item)
# print(self._head.next.item)
# print(self._head.next.next.item)
#在非空的鏈表中head永遠要指向第一個節點的地址,永遠不要修改它的指向,否則會造成數據的丟失
cur = self._head
while cur:
print(cur.item)
cur = cur.next
def is_empty(self):
return self._head == None
def length(self):
cur = self._head
count = 0#記錄節點的個數
while cur:
count += 1
cur = cur.next
return count
def append(self,item):
node = Node(item)
cur = self._head #當前節點
pre = None #指向cur的前一個節點
if self._head == None:#如果鏈表為空則需要單獨處理
self._head = node
return
while cur:
pre = cur
cur = cur.next#循環結束之后cur指向了None,pre指向了最后一個節點
pre.next = node
def search(self,item):
cur = self._head
find = False
while cur:
if cur.item == item:
find = True
break
else:
cur = cur.next
return find
def insert(self,pos,item):
node = Node(item)
cur = self._head
pre = None
#如果插入的位置大於了鏈表的長度,則默認插入到尾部
if pos > self.length()-1:
self.append(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 = cur
cur = cur.next
else:
break
pre.next = cur.next
link = Link()
link.append(1)
link.append(2)
link.append(3)
link.append(4)
link.append(5)
link.remove(4)
link.travel()
1
2
3
5
