鏈表是一種十分常見又重要的數據結構,就像幼兒園裏老師讓小朋友們手牽着手排成一排一樣,我們也可以將n個創建好的對象“牽”起來。第一個對象當然是老師,在最前面,最好一個無人可“牽”;我們可以用結構體類型實現簡單的鏈表(當然也可以用類來實現)。在大學的課程裏都設有這門課程,在譚浩強先生的《C程序設計》裏也有講到。故在此不知天高地厚的說一下吧。
鏈表分 2 種;
1首先是靜態鏈表:
顧名思義,所謂靜態鏈表,就是不能動態生成。
struct Student{
int num; //包括學號和分數連個變量。
int score;
struct Student *next; // 定義結構體指針,用來指向下一個節點,把節點“牽”起來
}; //首先定義一個結構體類型。
下面來生成一個帶有3個節點的靜態鏈表,並分別把各個節點的參數(num 和 score)打印出來。
第22中的 *p 是操作指針,它的作用是方便操作鏈表。
第23分別定義了3個節點。下面的代碼是把他們初始化。需要注意的是26中的c.next賦值爲空,如果不賦值的話,會出現段內存錯誤。
第28開始是對鏈表進行簡單的操作,即打印。
操作指針p先是賦值爲head,然後打印出head牽的節點的值(不是本身的參數,本身也並沒有參數)
然後 p = p->next;把操作節點向第2個節點移動,然後打印出(第二個節節點的參數)。
最後 p = NULL時,當然就可以停了。
這就是靜態鏈表。
2、接下來是動態鏈表
首先向來實現怎麼動態的創建一個鏈表吧。
先定義一個結構體類型,如上。然後定義一個creat的函數如下:
struct Student *creat(int i ){ //返回值是一個結構體指針,其中i是所要創建節點的個數
int n = 0; // 定義一個變量n,用來記錄節點的個數
struct Student *head, *p1, *p2; //head是待返回的指針,它是鏈表的頭指針, p1是開拓指針,用於創建節點,相當於先鋒官。 p2起到連接
//作用,用於連接已存在的鏈表好新創建的節點。
for(int j = 0; j < i; j++,n++){ //創建i個節點的循環,並記錄創節點的個數。
p1 = malloc(sizeof(struct Student)); //開闢一個新的節點;
scanf("%d%f",&p1->num,&p1->score); //輸入參數。
if(n == 1){
head = p1; //如果是第一個節點,那麼給頭頭賦值
}else{
p2 -> next = p1; // 這句配合下面的p2 = p1,目的是讓下一個節點指向新的節點。
}
p2 = p1;
} //循環結束
p1->next = NULL; //最後一個人沒人可“牽”;
return head; //返回頭部,鏈表完成。
}
原理圖大致如下:
1.第一個節點的創建
2.第2個節點。
照片來自《C程序設計》作者:譚浩強