//申请头结点
lian tou()
{
lian h=(lian)malloc(sizeof(node));
if(h==NULL)
return NULL;
//初始化
h->len=0;
h->next=NULL;
h->pri=NULL;
//返回
return h;
}
//申请普通节点
lian jie(int ele)
{
lian new=(lian)malloc(sizeof(node));
if(new==NULL)
return NULL;
//初始化
h->data=ele;
h->next=NULL;
h->pri=NULL;
return new;
}
//判空
int kong(lian h)
{
if(h==NULL)
return -1;
return h->next==NULL;
}
//头插
void toucha(lian h,int ele)
{
if(h==NULL)
return;
//插入
//创建普通节点
lian s=jie(ele)
//连线
//第一个h->next指向空
s->next=h->next;
s->pri=h;
//头结点后继节点的前驱指向新结点
if(h->next!=NULL)
{
h->next->pri = s;
}
//头结点的后继指向新结点
h->next = s;
H->len++;
}
//尾插
void weicha(lian h,int ele)
{
if(h==NULL)
return;
//尾插
lian s=jie(ele);
//循环找到尾部
lian p=h;
while(p->next!=NULL)
{
p=p->next;
}
//连接
s->next=NULL;
s->pri=p;
p->next=s;
}
//头删
void toushan(lian h)
{
if(h==NULL)
return;
if(kong(h))
return;
//头删
lian del=h->next;
//如果链表数量多余1
if(del->next!=NULL)
{
del->next->pri=h;
}
//让头结点的后记保存第一个节点的后记
h->next=del->next;
free(del);
h->len--;
}
//尾删
void weishan(lian h)
{
if(h==NULL)
return;
if(kong(h))
return;
lian p=h;
while(p->next!=NULL)
{
p=p->next;
}
//让倒数第二个节点指空
p->pri->next=NULL;
free(p);
h->len--;
}
//按位置插入
void ancha(lian h,int pos,int ele)
{
if(h==NULL)
return;
//判断位置合理性
if(pos<0||pos>h->len)
return;
//保存头结点
lian p=h;
//找到位置
for(int i=0;i<pos-1;i++)
{
p=p->next;
}
//创建新节点
lian s=jie(ele)
//连线
s->next=p->next;
s->pri=p;
p->next=s;
p->next->pri=s;
h->len++;
}
//按位置删除
void anshan(lian h,int pos)
{
if(h==NULL)
return;
if(kong(h))
return;
if(pos<0||pos>h->len)
return;
//保存头结点
lian p=h;
for(int i=0;i<pos-1;i++)
{
p=p->next;
}
//找到位置
//保存
lian del=p->next;
//让
p->next=del->next;
if(del->next!=NULL)
{
del->next->pri=p;
}
free(del);
h->len--;
}