代码实现
typedef struct node
{
int data;//数据域
struct node *next;
struct node *prev;
}NODE,*PNODE;
PNODE init_dc_list(void)//双向循环链表的初始化
{
PNODE phead = malloc(sizeof(NODE));
if(phead ==NULL)
return phead;
phead->prev = phead;
phead->next = phead;
return phead;
}
PNODE new_node(int dat)//新建一个节点
{
PNODE pnew = malloc(sizeof(NODE));
if(pnew ==NULL)
return pnew;
pnew->data = dat;
pnew->prev = pnew;
pnew->next = pnew;
return pnew;
}
//把地址为pnew的节点插入到双向循环链表的尾部(头节点的前面)
bool list_add_tail(PNODE phead,PNODE pnew)
{
if(pnew == NULL || phead == NULL)
return false;
phead->prev->next = pnew;
pnew->prev = phead->prev;
phead->prev = pnew;
pnew->next = phead;
return true;
}
void show_dc_list(PNODE phead)//双向循环链表的遍历
{
PNODE p;
if(phead == NULL)
return;
p = phead->prev;
while(p != phead)
{
printf("%d\t",p->data);
p = p->prev;
}
printf("\n");
}
//删除双向循环链表中地址为pdel的节点
bool del_dc_node(PNODE phead,PNODE pdel)
{
PNODE p;
if(phead == pdel || phead == NULL || pdel == NULL)
return false;
p = phead->next;
while(p != phead)
{
if(p == pdel )
break;
p = p->next;
}
if(p != pdel)
return false;
pdel->prev->next = pdel->next;
pdel->next->prev = pdel->prev;
pdel->next = pdel->prev = NULL;
return true;
}
PNODE find_node(PNODE phead,int dat)//双向循环链表的查找
{
if(phead == NULL)
return phead;
PNODE p = phead->next;
while(p != phead)
{
if(p->data == dat)
break;
p = p->next;
}
if(p == phead)
{
printf("dat is not in link list\n");
return NULL;
}
return p;
}