C语言实现链表节点的删除
程序员文章站
2022-10-30 20:50:35
对链表节点进行增删改查是最基本的操作,这篇博客将会来实现对节点的删除。其他的操作可参考《c语言实现链表的基本操作》这篇博客。删除某个节点有两个类型:
(1)删除i某个位置的节点;
(2)判断x值是否...
对链表节点进行增删改查是最基本的操作,这篇博客将会来实现对节点的删除。其他的操作可参考《c语言实现链表的基本操作》这篇博客。删除某个节点有两个类型:
(1)删除i某个位置的节点;
(2)判断x值是否在链表中,若存在则删除该节点;
核心代码如下:
//删除pos位置的节点 node *deleteposelement(node *pnode,int pos){ //需要一个头结点来维护 node *phead; node *pmove; int i = 1; if (pos <= 0 || pos > sizelist(pnode)) { printf("%s函数执行,输入pos值非法,删除节点失败\n",__function__); return null; } phead = pnode; pmove = pnode; //单独考虑删除第一个节点 if (pos == 1) { pmove = pmove->next; pnode = pmove; free(phead); printf("%s函数执行,删除pos=1位置元素成功\n",__function__); return pnode; } while (pmove != null) { if (i == pos - 1) { break; } i++; pmove = pmove->next; } free(pmove->next); pmove->next = pmove->next->next; printf("%s函数执行,删除pos=%d位置元素成功\n",__function__,pos); return pnode; } //判断x值是否在链表中,若存在则删除该节点 node *deletexelement(node *pnode,int x){ //一前一后两个指针,pmovepre是pmove的前一个节点 node *pmovepre; node *pmove; if (pnode == null) { printf("%s函数执行,链表为空,删除x=%d失败\n",__function__,x); return null; } pmovepre = pnode; pmove = pmovepre->next; //单独考虑第一个节点 if (pmovepre->element == x) { pnode = pmove; free(pmovepre); return pnode; } while (pmove != null) { if (pmove->element == x) { //找到该节点的前一个节点 pmovepre->next = pmove->next; free(pmove); break; } //同步前进 pmove = pmove->next; pmovepre = pmovepre->next; } if (pmove == null) { printf("%s函数执行,不存在x=%d,删除数据失败\n",__function__,x); return pnode; } printf("%s函数执行,删除x=%d成功\n",__function__,x); return pnode; }