資料結構概述
定義我們如何把現實中大量而複雜的問題以特定的資料型別和特定的儲存結構
儲存到主儲存器(記憶體)中,以及在此基礎上為實現某個功能(比如查詢摸個
元素,刪除某個元素,對所有元素進行排序)而執行的相應操作,這個相應
的操作也叫演算法
資料結構 = 個體 + 個體的關係
演算法 = 對儲存資料的操作
演算法解題的方法和步驟
衡量演算法的標準
1、時間複雜度
大概程式要執行的次數,而非執行時間
2、空間複雜度
演算法執行過程中大概所占用的最大記憶體
3、難易程度
4、健壯性
資料結構的地位
資料結構是軟體中最核心的課程
程式 = 資料的儲存 + 資料的操作 +可以被計算機執行的語言
預備知識
指標指標的重要性
指標是c語言的靈魂 定義
位址 位址就是記憶體單元的編號
從0開始的非負整數
範圍:0-ffffffff[0-4g-1] 指標
指標就是位址 位址就是指標
指標變數是存放記憶體單元位址的變數
指標的本質是乙個操作受限的非負整數
分類1、基本型別的指標
2、指標和陣列的關係
結構體為什麼會出現結構體
為了表示一些複雜的資料,而普通的基本型別變數是無法滿足要求
什麼叫結構體
結構體是使用者根據實際需要自定義的復合資料型別
如何使用結構體
struct student st =;
struct student * pst = &st;
1、st.sid
2、pst->sid
pst所指向的結構體變數中的sid這個成員
注意事項
結構體變數不能加減乘除,但可以相互賦值
普通結構體變數和結構體指標變數作為函式傳參的問題
動態記憶體的分配和釋放
模組一:線性結構[把所有的節點用一根直線穿起來]
連續儲存[陣列]
1、什麼叫陣列
元素型別相同,大小相等
2、陣列的優缺點
訪問速度快
插入刪除元素慢
空間通常是有限的
需要大塊連續的記憶體塊
插入刪除元素的效率極低
離散儲存[鍊錶]
定義:n個節點離散分配
彼此通過指標相連
每個節點只有乙個前驅節點,每個節點只有乙個後續結點
首節點沒有前驅節點,尾節點沒有後續節點
專業術語:
首節點:第乙個有效節點
尾節點:最後乙個有效節點
頭結點:
頭結點的資料型別和首節點型別一樣
第乙個有效節點之前的那個節點
頭節點並不存放有效資料
加頭節點的目的主要是為了方便對鍊錶的操作
頭指標:指向頭結點的指標變數
尾指標:指向尾節點的指標變數
確定乙個鍊錶需要幾個引數:
只需要乙個引數:頭指標
因為我們通過頭指標可以推斷出鍊錶的其他所有資訊
分類:單鏈表
雙鏈表:每個節點有兩個指標域
迴圈鍊錶:能通過任何乙個節點找到其他所有的結點
非迴圈鍊錶
演算法:
遍歷查詢
清空銷毀
求長度排序
刪除節點
插入節點
狹義的演算法是與資料的儲存方式密切相關
廣義的演算法是與資料的儲存方式無關的
泛型:利用某種技術達到的效果就是:不同的儲存方式,執行的操作都是一樣的
鍊錶的優缺點:
插入和刪除快
訪問元素速度慢
訪問容量無限
線性結構的兩種應用之一 棧
定義:一種可以實現「先進後出」的儲存結構,棧類似於箱子
分類:靜態棧(陣列)、動態棧(鏈式)
演算法:出棧、壓棧
應用:函式呼叫、中斷、表示式求值、記憶體分陪、緩衝處理、迷宮
線性結構的兩種應用之二 佇列
定義:一種可以實現「先進先出」的儲存結構
分類:鏈式佇列(鍊錶)、靜態佇列(陣列,通常都是迴圈佇列)
迴圈佇列的講解:
1、靜態佇列為什麼必須是迴圈佇列
2、迴圈佇列需要幾個引數來確定及其含義
需要兩個引數 front rear
兩個引數不同場合有不同含義
1)佇列初始化 front和rear的值都是零
2)佇列非空 front代表佇列第乙個元素 rear佇列最後乙個元素的下乙個元素
3)佇列空
front和rear的值相等但不一定是零
3、迴圈佇列各個引數的含義
4、迴圈隊列入隊偽演算法講解
兩步完成:
1、將值存入r所代表的位置
2、錯誤的寫法r=r+1;
正確的寫法r=(r+1)%陣列的長度
5、迴圈佇列出隊偽演算法講解
front = (front+1)%陣列的長度
6、如何判斷迴圈佇列是否為空
如果front與rear的值相等,則該佇列就一定為空
7、如何判斷迴圈佇列是否已滿
預備知識:front的值可能比rear大也可能小也可能相等
兩種方式:1、多增加乙個標識引數 2、少用乙個元素(通常用這個)
如果r和f的值緊挨著,那佇列已滿
if((r+1)%陣列長度 == f) 已滿 else 不滿
佇列演算法:
入隊、出隊
佇列的具體應用:所有和時間有關的操作都有佇列的影子
專題:遞迴
定義:乙個函式自己直接或間接呼叫自己
遞迴滿足三個條件
1、遞迴必須得有乙個明確的終止條件
2、該函式所處理的資料規模必須在遞減
3、這個轉化必須是可解的
迴圈和遞迴
遞迴:易於理解、速度慢、儲存空間大
迴圈:不易理解、速度快、儲存空間小
舉例:
1、1+2+3+4+...+100
2、求階乘
3、漢諾塔
4、走迷宮
模組二:非線性結構 樹
樹的定義:
專業定義:
1、有且只有乙個稱為根的節點
2、有若干互不相交的子樹,這些子樹本身也是一棵樹
通俗的定義:
1、樹是由節點和邊組成
2、每個節點只有乙個父節點但可以有多個子節點
3、但有乙個節點例外,該節點沒有父節點,此節點稱為根節點
專業術語:
節點 父節點 子節點 子孫 堂兄弟
深度:從根節點到最底層節點的層數稱之為深度,根節點是第一層
葉子節點:沒有子節點的節點
非終端節點:實際就是非葉子節點
度:子節點的個數稱為度
樹的分類:
一般樹任意乙個節點的子節點的個數不都不受限制
二叉樹任意乙個節點的子節點的個數最多兩個,且子節點的位置不可改變
分類:一般二叉樹
滿二叉樹:
在不增加樹的層數的前提下,無法再多增加乙個節點的二叉樹就是滿二叉樹
完全二叉樹:如果只是刪除了滿二叉樹最底層最右邊連續若干個節點,
這樣形成的二叉樹就是完全二叉樹 森林
n個互補相交的樹的集合
樹的儲存:
二叉樹的儲存
連續儲存[完全二叉樹]
優點:查詢某個節點的父節點和子節點(也包括判斷有沒有節點)
缺點:耗用記憶體過大
鏈式儲存
一般樹的儲存
雙親表示法:求父節點方便
孩子表示法:求子節點方便
雙親孩子表示法:求父節點和子節點都很方便
二叉樹表示法:把乙個普通樹轉換成二叉樹儲存
具體轉換方法:
設法保證任意乙個節點的做指標域指向第乙個孩子
右指標域指向它的兄弟
森林的儲存:森林轉換成二叉樹,在儲存二叉樹
操作:
遍歷先序遍歷[先訪問根節點]:先訪問根節點再訪問左子樹再訪問右子樹
中序遍歷[中間訪問根節點]:中序遍歷左子樹再訪問根節點再中序遍歷右子樹
後序遍歷[最後訪問根節點]:先中序遍歷左子樹再中序遍歷右子樹再訪問根節點
已知兩種遍歷序列求原始二叉樹
通過先序和中序 或者 中序和後序我們可以還原原始的二叉樹
但是通過先序和後序是無法還原原始的二叉樹的
換種說法只有通過先序和中序或中序和後序才可以唯一確定乙個二叉樹
應用:樹是資料庫中資料組織的一種重要形式
作業系統父程序的關係本身就是一棵樹
物件導向語言中類的繼承關係本身就是一棵樹
赫夫曼樹
樹的操作: 圖
圖的概念
圖的定義
圖的基本術語
1、端點和鄰接點
2、頂點的度
3、完全圖、稀疏圖、稠密圖
4、子圖
5、路徑和迴路
6、連通和連通圖
7、強連通圖和強連通分量
8、權和網
9、圖的儲存結構
1、鄰接矩陣
2、鄰接表
3、邊集陣列
圖的遍歷
1、圖的深度優先搜尋遍歷
2、圖的廣度優先搜尋遍歷
圖的應用
圖的生成樹和最小生成樹
普里姆演算法
克魯斯卡爾演算法
最短路徑
模組三:查詢和排序
折半查詢 排序
冒泡 插入
選擇快速排序
歸併排序
排序和查詢的關係
排序是查詢的前提
排序時重點
資料結構學習筆記
資料結構學習筆記 程式 資料結構 演算法 資料結構 資料 結構 結構的本質是關係 資料之間的關係從不通風層面上分為邏輯關係和物理關係 演算法的設計要依據資料的邏輯關係 演算法的實現要依據資料的物理關係 物理關係是邏輯關係的基礎和載體 演算法實現時需要先依據問題抽象出資料模型,即初步確定待處理資料的邏...
資料結構 學習筆記
一 鍊錶 1 基本特徵 記憶體節點是不連續的,節點之間通過指標彼此關聯。2 基本操作 追加 插入 刪除 遍歷 偽隨機訪問!3 實現要點 1 追加 新建節點存放資料,令新節點的前指標指向當前尾節點,新節點的後指標為null,令當前尾節點的後指標指向新節點,尾指標指向新節點。考慮在空煉表中追加第乙個節點...
資料結構學習筆記
注意用陣列模擬棧,所有刪除操作都是移動棧頂標記,因為陣列難以進行刪除操作 include using namespace std class stack bool isempty bool isfull int top void push int x void pop stack stack int...