双向链表的查找与删除
双向链表的查找工作
解析:
使用next指针遍历,直到找到数据为data的节点,如果找到节点,返回节点,否则返回NULL;
- //查找节点,成功则返回满足条件的节点指针,否则返回NULL;
- Dbnode *FindNode(Dbnode *head,int data)
- {
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);