鏈表由多個節點構成,節點之間可以靈活的插入、刪除。鏈表以結構體的自引用原理,可以在內存中以不連續的方式動態分配內存來存儲數據,這樣的結構體就是鏈表的一個節點。 一個節點分爲兩個域:一個是數據域,一個是指針域,這方便鏈表在存儲數據的同時可以方便地找到下一個節點。
相比於數組:數組定義相對簡單些,是以連續的內存存儲數據,在定義時就確定了長度,這樣相比於鏈表的動態存儲,數組就存在有可能數據不夠長或內存浪費的缺點。
對於單鏈表,在此從建立鏈表開始,實現鏈表的增添、刪除和輸出鏈表內容。由於鏈表是動態存儲,節點的內存是基於malloc函數動態分配的,所以刪除節點時或銷燬鏈表時一定記得手動釋放內存,避免內存泄露。
例:
#include <stdio.h> #include <stdlib.h> //定義節點類型 typedef struct Node { int data; struct Node* next; }Node; //創建鏈表 Node* createlb() { Node* head=(Node*)malloc(1*sizeof(Node)); head->next=NULL; return head; } //添加節點(從最後添加) void add_node(Node* head,int _data) { Node* curr=head; Node* newnode=(Node*)malloc(1*sizeof(Node)); newnode->next=NULL; newnode->data=_data; while(curr->next!=NULL) { curr=curr->next; } curr->next=newnode; } //輸出鏈表內容 void printlb(Node* head) { Node* curr=head->next; while(curr!=NULL) { printf("%d\n",curr->data); curr=curr->next; } } //刪除節點 void delete_node(Node* head,int old_data) { Node* curr=head->next; Node* temp1=head; Node* temp2=NULL; while(curr!=NULL) { if(curr->data==old_data) { temp1->next=curr->next; temp2=curr; free(temp2); temp2=NULL; } else { temp1=temp1->next; } curr=curr->next; } } //釋放節點 void freelb(Node* head) { Node* curr=head->next; Node* temp=head; while(curr!=NULL) { curr=curr->next; free(temp); temp=NULL; temp=curr; } head=NULL; } int main(int argc, char const *argv[]) { Node* head=createlb(); int i; for(i=0;i<10;i++) { add_node(head,i+1); } add_node(head,3); add_node(head,3); printlb(head); printf("\n"); delete_node(head,3); delete_node(head,1); printlb(head); freelb(head); return 0; }