C語言的鍊錶實現

2021-09-25 10:38:00 字數 4463 閱讀 7449

鍊錶(linked list)是一種常見的基礎資料結構,是一種線性表,但是並不會按線性的順序儲存資料(想想陣列,元素是按照順序儲存的,即儲存區域連續)。由於不必須按順序儲存,鍊錶在插入的時候可以達到o(1)的複雜度,但是查詢乙個節點或者訪問特定編號的節點則需要o(n)的時間。

鍊錶結構分類:單向鍊錶、雙向鍊錶、迴圈鍊錶等等。有些煉表頭結點不儲存資訊,有些煉表頭節點儲存資訊。下面介紹最常用的單向鍊錶和雙向鍊錶。

單向鍊錶:鍊錶中最簡單的一種是單向鍊錶,它包含兩個域,乙個資訊域和乙個指標域。這個鏈結指向列表中的下乙個節點,而最後乙個節點則指向乙個空值(可以按照下圖理解)。一般這麼定義乙個單向鍊錶,next指標指向下乙個節點。

/*資料*/

4.雙向鍊錶:每個節點有兩個連線:乙個指向前乙個節點,(當此「連線」為第乙個「連線」時,指向空值或者空列表);而另乙個指向下乙個節點,(當此「連線」為最後乙個「連線」時,指向空值或者空列表),一般這麼定義乙個雙向鍊錶,prev指標指向上乙個節點,next指向下乙個節點。

/*資料*/

增加乙個節點:分為在首部和尾部增加乙個節點。一般**如下:

//在頭部新增節點 head是鍊錶的頭結點(頭結點儲存資訊)data為待新增的資料

plinkedlist addnodefirst(plinkedlist head, data data)

newnode->data = data;

newnode->next = head;

head = newnode;

return head;

}//尾部新增乙個節點

plinkedlist addnodeend(plinkedlist head, data data)

node->data = data;

node->next = null;

if(head == null)

/*頭結點為空時注意 如果直接用下面的方法找最後乙個節點時因為頭結點也為空 所以head->next沒有

這時候閃退 所以加了前面的判斷*/

h = head;

while(h->next != null)

h->next = node;

return head;

}

查詢資料:簡單起見,以id查詢,對應**如下。

/*找到第乙個滿足條件的節點(如果有多個滿足條件的結點)*/

pnode findnode(plinkedlist head, int id) else }

return null;

}

插入節點到指定位置:以id為關鍵字為例,**如下。

/*把data插到指定id的node後面, 可能會有多個重複的id 這裡插入到第乙個指定id的後面*/

plinkedlist insertnode(plinkedlist head, int id, data data)

newnode->data = data;

nfind = findnode(head, id);

if(nfind) else

return head;

}

刪除指定結點:以id為key的刪除操作如下。

/*刪除第乙個滿足要求的結點(如果有多個滿足要求的節點) status代表刪除狀態*/

plinkedlist deletenode(plinkedlist head, int id, int *status)

while(h) else

} else

} *status = 0;

return head;

}

獲取鍊錶長度:**如下。

int linkedlistlength(plinkedlist head) 

return cnt;

}

判斷鍊錶是否為空:**如下。

int linkedlistempty(plinkedlist head)
linkedlist.h

#ifndef __list_h__

#define __list_h__

typedef struct data, * pdata;

typedef struct node linkedlist, * plinkedlist, node, *pnode;

int linkedlistempty(plinkedlist head);

int linkedlistlength(plinkedlist head);

plinkedlist addnodefirst(plinkedlist head, data data);

plinkedlist addnodeend(plinkedlist head, data data);

pnode findnode(plinkedlist head, int id);

plinkedlist insertnode(plinkedlist head, int id, data data);

plinkedlist deletenode(plinkedlist head, int id, int *status);

#endif

linkedlist.c

#include "linkedlist.h"

#include #include int linkedlistempty(plinkedlist head)

int linkedlistlength(plinkedlist head)

return cnt;

} plinkedlist addnodefirst(plinkedlist head, data data)

newnode->data = data;

newnode->next = head;

head = newnode;

return head;

}plinkedlist addnodeend(plinkedlist head, data data)

node->data = data;

node->next = null;

if(head == null)

h = head;

while(h->next != null)

h->next = node;

return head;

}/*找到第乙個滿足條件的節點(如果有多個滿足條件的結點)*/

pnode findnode(plinkedlist head, int id) else }

return null;

}/*把data插到指定id的node後面, 可能會有多個重複的id 這裡插入到第乙個指定id的後面*/

plinkedlist insertnode(plinkedlist head, int id, data data)

newnode->data = data;

nfind = findnode(head, id);

if(nfind) else

return head;

}/*刪除第乙個滿足要求的結點(如果有多個滿足要求的節點) status代表刪除狀態*/

plinkedlist deletenode(plinkedlist head, int id, int *status)

while(h) else

} else

} *status = 0;

return head;

}

有錯誤的地方希望大家多多指正。(╥﹏╥)o鍊錶用來構建許多其它資料結構,如堆疊,佇列和他們的派生,大家可以自己試試。

C語言鍊錶實現。

主攻c語言教程已經接近尾聲,越發激起了學習資料結構的興趣。學習資料結構不能沒有語言功底,要不然各種錯誤不知如何除錯,使用語言也不是十分自然。這兩樣應該是相得益彰的,學好一種語言,靈活運用,像說話一樣,然後掌握技巧。在資料結構中 鍊錶是非常重要的。下面是對聯表的實現以及基本的操作函式。還有一些細節歸納...

鍊錶的C語言實現

編輯 c巨集例項 以下 摘自linux核心2.6.21.5原始碼 部分 展示了鍊錶的另一種實現思路,未採用ansi c標準,採用gnu c標準,遵從gpl版權許可。struct list head define list head init name define list head name st...

C語言中煉表的實現

首先定義個鍊錶 typedefstructnodenode node head null 在實現幾個操作函式 list list init void 初始化 status list destroy list 銷毀 status add node list const type 加入乙個節點 stat...