1. 程式人生 > >資料結構之一準備及預熱

資料結構之一準備及預熱

1.介面

介面可以理解為使用者和函式打交道的地方,通過介面使用者輸入了自己的資料,得到了自己想要的結果

2.在進行演算法設計題中的程式碼書寫時,只需寫出一個或多個可以解決問題的有著清楚介面描述的函式即可。

3.資料型別
對於基本資料型別,如整型 int ,long ,…,字元型 char , 浮點型 float , double , …等大家都已經瞭解了。這裡主要講結構型和指標型。
3.1 結構型
結構型 :結構型就是使用者自己製作的資料型別 。
結構體就是系統提供給程式設計師製作新的資料型別的一種機制,即可以用系統已經有的不同的基本資料型別或使用者定義的結構型,組合成使用者需要的複雜資料型別。
例如:

typedef struct
{
    int a;
    char b;
    float c;
}TypeA;

上面的語句製造了一個新的資料型別,即TypeA型。

對比結構體和資料 , 如圖1-1
這裡寫圖片描述

3.2 指標型
對於其他型別的變數,變數裡所裝的是資料元素的內容,而指標型變數內部裝的是變數的地址,通過它可以找出這個變數在記憶體中的位置。
指標型的定義方法對每種資料型別都有特定的寫法,但又有相似的方法。例如:

int *a;     //對比一下定義的int型變數的語句;int a; 
char *b;    //對比一下定義的char型變數的語句;char b; 
float *c; //對比一下定義的float型變數的語句;float c; TypeA *d; //對比一下定義的TypeA型變數的語句;TypeA d;

上面四句分別定義了指向整型變數的指標a,指向字元型變數的指標b, …

如果a是指標型變數,且它已經指向一個變數b , 則a中存放變數b所在的地址。*a 就是取變數b的內容(x=*a ; 等價於 x=b;), &b 就是取變數b的地址,語句a=&b;就是將變數b的地址存於a中,即大家常說的指標a指向b。

指標型 用的最多的就是和結構型結合起來構造結點(如連結串列的結點、二叉樹的結點)

3.3 結點的構造
3.3.1 連結串列結點的定義
連結串列結點有兩個域:一個是資料域,用來存放資料;另一個是指標域,用來存放下一個結點的位置;如圖1-2
這裡寫圖片描述

連結串列的結構型定義如下:

typedef struct Node
{
        int data;            //這裡預設的是int型,如需其他型別可直接修改
        struct Node *next;   //指向Node型變數的指標
}Node;

注:凡是結構型(假設名為a)內部有這樣的指標型(假設名為b),即 b 是用來存放和 a 型別相同的結構變數地址的指標型(如圖1-2中結點A的指標next , next 所指的結點B與結點A是屬於同一結構型的),則在定義 a 的 typedef struct 語句之後都要加上 a 這個結構型的名字

3.3.2 二叉樹結點的定義
在連結串列結點結構型的基礎上,再加上一個指向自己同一型別變數的指標域,即二叉樹結點的結構型。例如:

typedef struct BTNode
{
    int data;
    struct BTNode *lchild;
    struct BTNode *rchild; 
}BTNode;

在考研資料結構中,只要熟練掌握以上兩種結點(連結串列、二叉樹)的定義方法,其他的結點都是由這兩種衍生而來的。

以二叉樹結點的製作為例,有以下兩種寫法:

//1
BTNode BT;

//2
BTNode *BT;
BT=(BTNode*)malloc(sizeof(BTNode));  //此句要熟練掌握 
  • 1中只用一句就製作了一個結點,而2中需要兩句,要比1繁瑣,但是考研中用的最多的是2 。
  • 2 的執行過程:先定義個結點的指標BT ,然後用malloc函式來申請一個結點的記憶體空間,最後讓指標BT指向這片記憶體空間,這樣就完成了一個結點的製作
  • 另外,因為BT是變數,雖然現在BT指向了剛生成的結點,但是在以後必要的時候BT可以離開這個結點轉而指向其他結點。而1句則不行,1中的BT就是某個結點的名字,一旦定義好,它就不能脫離這個結點了。從這可以看到2比1更靈活,因此2用的多,並且2完全可以取代1
  • 對於1和2中的BT取分量的操作也是不同的。對於1如果想取其data 域的值賦給x ,則應該寫成x=BT.data ; ,而對於2則應該寫成x=BT->data ; 。一般來說,用結構體變數取分量,其操作用“.”;用指向結構體變數的指標來取分量,其操作用“->”。
  • 當然也可以這樣寫(*BT).data,它與BT->data是等價的。

注:在不知道系統預設的運算子優先順序的情況下,最好依照自己所期望的運算順序加上括號。

這裡寫圖片描述
上面的模板請背會

除此之外,還有一個動態申請陣列空間的方法,相對於上面提到的一次申請一個結點,這種方法可以認為是一次申請一組結點,如下

int *p;
p=(int*)malloc(n*sizeof(int)); 

這樣就申請了一個由指標 p 所指的(p指向陣列中第一個元素的地址)、元素為 int 型的,長度為 n 的動態陣列。取元素的時候和一般的陣列(靜態陣列)一樣,如取第2個元素,則可寫成 p[1] .

3.4 關於typedef和#define
typedef 就是用來給現有資料型別起一個新名字的。
#define 定義常量,例如 #define maxSize 50;

未完…