[英]What should I use in ANSI C to create linked lists?
在Java中,我使用LinkedList<T>
。
是否有任何標准或其他庫來在C中創建LinkedList?
不,C沒有這樣的東西。 如果可以使用C ++,則有std::list
。
您必須自己用C編寫結構。
就像其他人所說的那樣,C中不存在對鏈接列表的標准庫支持。這意味着您可以自己滾動(就像大多數人在C編碼生涯中做過一次或多次)一樣,或者您可以查看其他庫為了支持。
對於大多數用途,您會發現“侵入式”實施是合適的。 您可以修改現有結構,使其包含指向列表中下一項的指針(如果要進行雙向鏈接,則指向上一項)。
typedef struct TheStruct TheStruct;
struct TheStruct
{
...the real data...
TheStruct *next;
//TheStruct *prev;
};
現在,您的列表包含一個指向標題的簡單指針:
TheStruct *head = 0;
TheStruct *allocated_node = new_TheStruct(value1, value2, ...);
assert(allocated_node->next == 0);
// Insert new allocated node at head of list
allocated_node->next;
head = allocated_node;
如果讓線程訪問同一列表,則必須擔心線程問題,依此類推。
因為此代碼非常簡單,所以這是最常處理的方式。 從列表中刪除節點比較麻煩,但是您可以編寫一個函數來實現。
人們已經用復雜程度不同的宏修飾了這種基本方案,以便處理不同類型列表的代碼可以使用相同的宏。 Linux內核使用基於宏的鏈接列表集來管理其鏈接列表數據結構。
“侵入式”實現的替代方案(之所以這樣稱呼是因為它需要更改結構以包括列表指針),它具有一些通用的列表機制:
typedef struct GenericList GenericList;
struct GenericList
{
void *data;
GenericList *next;
//GenericList *prev;
};
現在,您可以將(未指向)未修改的結構放入列表中。 您會失去一些類型安全性; 沒有什么可以阻止您將隨機不同的結構類型添加到應為同類的列表中。 您還必須與指向的數據分開為GenericList結構分配內存。
您還必須確保您了解數據的所有權屬性,以便正確釋放數據(不泄漏,不多重釋放,釋放后不訪問)。 比較而言,管理列表本身的內存是孩子的事。
使用GenericList機制,您可能會擁有一個函數庫來為您管理列表操作。 再次,搜索應顯示此類列表的實現。
C尚未提供標准容器結構。 您必須自己動手。
默認情況下不存在,但是可以很容易地使它。
基本上,鏈接列表是指向1st元素的標頭指針和指向null的結束文件。
元素實際上是節點,包含對象和指向下一個節點的指針。
因此,盡管在C語言中沒有類,而只有結構,但是制作一個基本的類很容易,盡管這樣可能很痛苦。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.