双向链表的头插 头删 尾插 尾删
//头插插入
Doublelink insert_head(Doublelink head,datatype element)
{
Doublelink s=creat_Node();
s->data=element;
//判断是否有空链表
if(NULL==head)
{
head=s;
}
else
{
s->next=head;
head->prior=s;
head=s;
}
return head;
}
//头删
Doublelink del_head(Doublelink head)
{
if(NULL==head)
{
return head;
}
else
{
Doublelink del=head;
head=head->next;
head->prior=NULL;
free(del);
del=NULL;
}
return head;
}
//尾插
Doublelink insert_rear(Doublelink head,datatype element)
{
Doublelink s=creat_Node();
s->data=element;
if(NULL==head)
{ head=s;}
else
{
Doublelink p=head;
while(p->next)
{
p=p->next;
}//找到最后一个结点
p->next=s;
s->prior=p;
}
return head;
}
//尾删
Doublelink del_rear(Doublelink head)
{
if(NULL==head)
return head;
if(head->next==NULL)
{
free(head);
head=NULL;
return head;
}
else
{
//找到最后一个结点
Doublelink del=head;
while(del->next)
{
del=del->next;
}
del->prior->next=NULL;
free(del);
del=NULL;
}
return head;
}
按任意元素插入,删除,修改,查找
//双链表任意位置插入
Doublelink insert_element(Doublelink head,int index,datatype key)\
{
//创建一个结点
Doublelink s=creat_Node();
s->data=key;
//首先找到所插入的位置
int count=1;
Doublelink p=head;
if(index==1||head==NULL)//在为空和第一个位置插入
return head=insert_head(head,key);
//如果只有一个元素的情况下
if(head->next==NULL)
return head=insert_rear(head,key);
while(p)//在第二个以及往后的位置插入
{
count++;
p=p->next;
if(count==index)
{
s->next=p;
p->prior->next=s;
s->prior=p->prior;
p->prior=s;
}
}
return head;
}
//双链表按任意位置删除
Doublelink del_key(Doublelink head,int index)
{
if(NULL==head)
{
return head;
}
else if(head->next==NULL)
{
free(head);
head=NULL;
return head;
}
else{
Doublelink p=head;
int count=1;
while(p)
{
count++;
p=p->next;//p位于要删除的元素
if(p->next==NULL)//删除最后一个元素
{
return head=del_rear(head);
}
if(count==index)//找到要删除的元素的位置(2-n-1)
{
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);
p=NULL;
}
}
return head;
}
}
Doublelink update(Doublelink head,int index,datatype element)
{
Doublelink p=head;
for(int i=1;i<index;i++)
{
p=p->next;
}
p->data=element;
return head;
}
int find(Doublelink head,datatype key)
{
Doublelink p=head;
int flag=0;
while(p)
{
flag++;
if(p->data==key)
{
break;
}
p=p->next;
}
return flag;
}
栈和队列的区别:栈是先进后出,可以在一端进行操作,逻辑连续物理不一定连续,队列是先进先出,在两端操作,内存连续
内存泄漏:在释放的时候,指针没有指向首地址而是指向了中间的某一块地址