C 具有虚拟头和尾的双链表实现
我的意见如下: typedef结构d_节点d_节点tC 具有虚拟头和尾的双链表实现,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
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);
}