鏈表概述
鏈表的作用:當一些成員數量不缺定的時候,希望可以通過上一個結點而找到下一個結點。需要使用鏈表。
鏈表在哪些地方進行應用?
節點的構成:數據域+指針域。
鏈表的物理拓撲結構:
鏈表的節點表示:結構體表示。
示例:
struct POINT{
//數據域
int vara;
char varb;
float varc;
double vard;
//指針域
struct POINT *next;
};//單向鏈表的節點構造的數據類型
鏈表根據方向:單向鏈表、雙向鏈表、環形鏈表。
鏈表根據存儲方式:靜態鏈表、動態鏈表。
靜態鏈表
鏈表長度已經固定不能發生改變。一般情況下使用結構體數組表示靜態鏈表。
單向靜態鏈表
方向只有一個:從鏈表頭到鏈表尾部。
有頭節點與尾節點的概念。
頭節點的特徵:頭節點一般不存儲數據。只使用指針域。
尾節點的特徵:數據域要存儲數據。指針域爲NULL。
構成示例:
struct POINT{
//數據域
int vara;
char varb;
float varc;
double vard;
//指針域
struct POINT *next;
};
int main(void)
{
struct POINT point_buff[5] = {0};
//將節點連接起來構成鏈表
point_buff[0].next = &point_buff[1];//頭節點的指針域存儲下一個節點的門牌號
point_buff[1].next = &point_buff[2]; //子節點的指針域存儲下一個子節點的門牌號
point_buff[2].next = &point_buff[3];
point_buff[3].next = &point_buff[4];
point_buff[4].next = NULL;//尾節點的指針域存NULL
return 0;
}
遍歷鏈表:將鏈表中所有的數據全部輸出到屏幕。
- 向鏈表中存儲數據----寫操作
struct POINT{
//數據域
int vara;
char varb;
float varc;
double vard;
//指針域
struct POINT *next;
};
int main(void)
{
struct POINT point_buff[5] = {0};
struct POINT *point = point_buff;
//將節點連接起來構成鏈表
point_buff[0].next = &point_buff[1];//頭節點的指針域存儲下一個節點的門牌號
point_buff[1].next = &point_buff[2];
point_buff[2].next = &point_buff[3];
point_buff[3].next = &point_buff[4];
point_buff[4].next = NULL;//尾節點的指針域存NULL
point = point->next;
while(point != NULL)//當前這個鏈表沒有結束
{
printf("請輸入整形、字符型、單精度、雙精度數據:");
scanf("%d,%c,%f,%lf", &point->vara, &point->varb, &point->varc, &point->vard);
point = point->next;
}
return 0;
}
- 將鏈表中的數據輸出----讀操作
struct POINT{
//數據域
int vara;
char varb;
float varc;
double vard;
//指針域
struct POINT *next;
};
int main(void)
{
struct POINT point_buff[5] = {0};
struct POINT *point = point_buff;
//將節點連接起來構成鏈表
point_buff[0].next = &point_buff[1];//頭節點的指針域存儲下一個節點的門牌號
point_buff[1].next = &point_buff[2];
point_buff[2].next = &point_buff[3];
point_buff[3].next = &point_buff[4];
point_buff[4].next = NULL;//尾節點的指針域存NULL
point = point->next;
while(point != NULL)//當前這個鏈表沒有結束
{
printf("請輸入整形、字符型、單精度、雙精度數據:");
scanf("%d,%c,%f,%lf", &point->vara, &point->varb, &point->varc, &point->vard);
point = point->next;
}
point = point_buff;//回到鏈表的頭
point = point->next;//越過頭節點----頭節點不存儲數據
while(point != NULL)//當前這個鏈表沒有結束
{
printf("%d\t%c\t%f\t%lf\r\n", point->vara, point->varb, point->varc, point->vard);
point = point->next;
}
return 0;
}
小練習:用函數實現;錄入n個學生信息(不超過10個),如果有xiaoming這個同學,將xiaoming同學信息輸出。學生信息包括:name、age、yuwencj、shuxuecj、waiyucj;