关于解释部分不再多说了,网上资料很多,下面就介绍具体的实现吧
//双向循环链表的插入与删除
typedef struct node{int data;
struct node *prev, *next;
}DNode, *DLinkList;
//在带有头结点双向循环链表中第1个数据域内容为x的结点右边插入一个数据信息为item的新结点
void insert(DLinkList list, int x, int data)
{
DNode *p = list->next, *q = NULL;//首先将q指向头结点后面的那个结点
if (NULL == list) {
return ;
}
while (p != list && p->data != x) //寻找第一个满足条件的结点
{
p = p->next;
}
if (p == list) //如果不存在满足插入条件的结点,则返回
{
printf( "there is no x element in the list" );
return ;
}
q = (DNode *)malloc(sizeof(DNode)); //申请一个新的结点
if (q == NULL) //判断内存分配是否成功
{
printf( "malloc error!" );
return ;
}
memset(q, 0, sizeof(q));
q->data = data;
q->prev = p; //插入新的结点
q->next = p->next;
p->next->prev = q;
p->next = q;
}
2、从带有头结点双向循环链表中删除第1个数据域内容为x的结点
void delete(DLinkList list, int x)
{
DNode *q = list->next;///首先q指向头结点后面的那个结点
if (NULL == list) {
return ;
}
while (q != list && q->data != x) //找到要删除的结点
{
q = q->next;
}
if (q == list) //如果不存在满足条件的结点,返回-1
{
printf( "there is no matched element in the list" );
return ;
}
q->prev->next = q->next; //删除结点
q->next->prev = q->prev;
free(q); //释放结点的内存空间
q = NULL;
}