1.双链表的结构体定义
typedef struct dLNode
{
datatype data;
struct dLnode* prior;//前驱指针
struct dLnode* next; //后继指针
}DLNode,*DLinkList;
2.双链表的初始化
int InitDLinkList()
{
DLinkList L;
L=(DNode*)malloc(sizeof(DNode));
if(L==NULL)
return 0;
L->prior=NULL;
L->next=NULL;
return 1;
}
void main()
{
InitDLinkList();
}
3.双链表的插入
int InsertElem_DL(LinkList L,int i,ElemType e)
{
int j=0;
DLNode* p;
p=L;
while(p&&j<i-1)
{
p=p->next;
++j;
}
if(!p||j>i-1)
return 0; //i的取值非法,插入失败
DLNode* s;
s=(LinkList)malloc(sizeof(LNode));//为新结点s分配地址空间
s->data=e;
//双链表插入核心代码(原理见下图)
s->prior=p->prior; //此时的p已经由GetElemP_DuL函数找到,p指向了要插入的位置
p->prior->next=s;
s->next=p;
p->prior=s;
}
截图自青大王卓
王道考研视频对此的处理
4.双链表的删除
第一步:p->prior->next=p->next
int DeleteE_DuL(LinkList L,int i,ElemType* e)
{
int j=0;
DLNode* p;
p=L;
while(p&&j<i-1)
{
p=p->next;
++j;
}
if(!p||j>i-1)
return 0; //i的取值非法,插入失败
*e=p->data;
//双链表删除核心代码(原理见下图)
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);
return 1;
}