一、双向循环列表的操作
1.头删
void dele_head(double_p H)
{
if(H==NULL)
{
printf("入参为空,请检查\n");
return;
}
if(empty(H))
{
printf("表已空,无需删除\n");
return;
}
double_p dele = H->next;
H->next = dele->next;
dele->next->prior=H;
free(dele);
H->len--;
}
2.尾插
void insert_tail(double_p H,datatype data)
{
if(H==NULL)
{
printf("入参为空,请检查\n");
return;
}
double_p new = create_node(data);
if(empty(H))
{
H->next=new;
new->prior=H;
H->len++;
return;
}
double_p p = H;
while(p->next!=NULL)
{
p = p->next;
}
p->next = new;
new->prior = p;
H->len++;
}
3.按位置插入
void insert_pos(double_p H,int pos,datatype data)
{ if(H==NULL)
{
printf("入参为空,请检查\n");
return;
}
if(pos<1||pos>H->len+1)
{
printf("位置不合理\n");
return;
}
double_p new = create_node(data);
if(pos==1)
{
H->next=new;
new->prior=H;
H->len++;
return;
}
double_p p = H->next;
for(int i = 2;i<pos;i++)
{
p=p->next;
}
if(pos==H->len+1)
{
p->next = new;
new->prior = p;
H->len++;
return ;
}
new->next = p->next;
p->next->prior = new;
p->next = new;
new->prior = p;
H->len++;
}
4.按位置删除
void dele_pos(double_p H,int pos)
{
if(H==NULL)
{
printf("入参为空,请检查\n");
return;
}
if(pos<1||pos>H->len)
{
printf("位置不合理\n");
return;
}
double_p p = H->next;
if(pos==1)
{
double_p dele = H->next;
H->next=dele->next;
dele->next->prior=H;
free(dele);
H->len--;
return;
}
for(int i = 2;i<pos;i++)
{
p=p->next;
}
if(pos==H->len)
{
double_p dele = p->next;
p->next=NULL;
free(dele);
H->len--;
return;
}
double_p dele = p->next;
p->next = dele->next;
dele->next->prior = p;
free(dele);
H->len--;
}
二、思维导图