代碼實作
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;
}