C语言实现非循环双链表节点的删除(不带头结点)
Posted 乞力马扎罗的雪CYF
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言实现非循环双链表节点的删除(不带头结点)相关的知识,希望对你有一定的参考价值。
不带头结点的非循环双链表在删除节点的时候比价麻烦,因为同时要维护prior和next两个指针。在处理第一个节点和最后一个节点的时候都要分别考虑,同时也需要考虑节点数量为1的情况。删除情况分为下面两类:
(1)删除pos位置的节点;
(2)判断x是否在链表中,若存在则删除;
代码上传至 https://github.com/chenyufeng1991/DeleteNodeDoubleList 。
核心代码如下:
//删除pos位置的节点 Node *deletePosList(Node *pNode,int pos){ //注意需要单独考虑第一个节点和最后一个节点 int i = 1; int size = sizeList(pNode); Node *pMove; pMove = pNode; //链表为空 if (pNode == NULL) { printf("%s函数执行,链表为空,删除节点失败\n",__FUNCTION__); return pNode; } //链表只有一个节点,删除第一个节点 if (pos == 1 && size == 1) { free(pNode); pNode = NULL; printf("%s函数执行,删除pos=%d位置的节点成功\n",__FUNCTION__,pos); return NULL; } //链表节点大于1,删除第一个节点 if (pos == 1) { pNode = pNode->next; pNode->prior = NULL; free(pMove); pMove = NULL; printf("%s函数执行,删除pos=%d位置的节点成功\n",__FUNCTION__,pos); return pNode; } while (pMove != NULL) { if (i == pos && pos != size) { pMove->prior->next = pMove->next; pMove->next->prior = pMove->prior; free(pMove); pMove->next = NULL; printf("%s函数执行,删除pos=%d位置的节点成功\n",__FUNCTION__,pos); return pNode; } if (i == pos && pos == size) { pMove->prior->next = NULL; free(pMove); pMove = NULL; printf("%s函数执行,删除pos=%d位置的节点成功\n",__FUNCTION__,pos); return pNode; } i++; pMove = pMove->next; } printf("%s函数执行,删除pos=%d位置的节点失败\n",__FUNCTION__,pos); return pNode; } //判断x是否在链表中,存在则删除之 Node *deleteValueList(Node *pNode,int x){ Node *pMove; pMove = pNode; int size = sizeList(pNode); //原链表为空 if (pNode == NULL) { printf("%s函数执行,原链表为空,删除节点失败\n",__FUNCTION__); return NULL; } //删除的是第一个节点,并且链表长度为1 if (pNode->element == x && size == 1) { free(pNode); pNode = NULL; printf("%s函数执行,删除值为%d节点成功\n",__FUNCTION__,x); return pNode; } //单独考虑删除第一个节点的情况,且链表长度大于1 if (pNode->element == x) { pNode = pNode->next; free(pNode->prior); pNode->prior = NULL; printf("%s函数执行,删除值为%d节点成功\n",__FUNCTION__,x); return pNode; } while (pMove != NULL) { //要删除的节点不是最后一个 if (pMove->element == x && pMove->next != NULL) { pMove->prior->next = pMove->next; pMove->next->prior = pMove->prior; free(pMove); pMove = NULL; printf("%s函数执行,删除值为%d节点成功\n",__FUNCTION__,x); return pNode; } //要删除的是最后一个节点 if (pMove->element == x && pMove->next == NULL) { pMove->prior->next = NULL; free(pMove); pMove = NULL; printf("%s函数执行,删除值为%d节点成功\n",__FUNCTION__,x); return pNode; } pMove = pMove->next; } printf("%s函数执行,删除值为%d节点失败\n",__FUNCTION__,x); return pNode; }
以上是关于C语言实现非循环双链表节点的删除(不带头结点)的主要内容,如果未能解决你的问题,请参考以下文章