1. 程式人生 > 其它 >資料結構之整體概述和預備知識

資料結構之整體概述和預備知識

一、概述

  我們通常會把現實中大量而複雜的問題以特定的資料型別特定的儲存結構存放到主儲存器中,以及在此基礎上為實現某個功能(比如查詢某個元素、刪除某個元素、對元素進行排序等)而執行相應的操作,這個相應的操作也叫演算法。

(1)資料結構

  狹義上,資料結構是研究資料儲存結構的一門學科;廣義上,資料結構還包含了對演算法的研究。

  資料結構是軟體核心課程,但是學完不一定立刻見效,但對日後理解程式等有莫大幫助。

(2)演算法:

  狹義上,演算法與資料的儲存密切相關,即不同資料結構就算同一型別排序方法寫出來的程式也不一定相同;廣義上,演算法與資料的儲存無關,即排序就是一種演算法,管你是什麼資料結構,排序演算法大體思路都一樣。

  衡量演算法先進的標準

  • 時間複雜度:程式大概要執行的次數而非時間,比如不同電腦效能不同,相同程式執行的時間也就不一樣。
  • 空間複雜度:程式執行過程中大概所佔用的最大記憶體空間
  • 難易程度:別人能不能看的懂
  • 健壯性:是否容易受到bug的干擾。

二、預備知識

指標知識補充:

  1. 地址是從零開始的非負整數
  2. 指標的本質是一個受限的非負整數,不能進行乘除等操作,加減可以。
  3. 指標變數定義之後為野指標,即所指向的地址不明確。
  4. 指標變數在32位系統下只佔用4個位元組
  5. 對於任何一變數而言,其第一個位元組首地址就是該變數的地址。

結構體知識補充:

  1. 結構體變數不能加減乘除,但同類型之間可以相互賦值
  2. 結構體變數通常有很多成員,記憶體很大,函式傳參最好傳送結構體變數首地址為好。

動態分配記憶體:

  1. 如果開拓了某記憶體區域之後,該區域不用了,需要用free(*)將其釋放出去,否則會造成記憶體洩漏問題
  2. 函式形參實參傳遞過程中,當函式呼叫完畢之後,形參就會給釋放,我們通常都傳遞或者返回指標

typedef的使用

  優點:代替長名字,方便輸入,定義的名字通常使用大小寫。

  例:

typedef struct Student
{
    int sidl
    char name[100];
    char sex;
}*PST    //PST等價於struct Student *

三、資料結構整體框架

  資料結構可以歸納為如下兩類:

  • 線性結構:該結構的資料元素之間存在一對一的關係。典型:陣列、連結串列
    。合理應用陣列、連結串列可得棧、佇列
  • 非線性結構:該結構的資料元素之間存在一對多或多對多關係。典型:樹、圖