C 具有虚拟头和尾的双链表实现

C 具有虚拟头和尾的双链表实现,c,C,我的意见如下: typedef结构d_节点d_节点t struct d_node { void *data; d_node_t *next; d_node_t *prev; }; typedef struct d_list d_list_t; struct d_list { d_node_t head; d_node_t tail; }; 如何实现d_list_t*DListCrea

我的意见如下: typedef结构d_节点d_节点t

struct d_node
    {
        void *data;
        d_node_t *next;
        d_node_t *prev;
    };
typedef struct d_list d_list_t;
struct d_list
    {
        d_node_t head;
        d_node_t tail;
    };
如何实现d_list_t*DListCreate(void)函数

我不知道如何实现所需的DListCreate

您的
DListCreate()
函数可能会创建一个空列表,对吗?这意味着没有实际的节点,只有虚拟的头部和尾部节点。所以问问自己,如果没有实际的节点,
head->next
应该指向什么?同样地,
tail->prev
应该指向什么?创建空列表所需要做的就是创建一个
d_列表
结构,然后适当地设置
指针


提示:
myDList.tail
的地址是
&(myDList.tail)

我觉得您对
struct d_list
的定义是错误的
head
tail
应该是指针,不是吗?如果要求两端都有虚拟对象,那么我想你只需要做head.next point to tail和tail.prev point to head。有固定的头和尾真的很奇怪。正如@cleblanc指出的,这些应该是指针,因为它们经常变化。如果d_列表的非指针成员是假人,并且只有它们的dummy.head.next指向实际的head,dummy.tail.prev指向实际的tail,那么typedef是有意义的。似乎有点双重间接,但应该有效。可能是dummy.tail.next=NULL和dummy.head.prev=NULL。@Yunnosch签名是
d\u list\u t*DListCreate(void)
,所以我认为它需要malloced?大部分看起来不错!我想你需要
myDList->head
tail
,因为
myDList
是一个指针。然后你可以直接使用
myDList->head.data
等,而不是取消对它们的引用并使用
->
访问成员。哦,这里的一些海报强烈地感觉到你(尽管我都很好)也混淆了
新列表
myDList
-你需要保持一致。是的,“你说得对!”安相应地更新你的答案,以帮助更多的读者。
d_list_t *DListCreate(void)
{
    d_list_t *myDList = (d_list_t*)malloc(sizeof(d_list_t));

    if (new_d_list == NULL)
    {
        return(NULL);

    }
   &(myDList.tail)->data = NULL;
   &(myDList.tail)->next = NULL;
   &(myDList.tail)->prev = &(myDList.head)

   &(myDList.head)->data = NULL;
   &(myDList.head)->next = &(myDList.tail);
   &(myDList.head)->prev = NULL;

   return(myDList);
}