很抱歉这么低质量的问题,但我不知道为什么以下代码不起作用。
列表指向节点的头部。
void DeleteHeadNode(Node** list, Node * node)
{
if ((*list) == node) {
Node * next = node->nextnode;
next->prevnode = NULL;
free(*list);
}
}
答案 0 :(得分:0)
我猜“不起作用”意味着list
在你的功能之后不再有效 - 这将是真的。
你应该
void DeleteHeadNode(Node** list, Node* node)
{
if ((node != NULL) && (*list == node)) // check node being deleted
{
Node* next = node->nextnode;
if (next != NULL) // ensure next exists
{
next->prevnode = NULL;
free(*list);
list = &next; // update pointer to head of list
}
else // no next, list is now becoming empty
{
free(*list);
list = NULL; // update pointer to head of list
}
}
}
答案 1 :(得分:0)
Node**
的使用用作别名。如果传递了列表变量的地址,可以通过更改Node*
值来改变它。
通过这种方式,可以将传递的列表变量设置为null或第二个节点。
以下是使用模式。
void DeleteNode(Node** list, int data)
{
while (*list != NULL && (*list)->data != data) {
list = &(node->nextnode);
}
if (*list != NULL) {
Node* found = *list;
*list = found->nextnode;
if (found->nextnode != NULL) {
found->nextnode->prevnode = *list;
}
free(found);
}
}
用法:
Node* list;
...
DeleteNode(&list, ...);
上一个节点(prevnode
,双链表)并不是必需的。
感兴趣的是while
循环:别名list
从列表头设置到nextnode字段的地址。因此,*list
的后续更改会更改传递的列表变量或某个nextnode字段。
void SortedInsertNode(Node** list, int data)
{
Node* node = (Node*) malloc(sizeof(Node));
node->data = data;
node->prevnode = NULL;
node->nextnode = NULL;
while (*list != NULL && data >= (*list)->data) {
node->prevnode = *list;
list = &(node->nextnode);
}
node->nextnode = *list;
*list = node;
if (node->nextnode != NULL) {
node->nextnode->prevnode = *list;
}
}
删除头部:
void DeleteHead(Node** list)
{
if (*list != null) {
Node* dead = *list;
*list = (*list)->nextnode;
(*list)->prevnede = NULL;
free(dead);
}
}