1. DLinkList.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
typedef int elemType;
typedef struct DNode {
elemType data;
struct DNode* prior;
struct DNode* next;
}DNode, *DLinkList;
bool initDList(DLinkList& L); //初始化
bool isEmpty(DLinkList L); //判断双链表是否为空
bool insertNextDNode(DNode* p, DNode* s); //在p结点之后插入s结点
bool deleteNextDNode(DNode* p); //删除P结点的后继结点
void destoryDList(DLinkList& L); //销毁链表
bool listInsert(DLinkList L, int i, elemType e); //在第i个位置插入元素e
DNode* getElem(DLinkList L, int i); //按位查找,返回第i个结点
DNode* locateElem(DLinkList L, elemType e); //按值查找,返回数据域等于e的结点
void listPrint(DLinkList L); //输出双链表
2. DLinkList.cpp
#include"DLinkList.h"
bool initDList(DLinkList& L) {
L = (DNode*)malloc(sizeof(DNode));
if (L == NULL) {
return false;
}
L->prior = L->next = NULL;
return true;
}
bool isEmpty(DLinkList L) {
if (L->next == NULL) {
printf("双链表为空\n");
return true;
}
printf("双链表不为空\n");
return false;
}
bool insertNextDNode(DNode* p, DNode* s) {
if (p == NULL || s == NULL) {
return false;
}
s->next = p->next;
if (p->next != NULL) { //如果p结点有后继结点
p->next->prior = s;
}
s->prior = p;
p->next = s;
return true;
}
bool deleteNextDNode(DNode* p) {
if (p == NULL) { //非法参数
return false;
}
DNode* q = p->next;
if (q == NULL) { //p没有后继
return false;
}
p->next = q->next;
if (q->next != NULL) { //q结点不是最后一个结点
q->next->prior = p;
}
free(q);
return true;
}
void destoryDList(DLinkList& L) {
while (L->next != NULL) { //循环释放各个数据结点
deleteNextDNode(L);
}
free(L); //释放头节点
L = NULL; //头指针指向NULL
}
bool listInsert(DLinkList L, int i, elemType e) {
DNode* p = getElem(L, i - 1);
DNode* s = (DNode*)malloc(sizeof(DNode));
s->data = e;
return insertNextDNode(p, s);
}
DNode* getElem(DLinkList L, int i) {
if (i < 0) {
return NULL;
}
DNode* p;
int j = 0;
p = L;
while (p != NULL && j < i) {
p = p->next;
j++;
}
return p;
}
DNode* locateElem(DLinkList L, elemType e) {
DNode* p = L->next; //从第一个结点开始查找
while (p != NULL && p->data != e) {
p = p->next;
}
return p; //找到则返回该结点的指针,否则返回NULL
}
void listPrint(DLinkList L) {
DNode* p = L->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
3. main.cpp
#include"DLinkList.h"
int main() {
DLinkList L;
initDList(L);
for (int i = 1; i <= 10; i++) {
listInsert(L, i, i);
}
listPrint(L);
isEmpty(L);
printf("%d\n", getElem(L, 2)->data);
DNode* p = locateElem(L, 1);
DNode* s = (DNode*)malloc(sizeof(DNode));
s->data = 2;
insertNextDNode(p, s);
listPrint(L);
deleteNextDNode(p);
listPrint(L);
destoryDList(L);
listPrint(L);
return 0;
}