目录
1. 存储结构
//存储结构
typedef struct LNode {
int data;
struct LNode *next, *prior;
}LNODE, * LINKLIST;
2. 函数声明
//基本操作(14种)
LINKLIST InitList(LINKLIST L); //创建
void DestroyList(LINKLIST L); //销毁
void ClearList(LINKLIST L); //清空
bool ListEmpty(LINKLIST L); //判空
int ListLength(LINKLIST L); //求长度
bool GetElem(LINKLIST L, int i, int* e); //按位序取值
int LocateElem(LINKLIST L, int e, bool(*compare)(int, int)); //按值查找位序
bool PriorElem(LINKLIST L, int cur_e, int* pre_e); //查前驱
bool NextElem(LINKLIST L, int cur_e, int* next_e); //查后继
bool ListInsert(LINKLIST L, int i, int e); //插入元素
bool ListDelete(LINKLIST L, int i, int* e); //删除元素
void ListTraverse(LINKLIST L, void(*visit)(int)); //遍历输出链表元素
void ListTraverseBack(LINKLIST L, void(*visit)(int)); //倒叙输出元素
LINKLIST GetElemP(LINKLIST L, int i); //查询结点地址
3. 函数定义
(1)创建 & 销毁
LINKLIST InitList(LINKLIST L) {
L = (LNODE*)malloc(sizeof(LNODE)); //申请头结点
if (L) {
L->next = L->prior = L;
}
else {
exit(1);
}
return L;
}
void DestroyList(LINKLIST L) {
ClearList(L);
free(L); //释放头结点
}
void ClearList(LINKLIST L) { //保留头指针和头结点
LINKLIST p = L->next; //p指向首结点
while (p != L) {
p = p->next;
free(p->prior);
}
L->next = L->prior = L; //头结点 指针域指向自己
}
(2)前驱 & 后继
bool PriorElem(LINKLIST L, int cur_e, int* pre_e) {
LINKLIST p = L->next->next; //p指向第二个结点
while (p != L) { //未到表尾(头结点)
if (p->data == cur_e) {
*pre_e = p->prior->data;
return true;
}
p = p->next;
}
return false;
}
bool NextElem(LINKLIST L, int cur_e, int* next_e) {
LINKLIST p = L->next; //p指向首结点
while (p->next != L) { //未到尾结点
if (p->data == cur_e) {
*next_e = p->next->data;
return true;
}
p = p->next;
}
return false;
}