1. 程式人生 > >[List]C語言實現連結串列

[List]C語言實現連結串列

   問題描述:資料結構中瞭解過連結串列,由一連串結點組成,有單向連結串列和雙向連結串列之分。以下為單向連結串列一些知識的學習。    連結串列結點:單向連結串列每個節點包含一個節點資料項,一個指向下一節點的指標。最後一個節點因為沒有下一個節點了,其指標為空指標, struct node {     int value;     struct node *next; }; struct node *first = NULL;  // 初始化連結串列空    由於這裡結構內有一個指向相同結構型別的指標成員,因此不能使用typedef的結構宣告方式。    建立節點:首先要為節點分配記憶體單元,然後把資料儲存到結點,最後把結點插入到連結串列。 struct node *new_node; new_node = malloc(sizeof(struct node));  //為節點分配記憶體空間    由於new_node是一個指向結構的指標,對其賦值可以用間接定址*,然後再用.操作符獲取其中變數,另外也可以用->操作符直接操作, (*new_node).value = 100; 或者 new_node->value = 100;     在連結串列頭插入結點, next_node->next = first; first = new_node;    此時first為連結串列頭,即第一個節點,其next指標指向節點自身。    搜尋連結串列:
for語句是首選,搜尋連結串列慣用法: for(p = first; p!=NULL; p = p->next) ……    刪除結點:首先要定位要刪除的結點,接著改變前一個結點,讓其繞過刪除結點,最後需呼叫free函式回收記憶體, struct node *delete_from_list(struct node *list, int n){     struct node *cur,*prev;    for(cur=list,prev=NULL;cur!=NULL&&cur->value!=n;prev=cur,cur=cur->next)        ;     if(cur==NULL)   // 未找到元素        return list;     if(prev==NULL)  // 元素在第一個結點        return list = list->next;     else        prev->next =cur->next;     free(cur);     return list; }    有序連結串列:
即連結串列中結點有序,按照結點中資料進行排序的。雖然有序連結串列的插入要麻煩一點,但是搜尋會更快,不需要從頭到尾的遍歷。