C語言系列(20) 結構體(03)

2021-09-26 20:41:54 字數 4709 閱讀 2403

一、什麼是鍊錶

將記憶體中若干個位址空間,用指標連起來。

鍊錶:

是一種物理儲存單元上非連續、非順序的儲存結構資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的。

二、單向鍊錶

鍊錶中最簡單的一種是單向鍊錶,它包含兩個域,乙個資訊域和乙個指標域

這個鏈結指向列表中的下乙個節點,而最後乙個節點則指向乙個空值

資訊域:儲存。指標域:儲存下個節點的首位址

鍊錶節點結構體定義

typedef

struct student

student;

定義節點

//定義節點 第乙個節點

student *s1 =

(student*

)malloc

(sizeof

(student));

//節點賦值

strcpy_s

(s1->name,

sizeof

(s1->name)

,"binson");

s1->age =10;

s1->*** =

'm';

//定義節點 第二個節點

student *s2 =

(student*

)malloc

(sizeof

(student));

//節點賦值

strcpy_s

(s2->name,

sizeof

(s2->name)

,"name2");

s2->age =12;

s2->*** =

'f';

//定義節點 第三個節點

student *s3 =

(student*

)malloc

(sizeof

(student));

//節點賦值

strcpy_s

(s3->name,

sizeof

(s3->name)

,"name3");

s3->age =20;

s3->*** =

'f';

鏈結節點

//將各節點連起來,形成鍊錶

//定義乙個頭節點,頭節點永遠指向頭。

student* phead = s1;

student* plast =

null

;//尾

student* p = phead;

//後面用各節點內部的指標,指向下乙個節點。

s1->pnext = s2;

// 第乙個節點的指標域,指向第二個節點

s2->pnext = s3;

// 第二個節點的指標域,指向第三個節點

s3->pnext =

null

;//最後乙個節點的指標,指向null。

當然,後面還可以繼續鏈結更多的節點。

注意:永遠不要丟失頭指標(phead),這樣,我們就通過phead,找到後面所有的節點。

student* phead =

null

;//首

student* plast =

null

;//尾

int i =0;

int size =10;

for( i =

0; i < size; i++

)else

}//通過 phead 輸出

student* p = phead;

//不要改變phead的指向,使用臨時指標進行遍歷

while

(p !=

null

)//釋放記憶體空間,這一步很重要,不使用了就要釋放,不然就造成了記憶體洩漏

p = phead;

while

(p !=

null

)

//單鏈表前增加

student* newstu =

(student*

)malloc

(sizeof

(student));

printf

("請輸入年齡:");

scanf_s

("%d"

,&newstu->age)

;student* p = phead;

student* perp = phead;

while

(p !=

null

)else

}else

if(p == plast)

//沒找到比age大的,則增加到最後乙個

perp = p;

//單向鍊錶,在前面增加元素,需要乙個前面的節點指標

p = p->pnext;

//依次往後移動指標

}

printf

("輸入年齡:");

scanf_s

("%d"

,&age)

;student* p = phead;

student* perp = p;

while

(p !=

null

)else

if(p == plast)

//刪除尾節點

else

//刪除中間節點

} perp = p;

p = p->pnext;

//依次往後移動指標

}

以上基本實現,單鏈表的遍歷、增、刪

三、雙向鍊錶

雙向鍊錶:在節點的結構體定義中,有兩個指標,乙個指向前乙個節點、乙個指向後乙個節點

雙向鍊錶對比單向鍊錶,雙向鍊錶可以通過當前節點找到上乙個節點和下乙個節點,而單向鍊錶只能找到下乙個節點。

typedef

struct student

student;

student* phead =

null

;//首

student* plast =

null

;//尾

int i =0;

int size =10;

for(i =

0; i < size; i++

)else

}//通過 phead 輸出

student* p = phead;

//不要改變phead的指向

while

(p !=

null

)//釋放記憶體空間

p = phead;

while

(p !=

null

)

例子:雙向鍊錶插入節點:輸入其年齡,實現在乙個10個學生節點的鍊錶中(按年級有序鍊錶),將這個新節點插入進鍊表中,使其仍然有序。

student* newstu =

(student*

)malloc

(sizeof

(student));

printf

("請輸入年齡:");

scanf_s

("%d"

,&newstu->age)

;student* p = phead;

//這兩句很關鍵,預設per和next指向空

newstu->pnext =

null

;newstu->ppre =

null

;while

(p !=

null

)else

break;

}else

if(p == plast)

//沒找到比age大的,則增加到最後乙個

p = p->pnext;

//依次往後移動指標

}

int age;

printf

("輸入年齡:");

scanf_s

("%d"

,&age)

;student* p = phead;

student* tmp =

null

;while

(p !=

null

)else

if(p == plast)

else

} p = p->pnext;

//依次往後移動指標

}

03c語言中陣列和結構體

ascii 文字字串 asciz 以空字元結尾的字串 byte 位元組值 double 雙精度浮點值 float 單精度浮點值 int 32 32位整數 long 32 32位整數,和int相同 octa 16位元組整數 quad 8位元組整數 short 16位整數 single 單精度浮點數 與...

C語言學習筆記 20結構體

1 結構體的定義 2 結構體的定義和賦值 3 獲取結構體變數中的成員 include include 獲取結構體變數中的每乙個成員方式 1 結構體變數名.成員名 2 指標變數名 成員名 定義乙個學生的結構體 struct student 這只是定義了乙個新的資料型別,並沒有定義變數 int main...

C語言結構體

1.1.1 結構概念 1 結構存在的意義 存在是合理的,許多事物的存在是在不斷解決問題引入的,當然有更好的方法出現時改變也是合理的。在實際問題中,一組資料往往具有不同的資料型別。例如,在學生登記表中,姓名應為字元型,學號可為整型或字元型,年齡應為整型,性別應為字元型,成績可為整型或實型。顯然不能用乙...