簡體   English   中英

在C中設計鏈表實現

[英]Design of a linked list implementation in C

目前我正在為C中的公共數據結構創建一個小型庫。這主要用於學習目的,但我計划在其他項目中使用此庫來查看它的工作原理以及問題所在。 到目前為止,我對我的哈希和二叉樹實現感到滿意,但我無法決定鏈表的設計。

到目前為止實現的所有數據結構都使用void指針,並且不負責創建或銷毀數據,即它們僅引用數據。 一個設計目標是使它們盡可能通用,以提高可重用性。

關於鏈表,到目前為止我找到了三種方法:

  1. 專用列表頭 :列表具有專用列表頭,用作抽象數據類型。

  2. 僅限節點 :與上面的示例類似,只是所有函數都在list_nodelist_node 用於GLib

  3. 在有效負載中 :將list_node結構添加到有效負載數據,並使用宏計算有效負載的偏移量。 請參閱linux內核中的列表

  4. 編輯使用宏生成類型化列表 :使用宏來創建列表結構和函數的特定於類型的版本。

    1和2的示例:


/* list.h */
typedef struct list_t list;

typedef int (*comparator)(const void* a, const void* b);

list* list_new          (comparator c);
void  list_delete       (list* l);
void  list_insert_after (list* l, uint32_t index, void* data);
void  list_remove       (list* l, void* data);
uint32_t list_size      (list* l);
/* other functions operating on lists */

/* list.c */
#include "list.h"

typedef struct list_node_t {
  struct list_node_t* next;
  struct list_node_t* prev;
  void* data;
} list_node;

struct list_t {
  list_node* begin;
  list_node* end;
  uint32_t   size;
  comparator cmp;
}


現在回答這個問題:哪種方法最通用? 還有其他方法嗎?

我更喜歡第二種方法,即僅節點。

它具有極其簡單的優點,因為大多數列表操作(拆分,推送,彈出,子列表......)的結果本身就是列表。

另請注意,您缺少重要的列表操作,主要是push()pop() 您應該利用列表允許插入O(1)的事實。

請注意,您不一定要使用void *指針。 您可以使用宏粘貼技巧為通用類型安全數據結構生成類型/函數(通過將類型名稱附加到類型和函數)。

例如: http//sglib.sourceforge.net/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM