1

我在 C 中使用单链表,没有指向节点值的指针。所以,而不是:

struct _node 
{
  struct _node * next;
  void* value;
} node;

我有

struct _node 
{
   struct _node * next;
} node;

这样的列表有特殊名称吗?

编辑:

只是为了解释为什么这些列表很有用(我真的不明白为什么不赞成):

struct 
{
  node node;
  int i;
} s;

当我这样做时,我强制 struct s 有一个节点,但不必设置 void* 值。

我正在使用这个方案来保存我的任务信息,这些信息将在 FIFO 列表中。

4

4 回答 4

4

我不确定这是否有名字。它仍然是构建链接列表的有用方法,因为您可以将链接与数据放在一起,但仍将两者分开。

typedef struct _payload
{
    int x;
    double y;
    char * z;
} payload;

struct _node * pNode;
payload * pData;
pNode = malloc(sizeof(struct _node)+sizeof(payload));
pData = (payload *)(((char*)p)+sizeof(struct _node));
于 2011-08-18T21:43:07.033 回答
4

例如,这就是 linux 内核实现链表的方式。查看此链接或此链接或许多其他描述其链表实现的链接

至于您的实际问题,我认为该模式没有实际名称。这只是在 C 中做一个通用链表的一种方式。

于 2011-08-18T22:05:32.397 回答
1

您是在谈论将“列表机制”移动到单独的结构:

struct Single_Link;
struct Single_Link
{
    Single_Link * next;
};

从上面的结构可以得出:

struct Double_Link_Node
: public Single_Link_Node
{
    Single_Link * previous;
};

使用上述结构,您可以定义一个通用节点:

template <class Value_Type>
struct Node_Contains_Value
: public Single_Link
{
    Value_Type value;
};

或者您可以使用指向值的通用指针:

struct Node_Contains_Pointer
: public Single_Link
{
    void * pointer_to_value;
};

链表会维护一个指向第一个节点的指针:

template <class Value_Type>
struct Linked_List
{
    Node_Contains_Value * ptr_to_head_node;
    Node_Contains_Value * ptr_to_last_node;
};

如果这不是家庭作业,我强烈建议使用它,std::list因为它已经过彻底测试。

于 2011-08-18T23:46:27.647 回答
0

我认为 C 程序员只是将其称为“链表”,并将其视为链表的“正常”形式。只有在鼓励更多臃肿习语的语言中,在列表节点中拥有指向数据的指针,而不是仅仅将节点和数据存储在一起,才是常态。

于 2011-08-19T01:25:40.350 回答