結構體與指標(一)

2021-09-29 13:26:16 字數 4477 閱讀 9691

在學習資料結構的時候,會經常使用到結構體。今天分享的內容是結構體與指標,因為結構體和指標本身的內容並不是太多,所以今天的內容還包括了鍊錶的實現。希望可以通過這篇部落格,讓大家熟悉結構體與指標,以及鍊錶的實現。

一、結構體指標

1.1、結構體的簡單介紹

在實際應用過程中,一組單一資料型別的陣列很難滿足我們的需求,這個時候就需要借助結構體。結構體是一種構造資料型別,它有許多不同資料型別的成員。假如我們需要整理乙個班級學生的資料,具體要整理的資料如下:

於是我們可以根據這些資訊,建立乙個結構體。結構體的建立格式如下:

struct 結構體名稱
struct student
1.2、結構體變數和結構體陣列結構體和普通變數有很多類似的地方,我們可以將結構體理解為乙個陣列,乙個儲存不同資料型別的陣列(只是作為理解,結構體和陣列的操作完全不同)。

(1)結構體變數

結構體變數的宣告和其它變數的宣告類似,大概樣式如下:

struct 結構體名稱 結構體變數;
那麼學生結構體變數宣告如下:

struct student stu1, stu2;
另外我們可以用typedef關鍵字來簡化結構體變數的宣告,具體操作如下:

//將型別struct student 定義為 student,以後看到了student就可以用struct student替換

typedef

struct student student;

//那麼學生結構體的定義可以變成如下

student stu1, stu2;

(2)初始化結構體變數在結構體中,我們可以通過「.」來操作結構體的成員:

student stu1;

stu1.name =

"zack"

;stu1.*** =

"male"

;stu1.year =

1999

;stu1.score =

89;

因為結構體是構造資料型別,它所佔的位元組數是由每個成員佔的位元組數疊加的。

(3)結構體陣列

結構體陣列的定義和普通陣列一致,我們可以迴圈初始化:

int i;

student stu[3]

;//迴圈輸入資料

for(i =

0; i <

3; i++

)//迴圈輸出結構體陣列中的資料

for(i =

0; i <

3; i++

)

大致和普通變數沒有區別,操作結構體的關鍵就是「.」。

1.3、結構體指標

結構體指標和其它變數的指標類似,而且用結構體指標操作結構體的用法也類似,唯一的不同就是在用結構體指標操作結構體成員。

(1)結構體指標的定義

結構體指標的定義和普通指標變數的定義是相似的,在未使用typedef時,結構體指標定義如下:

struct 結構體名稱 *結構體指標變數名稱;

//那麼學生結構體指標定義如下

struct student *p;

而使用typedef之後,定義如下:

student *p;
(2)結構體指標初始化結構體在此之前先講一下訪問結構體成員的三種方式,假定有下列結構體和結構體指標:

//宣告乙個結構體變數和結構體指標變數

student stu,

*p;

那麼訪問成員的方式如下:

//通過「.」來訪問結構體成員,結構體變數訪問成員時,需要用「.」來訪問

stu.name

//通過「->」來訪問成員,結構體指標訪問成員時,需要用「->」來訪問

p->name

//先獲取結構體指標指向的內容,然後再訪問成員

*p->name

了解上面的東西後,就可以知道結構體指標初始化結構體了。

student *p;

p->name =

"zack"

;p->*** =

"male"

;p->year =

1999

;p->score =

89;

然後我們做個簡單的練習,建立5個學生結構體,然後根據學生的年齡排名。為了方便,我們重新建立乙個結構體:

typedef

struct

student;

這個結構體就兩個成員,我們可以使用氣泡排序:

//定義學生結構體陣列,和臨時變數temp

student stu[5]

, temp;

int i, j;

//迴圈輸入5個學生的資訊

for(i =

0; i <

5; i++

)//使用排序演算法排序

for(i =

0; i <

5; i++)}

}

可以看到,結構體在按成員排序時和普通變數排序是一致的。

二、鍊錶

之前說過指標在結構體中用處巨大,而這個用處實際體現在鍊錶的實現。在具體講解鍊錶前,先了解一下線性表的概念。

2.1、線性表

因為不是講解資料結構,所以對於線性表也是簡單介紹。

(1)線性表

其實我們已經遇到過各種各樣的線性表,最典型的就是陣列了。雖然陣列不等同於線性表,但是用陣列理解線性表是個很好的選擇。那麼陣列有什麼特點呢?

因為陣列和線性表還是有區別的,所以並不代表上面的就是線性表的特點。不過有一點非常重要,就是「每兩個相鄰元素之間都有對應關係」,這個對應關係簡單來說就是「乙個前驅乙個後繼」。這麼說有點不理解了,通俗講就是「前面有乙個,後面有乙個」。這裡的乙個是指最多乙個,也可以是零個。就好比珍珠項鍊,你任意以乙個珍珠作為參考,任何乙個珍珠都是前面乙個,後面乙個。

(2)順序表和煉表

上面簡單說了一下線性表,然後我們來講講線性表和鍊錶的關係。先看下面兩張圖:

第乙個是鐵鍊,第二個並不是麻花啊,它是一條繩子。我說這兩個都符合線性表的特點大家可能不是很理解,對於鐵鍊還可以接受,但是繩子就有點牽強了。所以我們假設,繩子上面串了珍珠。

然後我們看看繩子:

這麼一看鍊子要厲害許多,但是這只是對於鍊子和繩子來說。實際上鍊表和順序表並不完全和上面一樣。舉這個例子只是作為直觀的理解,鍊錶具體的特點,我將在鍊錶的實現當中為大家講解。

2.2、鍊錶介紹

(1)鍊錶的實習原理

鍊錶實際上是由乙個個節點組成的,每個節點都儲存兩個東西。乙個資料、還有乙個位址。資料的話就是我們要用到的東西,位址儲存的是下乙個節點的位址。這樣我們就能通過某乙個節點找到下乙個節點,經此而已。

(2)用結構體模擬節點

結構體是一種構造資料型別,可以有許多態別不同的成員。然後我們根據節點的特點就可以用結構體模擬出乙個節點了。

開始說節點儲存兩個資料,其實不準確。應該是兩種資料,乙個是我們要用到的資料,還有乙個是下乙個節點的指標。存放資料的區域叫做資料域,存放位址的區域叫做指標域。我們先來定義乙個最簡單的節點:

typedef

struct numnode, linkedlist;

首先資料域沒有什麼疑問,就是乙個普通的int資料。然後是指標域,因為我們是要儲存下乙個節點的位址,而節點又是乙個num結構體,然後我們就可以根據上面學的結構體指標定義的方式定義乙個結構體指標。

注意:在結構體中,記憶體大小必須是確定的。結構體的成員不允許是本身結構體變數,但是可以為本身的結構體指標。以為指標的大小是確定的,而如果成員中有本身的結構體變數系統將無法知道這個結構體應該分配多少記憶體。

結構體與指標

struct s options opt 此時結構體內的資料都是乙個隨機數 struct s options opts struct s options malloc sizeof struct s options 8 此時各元素為預設初始化值,例如int就是0 一 結構體的定義方法 1 直接定義 ...

指標與結構體

宣告 c c 內容來自西交公開課,之後不再宣告,僅作為筆記 thx.指標與結構體 結構體變數的指標 位址 結構體變數名 使用指標處理結構體變數步驟 1.定義指向結構體變數的指標 結構體型別 指標變數名 2.給指標變數提供初值 格式1 指標變數 成員名 格式2 指標變數 成員名 其中 稱為結構指向運算...

指標與結構體

指標是乙個變數,它儲存了另乙個變數的位址。指標主要的功能有兩個 避免副本和共享資料。作用是什麼?參考 1 定義指標變數的一般形式為 基型別 指標變數名,如 int pointer 1 float pointer 2 char pointer 3等,在定義指標變數時必須指定其型別。2 兩個相關的運算子...