删除双向链表的头部
Deleting the head of doubly linked list
很抱歉提出如此低质量的问题,但我不知道为什么以下代码不起作用。
list指向节点的头部。
void DeleteHeadNode(Node** list, Node * node)
{
if ((*list) == node) {
Node * next = node->nextnode;
next->prevnode = NULL;
free(*list);
}
}
我猜 "doesn't work" 意味着 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
}
}
}
Node**
的用法作为别名使用。如果传递列表变量的地址,可以通过更改 Node*
值来更改它。
通过这种方式将传递的列表变量设置为空或第二个节点。
以下是使用模式。
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
从列表头设置到下一个节点字段的地址。因此 *list
的后续更改要么更改传递的列表变量,要么更改某个下一个节点字段。
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);
}
}
很抱歉提出如此低质量的问题,但我不知道为什么以下代码不起作用。
list指向节点的头部。
void DeleteHeadNode(Node** list, Node * node)
{
if ((*list) == node) {
Node * next = node->nextnode;
next->prevnode = NULL;
free(*list);
}
}
我猜 "doesn't work" 意味着 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
}
}
}
Node**
的用法作为别名使用。如果传递列表变量的地址,可以通过更改 Node*
值来更改它。
通过这种方式将传递的列表变量设置为空或第二个节点。
以下是使用模式。
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
从列表头设置到下一个节点字段的地址。因此 *list
的后续更改要么更改传递的列表变量,要么更改某个下一个节点字段。
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);
}
}