双链表删除一个节点

写了一个删除双链表节点的程序,在这里记录一下,直接上代码,代码中的主要步骤都有注释。

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <stdlib.h>
  4 #include <assert.h>
  5 typedef struct NODE{
  6     struct NODE *prior;
  7     struct NODE *next;
  8     int value;
  9 }Node;
 10 void print(Node* rootp)
 11 {
 12     if(rootp==NULL)
 13     exit(1);
 14     Node*tmp=rootp->next;
 15     while(tmp)
 16     {
 17         printf("value=%d\n",tmp->value);
 18         tmp=tmp->next;
 19     }
 20 }
 21 int dll_insert(Node *rootp,int value);
 22 int dll_remove(Node *rootp,Node* node);
 23 int main ()
 24 {
 25     Node *p1=(Node*)malloc(sizeof(struct NODE));
 26     if(p1==NULL)
 27     return -1;
 28     p1->prior=NULL;
 29     p1->next=NULL;
 30     //p1->value=10;
 31     int value;
 32     printf("输入要插入的值\n");
 33     while(scanf("%d",&value)==1)
 34     dll_insert(p1,value);
 35
 36     print(p1);
 37     getchar();
 38     printf("输入要删除的值\n");
 39     Node*del=(Node*)malloc(sizeof(Node));
 40
 41     scanf("%d",&del->value);
 42     if(dll_remove(p1,del))
 43     {
 44         printf("没有要删除的节点\n");
 45         exit(2);
 46     }
 47     print(p1);
 48     return 0;
 49 }
 50 int dll_remove(Node *rootp,Node* node)
 51 {
 52     assert(node!=NULL);//断言node节点不为空
 53     Node *this=rootp->next;
 54
 55      while(this!=NULL)
 56      {
 57          if(this->value==node->value)
 58          break;
 59          this=this->next;
 60      }
 61      if(this->value==node->value)
 62      {
 63          if(this->prior==NULL)//this的前驱是rootp指针
 64          rootp->next=this->next;//先把this前驱的后继指向this的后继
 65          else
 66          this->prior->next=this->next;
 67          if(this->next==NULL) //this是最后一个节点
 68          rootp->prior=this->prior;
 69          else//把this后继的前驱指向this的前驱
 70          this->next->prior=this->prior;
 71          free(this);
 72          return 0;
 73      }
 74     return -1;
 75 }
 76 /*在任何一种情况下,新节点都应该插入this的next,新节点的next
 77      指向next节点*/
 78 /*根节点的next字段指向链表第一个节点,prior字段指向最后一个节点
 79 如果链表为空,这两个字段都为NULL*/
 80 /*链表第一个节点的prior字段和最后一个节点的next字段为NULL*/
 81  int dll_insert(Node *rootp,int value)
 82  {
 83      Node* this;
 84      Node* next;
 85      Node* new ;
 86      for(this=rootp;(next=this->next)!=NULL;this=next)
 87      {
 88          if(next->value==value)//双向链表中存在value值,退出
 89          return 0;
 90          if(next->value>value)//当前值大于要插入的值
 91          break;
 92      }
 93      new=(Node*) malloc(sizeof(struct NODE));
 94      if(new==NULL)
 95      return -1;
 96      new->value=value;
 97
 98      /*在任何一种情况下,新节点都应该插入this的next,新节点的next
 99      指向next节点*/
100      new->next=next;
101     this->next=new;
102     if(this!=rootp)
103     new->prior=this;
104     else
105     new->prior=NULL;//this就是根指针,也就是new为第一个节点,所以prior为NULL
106     if(next!=NULL)
107     next->prior=new;
108     else
109     rootp->prior=new;
110     //next值为NULL说明new为最后一个节点,所以根指针的prior字段指向new
111     return 1;//插入成功
112  }

原文地址:https://www.cnblogs.com/zydark/p/8889214.html

时间: 2024-10-14 06:03:49

双链表删除一个节点的相关文章

list链表之:从链表删除一个节点list_del

从链表删除一个节点使用接口list_del,使用list_del时要非常注意. list_del的实现如下: static inline void list_del(struct list_head *entry) { __list_del(entry->prev, entry->next); entry->next = LIST_POISON1; entry->prev = LIST_POISON2; } static inline void __list_del(struct

双链表删除/插入节点

//双链表删除节点 dnode *del(dnode *head, int num) { dnode *p1, *p2; p1 = head; while (num != p1->data && p1->next != NULL) { p1 = p1->next; } if (num == p1->data) { if (p1 == head) { head = head->next; head->pre = NULL; free(p1); } else

利用jQuery如何删除一个节点

利用jQuery如何删除一个节点:添加或者删除节点是常用的操作,本章节介绍一下如何删除一个节点,当然在jQuery中删除节点的函数不止一个,不过这里就介绍一下如何使用remove()函数实现此功能,代码如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.soft

二叉树中删除一个节点

二叉树的删除可以算是二叉树最为复杂的操作,删除的时候要考虑到很多种情况: 1.被删除的节点是叶子节点 2.被删除的节点只有左孩子节点 3.被删除的节点只有右孩子节点 4.被删除的有两个孩子节点 所以在删除的时候,这4种情况都必须考虑进去,并且这4中情况之下,还会有细的划分,下面就细说怎么删除. 在二叉树中想要删除一个节点,首先需要找到这个节点,由于二叉树在插入节点的时候会遵循一个原则,就是利用节点的值来判断 节点将被插入的位置(或者给节点加一个key,用key来判断).从根节点开始往下走,比当前

数据结构c语言中单链表删除最小值节点

一: LinkList Delete_Min(LinkList &L){    //L是带头结点的单链表,本算法删除其最小值结点    LNode *pre = L, *p=pre->next;  //p 为工作指针,pre 指向其前驱    LNode *minpre=pre, *minp=p;  //保存最小值结点及其前驱    while(p!=NULL){        if(p->data<minp->data){            minp=p;  //找到

p108 有序链表删除重复节点(leetcode 82)

一:解题思路 Time:O(n),Space:O(1) 二:完整代码示例 (C++版和Java版) C++: class Solution { public: ListNode* deleteDuplicates(ListNode* head) { ListNode* dummy = new ListNode(0); dummy->next = head; ListNode* prev = dummy; ListNode* cur = prev->next; while (cur!=NULL)

C语言实现非循环双链表节点的删除(不带头结点)

不带头结点的非循环双链表在删除节点的时候比价麻烦,因为同时要维护prior和next两个指针.在处理第一个节点和最后一个节点的时候都要分别考虑,同时也需要考虑节点数量为1的情况.删除情况分为下面两类: (1)删除pos位置的节点: (2)判断x是否在链表中,若存在则删除: 代码上传至 https://github.com/chenyufeng1991/DeleteNodeDoubleList  . 核心代码如下: //删除pos位置的节点 Node *deletePosList(Node *pN

C语言实现非循环双链表节点的删除(带头结点尾结点)

我在之前一篇博客<C语言实现非循环双链表节点的删除(不带头结点)>中详细讲解了不含头尾节点的双链表中删除一个节点,处理过程还是稍显麻烦.自从我们学习使用头尾节点来处理双链表后,删除过程就非常方便.代码上传至 https://github.com/chenyufeng1991/DeleteNodeDoubleLinkedList_HeadList . 核心代码如下: //删除pos位置的节点 int DeletePosList(Node *pHead,Node *pTail,int pos){

双链表(非循环)相关操作:创建、析构、删除、冒泡排序

struct dulnode { int val; dulnode *pre; dulnode *next; }; //这里创建的不是双循环链表 dulnode* create_dulnode(int n) { if (n <= 0) return NULL; int i = 0; dulnode *head, *p1, *p2; //生成头节点 head = new dulnode; head->val = rand() % RAND_MAX; head->pre = NULL; //