資料結構實現基礎(二)

2021-10-10 15:26:59 字數 3797 閱讀 6367

變數是資料儲存的基本單位,而變數是有型別的。c語言事先定義了幾種基本的資料型別,供程式設計師直接使用,如整型,實型,字元型等。為了使程式設計師能夠充分表達各種複雜的資料,c語言還提供了構造複雜資料型別的手段,如陣列,結構,指標等。

陣列是最基本的構造型別,它的特點是儲存多個相同型別的資料,或者說它是一組相同型別資料的有序集合。陣列中的元素在記憶體中連續存放,每個元素都屬於同一種資料型別,用陣列名和下標可以唯一的確定陣列元素。

注意:c編譯器不檢查陣列是否越界,因此在程式設計時不要讓下標越界。因為一旦發生下標越界,就會把變數寫到其他變數所佔的儲存單元中,可能造成不可預料的執行結果。

例3.求集合元素的最大值。集合元素存放於陣列a中,陣列大小為n。

elementtype max(elementtype s, int n)

return curmax;

在程式設計過程中,除了使用c語言提供的標準型別和自己定義的一些結構體,列舉等型別外,還可以用typedef語句來建立已經定義好的資料型別的別名:

typedef 原有型別名 新型別名
思考一下:這麼做的好處是什麼呢?

在此對上述例3中的elementtype進行解釋:elementtype不是c語言的乙個資料型別,而是乙個通用型別,也就是說相當於乙個模板,這個模板可以用int ,double, float等一些具體型別進行替代。例如是int型,但是如果把所有的elementtype都換做int ,未免有些太麻煩了。而elementtype恰好可以解決此問題,我們只需要在前面加上語句:

typedef int elementtype
把上述語句寫在函式執行之前,我們就不必把每個elementtype都換成int去編譯執行。

指標是c語言的靈魂。使用指標可以對複雜資料進行處理,能對計算機的記憶體進行分配控制,在函式呼叫中使用指標可以返回多個值。

定義指標變數的一般形式:

型別名 *指標變數名
如下面語句定義了指向float型別的指標變數p。

float *p;
指標變數用於存放變數的位址。由於不同的型別的變數在記憶體中占用不同大小的儲存單元,所以如果只知道記憶體位址,還不能確定該位址上的物件。因此在定義指標變數時,除了指標變數名,還需要說明該指標變數所指向的記憶體空間上所存放資料的型別。

指標變數被定義後,必須將指標與乙個特定的變數進行關聯後,才可以使用指標,指標變數也要先賦值再使用,當然指標變數被賦的值當然是位址。

指標的基本運算

(2)間接訪問運算子*:*p //表示p所指的變數,即a

(3)指標與整數的加減法運算:如果指標變數p指向float型別的變數,那麼表示式p+i代表了從p這個位置開始的第i個float型別的變數的位址。

(4)相同型別指標與指標的相減:表示兩個指標之間相隔的變數個數。如p-q==1說明p,q所指變數為相鄰變數。

(5)兩個相同型別的指標用比較運算子比較大小

指標與陣列

在c語言中,陣列名代表陣列首元素的位址,也叫基位址。也就是說陣列名也代表乙個位址。

在訪問記憶體方面,指標和陣列幾乎是相同的,但是也有不同。指標是以位址作為值的變數,而陣列名的值是乙個特殊的固定位址,可以把它看作指標常量,不能改變指標常量(陣列名)的值。

在函式定義時,被宣告為陣列的形參實際上是乙個指標。當傳遞陣列時,按值呼叫傳遞它的基位址,陣列元素本身不被複製。

陣列名作為函式的實參,在被呼叫函式中,就能訪問實參陣列所在的儲存單元,不但可以引用還可以改變這些單元的內容。返回主調函式,相應陣列元素的值就改變了。

用指標實現記憶體的動態分配

c語言具有動態儲存管理的功能,允許程式動態申請和釋放儲存空間。

在動態儲存方面,c語言提供了一組標準函式,定義在stdio.h裡面,主要有:

(1)動態儲存分配函式void *malloc(unsigned size):在記憶體的動態儲存區分配一連續的空間,其長度為size,且其返回型別為(void*)。若申請成功,則返回乙個指向所分配記憶體空間的起始位址;若申請記憶體空間不成功,則返回null(值為0)。該函式的返回值為(void *)型別,在具體使用中,要將malloc的返回值轉換為特定指標型別,並賦給乙個指標變數。

(2)動態儲存釋放函式void free(void *ptr):釋放記憶體空間,ptr指向釋放空間的首位址。返回值型別為void型別。

結構型別是一種允許程式設計師把一些資料分量聚合成乙個整體的資料型別,它能夠把有內在聯絡的不同型別的資料統一成乙個整體,使他們相互關聯。同時,結構又是乙個變數的集合,可以按照與成員型別變數相同的操作方法單獨使用其變數成員。

與陣列的區別:陣列的元素型別必須一致,結構的成員可以是不同的資料型別。

結構型別定義的一般形式:

struct 結構識別符號

;

在c語言中,定義結構體變數的一種方式是:先定義一種結構型別,在定義一種具有這種結構型別的變數,

結構變數定義的基本形式是:

struct 結構識別符號 結構變數名
結構變數的初始化:

在結構變數的定義時對其賦初值,即採用初始化表的方法------大括號內各項資料用逗號隔開,將大括號內的資料項對應的賦給結構變數的每個成員,要求資料型別一致。

結構變數的使用:

使用結構變數主要是對結構成員進行操作。在c語言中,使用結構成員運算子來對結構成員進行引用。格式為:

結構變數名.結構成員名
結構變數不但可以作為函式引數,還可以作為函式的返回值。此外結構成員變數也能作為函式引數,與普通變數作為函式引數一樣。

結構指標:結構指標就是指向結構型別變數的指標。有了結構指標,即可以通過該指標訪問結構,也可以通過指標直接訪問結構成員。具體有兩種形式:

(1)用*方式訪問:

(*結構指標變數名).結構成員名
(2)用指向運算子「->」訪問指標指向的結構成員

結構指標變數名->結構成員名
結構指標也可作為函式引數傳遞。相比於通過引數直接傳遞結構,將結構指標作為引數傳遞不僅可以在函式中修改結構指標所指向的內容,而且引數傳遞的效率會更高。

資料結構實現基礎(三)

上一講學習了一些基本的資料型別像陣列,結構。我們還學習了一些指標的基本概念。這一講,我們主要學習兩種資料型別,一種叫聯合,也叫共同體。還有一種就是鍊錶。共同體同結構體在宣告形式和訪問方式上有些類似,但是它和結構體是完全不一樣的。所謂共同體型別,是指將不同的資料項組成乙個整體,它們在記憶體中占用同一段...

資料結構與演算法 基礎資料結構 佇列實現

在學習佇列的實現過程中,跟著教程自己手寫了佇列的實現,理解佇列的先進先出原理。以及略微複雜的迴圈佇列形成的乙個閉環,略微吃力,還需努力,詳細說明在注釋 package com.zhouyou.queue 普通佇列的實現 public class arrayqueue public void push...

資料結構 二 之演算法基礎

一.為什麼要學習演算法?先來個簡單的演算法比較 求sum 1 2 3 n 1 n的結果.輸入整數n,輸出 sum 解法一 for迴圈 function sum n return s 執行1次 解法二 function sum n 很明顯,解法二要優於解法一。因為解法二需要運算的次數少。我們去衡量乙個...