一、什麼是鍊錶
將記憶體中若干個位址空間,用指標連起來。
鍊錶:
是一種物理二、單向鍊錶儲存單元
上非連續、非順序的儲存結構
,資料元素的邏輯順序
是通過鍊錶中的指標鏈結
次序實現的。
鍊錶中最簡單的一種是單向鍊錶
,它包含兩個域,乙個資訊域
和乙個指標域
。
這個鏈結指向列表中的下乙個節點
,而最後
乙個節點則指向乙個空值
。
資訊域:儲存值
。指標域:儲存下個節點的首位址
。
鍊錶節點結構體定義
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 結構存在的意義 存在是合理的,許多事物的存在是在不斷解決問題引入的,當然有更好的方法出現時改變也是合理的。在實際問題中,一組資料往往具有不同的資料型別。例如,在學生登記表中,姓名應為字元型,學號可為整型或字元型,年齡應為整型,性別應為字元型,成績可為整型或實型。顯然不能用乙...