线性表之双向链表

//*******************************双向链表************************

#include <stdio.h>
#include <stdlib.h>

//============状态量========
#define OK 1
#define ERROR 0
//==================ADT 双链表结构说明===================
typedef int ElemType;
typedef struct DNode{
ElemType data;
struct DNode *prior;
struct DNode *next;
}DListNode;
typedef DListNode *DLinkList;                 //节点

//=========================模块定义=============

/* 内置函数 定义 */
static DLinkList newNode(){
DLinkList pNew = (DLinkList)malloc(sizeof(DListNode));
if(pNew != NULL){
pNew->next = pNew->prior = NULL;
}
return pNew;
}

/* 初始化 */
void InitList(DLinkList *L){
(*L) = newNode();
if(*L == NULL){
printf("初始化失败！\n");
exit(EXIT_FAILURE);
}
}

/* 销毁表 */
void DestroyList(DLinkList L){
DLinkList p = L;
DLinkList q = p->next;
while(q != NULL){
free(p);
p = q;
q = p->next;
}
free(p);
}

/* 判断表空 */
int ListEmpty(DLinkList L){
return (L->next == NULL);
}

/* 求表长 */
int ListLength(DLinkList L){
DLinkList p = L;
int i = 0;

for(;p->next != NULL;p = p->next)
i++;
return i;
}
/* 输出表 */
void DispList(DLinkList L){
DLinkList p = L->next;
while(p != NULL){
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
/* 获取元素 */
int GetElem(DLinkList L, int i, ElemType *e){
int j = 0;
DLinkList p = L;
while(j < i && p != NULL){
j++;
p = p->next;
}
if(p == NULL)
return ERROR;
else{
*e = p->data;
return OK;
}
}
/* 求元素位置 */
int LocateElem(DLinkList L, ElemType e){
int i = 1;
DLinkList p = L->next;
while(p != NULL && p->data != e){
i++;
p = p->next;
}
if(p == NULL)
return ERROR;
else
return i;
}
/* 插入元素 */
int InsertList(DLinkList L, int i, ElemType e){
int j = 0;
DLinkList p = L;
DLinkList pNew = NULL;

while(j < i - 1 && p != NULL){
j++;
p = p->next;
}
if(p == NULL)
return ERROR;
else{
pNew = newNode();
pNew->data = e;
pNew->next = p->next;                //先连后面
if(p->next != NULL)                  //p如果是尾节点
p->next->prior = pNew;
p->next = pNew;
pNew->prior = p;
return OK;
}
}
/* 删除指定位置元素，并返回其值 */
int DeleteList(DLinkList L, int i, ElemType *e){
int j = 0;
DLinkList p = L;
DLinkList q = NULL;

while(j < i - 1 && p != NULL){                 //查找前驱节点
j++;
p = p->next;
}
if(p == NULL)
return ERROR;
else{
q = p->next;                             //被删除节点
if(q == NULL)                            //如果不存在
return ERROR;
*e = q->data;
p->next = q->next;
if(q->next != NULL)                     //如果不是删除最后一个节点
q->next->prior = p;
free(q);
return OK;
}
}