C语言实现非循环双链表节点的删除(不带头结点)
2016-03-03 17:02
706 查看
不带头结点的非循环双链表在删除节点的时候比价麻烦,因为同时要维护prior和next两个指针。在处理第一个节点和最后一个节点的时候都要分别考虑,同时也需要考虑节点数量为1的情况。删除情况分为下面两类:
(1)删除pos位置的节点;
(2)判断x是否在链表中,若存在则删除;
代码上传至 https://github.com/chenyufeng1991/DeleteNodeDoubleList 。
核心代码如下:
(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; }
相关文章推荐
- leetcode - Remove Invalid Parentheses
- C语言 输入输出
- C语言宏定义,内置宏,__FILE__,__LINE__,## 用法
- C++中命名空间的意义与用法
- C/C++ 在处理文件所在路径下创建子目录
- C/C++ 在处理文件所在路径下创建子目录
- 转载 C++函数后加const
- C语言#line预处理
- c++中读写一行字符串和读写一个词之间的区别(c++ primer 5th)
- 2015.11--360校招面试-后台C++开发工程师
- 迅雷2013C++笔试卷B
- 线性表C++类实现
- opencl:改造C++接口增加对内存编译(compile)的支持
- _beginThread如何传递多个参数
- [C++] C++学习代码
- 1092. To Buy or Not to Buy (20)
- 阿里云服务器运行VS2013项目问题-C++操作数据库
- c/c++静态区 常量区 栈 堆
- C++ 128位 AES加密算法
- 2:编写虚幻引擎中的UC和C++代码