#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef int DataType;
typedef struct DLinkNode
{
DataType data;
struct DLinkNode *prior;
struct DLinkNode *rear;
}DLinkNode,*DLinkList;
// 不带头节点的双链表
int CreatDLinkList(DLinkList *L)
{
*L=NULL;
return 0;
}
// 插入元素
int InsertDLinkList(DLinkList *L,DataType x)
{
DLinkList p=*L;
DLinkNode *s=(DLinkNode *)malloc(sizeof(DLinkNode));
s->data=x;
s->rear=NULL;
s->prior=NULL;
if(p==NULL)
{
*L=s;
}
else
{
while(p->data>x && p->rear)
p=p->rear;
if(p== *L )
{
if(p->data>x)
{
// 后插入
s->prior=p;
p->rear=s;
}
else
{
// 前插入
s->rear=p;
p->prior=s;
*L=s;
}
}
else if(p==NULL)
{
// 尾插入
s->prior=p;
p->rear=s;
}
else
{
// 前插入
s->rear=p;
s->prior=p->prior;
p->prior->rear=s;
p->prior=s;
}
}
return 0;
}
/*
不带头节点的双链表需要传入头节点地址,可能会修改头节点地址
*/
int DeleteDLinkList(DLinkList *L,DataType x)
{
DLinkList p=*L;
while(p->rear && p->data==x)
{
p=p->rear;
}
if(p==NULL)
{
return 0;
}
else
{
if(p==*L)
{
if(p->rear == NULL)
{
*L=NULL;
free(p);
return 1;
}
else
{
p->rear->prior=NULL;
*L=p->rear;
return 1;
}
}
else
{
if(p->rear==NULL)
{
p->prior->rear=NULL;
free(p);
return 1;
}
else
{
p->rear->prior=p->prior;
p->prior->rear=p->rear;
free(p);
return 1;
}
}
}
return 0;
}
// 打印元素
void DisplayDLinkList(DLinkList L)
{
DLinkList p=L;
while(p)
{
printf("%d ",p->data);
p=p->rear;
}
printf("\n");
}
int main()
{
int i;
DLinkList L=NULL;
for(i=0;i<20;i++)
{
InsertDLinkList(&L,i);
}
DisplayDLinkList(L);
for(i=10;i<20;i++)
{
DeleteDLinkList(&L,i);
}
DisplayDLinkList(L);
return 0;
}
注意:不带头节点的插入和删除:需要考虑插入和删除为头节点的情况