一、鏈表中結點的存儲
鏈表的結點左邊一部分是存放的數據,右邊一部分是后繼指針指向下一個結點的地址。C語言中通常定義一個結構體類型來存儲一個結點,如下:
struct node { int data; struce node *next; //下一個結點的類型也是struct node,所以后繼指針的類型也必須是struct node * };
二、讓我們把結點連起來吧(頭插法)
想要把結點一個個串起來,還需要三個struct node *類型的指針:head(頭指針,指向鏈表的開始,方便從頭遍歷整個鏈表)、p(臨時指針,指向那些還未連接的結點)、q(當前指針,指向當前最新串入的結點)。
當鏈表還沒有建立時,頭指針head為空。
struct node *head; head=NULL; //頭指針初始為空
現在我們來創建第一個結點,並用臨時指針p指向這個結點。
struct node *p; p=(struct node *)malloc(sizeof(struct node)); //為新結點動態申請一個空間,並用臨時結點p指向這個新地址 scanf("%d",&a); //讀取數據 p->data=a; //將數據存儲到當前結點的data域中 p->next=NULL; //設置當前結點的后繼指針指向空,也就是當前結點的下一個結點為空
把新加入的結點串進鏈表。如果該結點是創建的第一個結點,則將頭指針指向這個結點再將當前指針指向這個結點;如果該結點不是第一個,則將上一個結點的后繼指針指向該結點再修改當前指針指向這個新結點。
if(head==NULL) head=p; else q->next=p; q=p; //最后指針q也指向當前結點
三、釋放鏈表
不釋放動態申請的空間,代碼運行也不會出錯,但這樣會很不安全。使用free()函數可以釋放由malloc()申請的內存空間。
t=head;
u=t; while(t!=NULL){ u=t->next;//t指向的結點內存空間釋放后就不存在t->next這一說了,所以要提前讓另一個指針指向t的下一個結點 free(t); t=u; }
四、建立鏈表並遍歷輸出最后釋放內存空間的完整代碼
#include <stdio.h> #include <stdlib.h> struct node { int data; struct node *next; }; int main() { struct node *head,*p,*q,*t,*u; int i,n,a; scanf("%d",&n); head=NULL; for(i=0;i<n;i++){ p=(struct node *)malloc(sizeof(struct node)); scanf("%d",&a); p->data=a; p->next=NULL; if(head==NULL) head=p; else q->next=p; q=p; } //輸出鏈表 t=head; while(t!=NULL){ printf("%d ",t->data); t=t->next; } //釋放鏈表 t=head; u=t; while(t!=NULL){ u=t->next; free(t); t=u; } return 0; }