#include <iostream>
using namespace std;
typedef int ELement;
//===========================带头结点的双链表==============================
typedef struct DNode {
ELement date;
struct DNode* prior, * next;
}DNode,*DLinkList;
//初始化
bool DInit(DLinkList& L) {
L = (DNode*)malloc(sizeof(DNode));
if (L == NULL) {
return false;
}
L->next = NULL;
L->prior = NULL;
cout << "初始化成功" << endl;
}
//判空
bool isDEmpty(DLinkList& L) {
if (L->next == NULL) {
cout << "链表为空" << endl;
return true;
}
cout << "链表不为空" << endl;
return false;
}
//判断空间是分配成功
bool allocate2(DNode* p) {
if (p == NULL) {
cout << "空间分配失败" << endl;
return false;
}
return true;
}
//插入元素 -- 头插法 (需要做个判断)
bool insertHead(DLinkList& L,ELement e) {
DNode* p = (DNode*)malloc(sizeof(DNode));
if (!allocate2(p)) return false;
p->date = e;
//DNode* s = L->next;
if (L->next != NULL) {
L->next->prior = p;
}
p->next = L->next;
L->next = p;
p->prior = L;
cout << "元素 " << e << " 插入成功" << endl;
return true;
}
//插入元素 -- 尾插法
bool insertRear(DLinkList& L, ELement e) {
DNode* p = (DNode*)malloc(sizeof(DNode));
if (!allocate2(p)) return false;
p->date = e;
DNode* s = L->next;
while (s->next != NULL) {
s = s->next;
}
s->next = p;
p->prior = s;
p->next = NULL;
cout << "元素 " << e << " 插入成功" << endl;
return true;
}
//展示
bool showDLinkList(DLinkList& L) {
if (isDEmpty(L)) return false;
DNode* p = L->next;
while (p != NULL) {
cout << p->date << endl;
p = p->next;
}
}
//获取长度
int lenD(DLinkList& L) {
if (isDEmpty(L)) return 0;
DNode* p = L->next;
int length = 0;
while (p != NULL) {
length++;
p = p->next;
}
return length;
}
//按位删除
bool detD(DLinkList& L, int i,ELement e) {
if (i <= 0 || i > lenD(L)) {
cout << "超出范围" << endl << endl;
return false;
}
DNode* p = L;
//找到要删除的节点位置即可
for (int k = 1; k <= i; k++) {
p = p->next;
}
p->prior->next = p->next;
p->next->prior = p->prior;
return true;
}
//测试双链表
void testDLinkList() {
DLinkList L;
DInit(L);
ELement e = 1;
while (e <= 3) {
insertHead(L, e);
e++;
}
while (e <= 6) {
insertRear(L, e);
e++;
}
showDLinkList(L);
detD(L, 7, e);
detD(L, 0, e);
detD(L, 4, e);
showDLinkList(L);
}
//===========================带头结点的循环双链表==============================
bool initD2(DLinkList& L) {
L = (DNode*)malloc(sizeof(DNode));
if (!allocate2(L)) return false;
L->next = L;
L->prior = L;
cout << "初始化成功" << endl;
return true;
}
//判空
bool isDEmpty2(DLinkList& L) {
if (L->next == L) {
cout << "链表为空" << endl;
return true;
}
cout << "链表不为空" << endl;
return false;
}
//头插法
bool insertHead2(DLinkList& L, ELement e) {
DNode* p = (DNode*)malloc(sizeof(DNode));
p->date = e;
if (isDEmpty2(L)) {
//为空
L->prior = p;
}
//不为空
p->next = L->next;
L->next = p;
p->prior = L;
return true;
}
//尾插法
bool insertRear2(DLinkList& L, ELement e) {
DNode* p = (DNode*)malloc(sizeof(DNode));
p->date = e;
//不为空
if (!isDEmpty2(L)) {
L->prior->next = p;
p->next = L;
p->prior = L->prior;
L->prior = p;
}
else {
L->next = p;
p->next = L;
L->prior = p;
p->prior = L;
}
return true;
}
bool showDLinkList2(DLinkList& L) {
if (isDEmpty2(L)) return false;
DNode* p = L->next;
while (p != L) {
cout << p->date << endl;
p = p->next;
}
return true;
}
//获取长度
int lenD2(DLinkList& L) {
if (isDEmpty2(L)) return 0;
int length = 0;
DNode* p = L->next;
while (p != L) {
length++;
p = p->next;
}
return length;
}
//按位删除
bool detD2(DLinkList& L, int i, ELement& e) {
if (i <= 0 || i > lenD2(L)) {
cout << "超出范围" << endl;
return false;
}
DNode* p = L;
for (int k = 1; k <= i; k++) {
p = p->next;
}
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
return true;
}
void testDLinkList2() {
DLinkList L;
initD2(L);
ELement e = 1;
while (e <= 3) {
insertHead2(L, e);
e++;
}
while (e <= 6) {
insertRear2(L, e);
e++;
}
showDLinkList2(L);
detD2(L, 0, e);
detD2(L, 7, e);
detD2(L, 4, e);
showDLinkList2(L);
}
int main()
{
//测试双链表
//testDLinkList();
//测试循环双链表
testDLinkList2();
}
带头节点的双链表和循环双链表的基本操作
最新推荐文章于 2022-10-23 15:02:20 发布