//定义
typedef struct DNode //定义双链表结点类型
{
ElemType data; //数据域
struct DNode *prior , *next; //前驱和后继指针
}DNode , *DLinkList;
//初始化
bool InitDLinkList(DLinkList &L)
{
L = new DNode; //分配一个头结点
if (L == NULL)
return false; //内存不足,分配失败
L->prior = NULL; //头结点的prior永远指向NULL
L->next = NULL; //头结点之后暂时没有结点
return true;
}
//判空操作
Status Empty(DLinkList L)
{
return (L == NULL);
}
//取值
Status GetElem_D(DLinkList L, int i, ElemType &e)
{
int j = 1;
DNode *p = L->next;
while (p && j < i)
{
p = p->next;
j++;
}
if (!p || j > i)
return error;
e = p->data;
return ok;
}
//插入,在带头结点的双向链表L中的第i个位置之前插入元素e
Status ListInsert_D(DLinkList &L , int i, ElemType &e)
{
DNode *p = L; //p指向头结点
int j = 0;
while (p && j < i - 1)
{
p = p->next; //找到要删除结点的前驱结点
j++;
}
if (!p|| j > i - 1)
return error;
DNode *s = new DNode; //new一个新结点s
s->data = e; //将元素e存放在新结点的数据域
s->prior = p->prior; //将第ai-1个结点的地址存放在新结点s的prior中
p->prior->next = s; //将新结点s的地址存放在第ai-1个结点的next域中
s->next = p; //将第i个结点的地址存放在新结点s的next域中
p->prior = s; //将新结点s的地址存放在第ai个结点的prior中
return ok;
}
//删除,删除带头结点的双向链表L中的第i个元素,并用e返回
Status LsitDelete_D(DLinkList &L, int i, ElemType &e)
{
DNode *p = L; //p指向头结点
int j = 0;
while (p->next && j < i-1)
{
p = p->next;
j++;
}
if (!(p->next) || j > i - 1)
return error;
e = p->data; //e保存要删除结点的数据域
p->prior->next = p->next; //将ai+1个结点的地址存放在ai-1结点的next域中
p->next->prior = p->prior; //将ai-1结点的地址存放在ai+1结点的prior域中
free(p); //释放结点
return ok;
}