双向链表的查找与删除

双向链表的查找工作

解析:

使用next指针遍历,直到找到数据为data的节点,如果找到节点,返回节点,否则返回NULL;

  1. //查找节点,成功则返回满足条件的节点指针,否则返回NULL;
  2. Dbnode *FindNode(Dbnode *head,int data)
  3. {

      Dbnode *pnode=head;

      if(head==null)

        return NULL;

      while(pnode->next!=NULL &&pnode->data!=data)

        pnode=pnode->next;

      if(pnode->next==NULL)

        return NULL;

      return pnode;

    }

  在双向链表中节点p之前插入一个节点的操作运算如下(c描述):

    void DINSERT(DLINKLIST *p,Datatye x)

    {

      DLINKLIST *s;//插入节点

      s=(DLINKLIST *)malloc(sizeof(DLINKLIST));

      s->data=x;//存储数据x

      s->next=p;//s的next指针指向p

      p->prior->next=s;//p的前面的节点的next指向s

      s->prior=p->prior;//

      p->prior=s;

    }

在双向链表中删除节点p:

  void DELETE(DLINKLIST *p)

  {

     p->prior->next=p->next;

     p->next-prior=p->prior; 

     free(p);

  }

  循环链表的许多操作都是在首尾位置进行的,因此使用指向循环链表末尾节点的指针来标志一个线性表,实现某些操作会更容易。使用rear来标志循环链表的末尾节点;例如:将俩个线性链表L1,L2合并成一个表时,使用设立尾指针的循环链表表示时,设表L1用rear1表示,L2为rear2表示,L2从L1末尾开始接,只需要下面五句话;

p=rear1->next;q=rear2->next;rear1->next=q->next;rear2->next=p;free(q);

原文地址:https://www.cnblogs.com/hai5111/p/6228518.html