头文件
cpp
#pragma once
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
using namespace std;
typedef struct node {
int data;
node* next;
node* prev;
}node;
typedef struct linklist {
int cursize;
node* head;
}linklist;
//1.初始化
node* buynode(int val);
void initlist(linklist* ps);
//2.在一个节点前插入元素
bool insertelem(linklist* ps, node* ptr, int val);
//3.打印
void print_(linklist* ps);
//4.删除节点
bool erasenode(linklist* ps, node* ptr);
//5.头删
bool erasefront(linklist* ps);
//6.尾删
bool eraselast(linklist* ps);
//7.头插
bool insertfront(linklist* ps, int val);
//8.尾插
bool insertback(linklist* ps, int val);
源文件
cpp
#include"不带头结点双向循环链表.h"
node* buynode(int val) {
node* p = (node*)malloc(sizeof(node));
if (p == nullptr) {
cout << "申请内存失败" << endl;
return NULL;
}
p->data = val;
p->next = p;
p->prev = p;
return p;
}
//1.初始化
void initlist(linklist* ps) {
assert(ps != nullptr);
ps->head = nullptr;
ps->cursize = 0;
}
//2.在一个节点前插入元素
bool insertelem(linklist* ps, node* ptr, int val) {
assert(ps != nullptr && ptr != nullptr);
node* p = buynode(val);
p->next = ptr;
p->prev = ptr->prev;
ptr->prev->next = p;
ptr->prev = p;
ps->cursize++;
return true;
}
//3.打印
void print_(linklist* ps) {
assert(ps != nullptr);
if (ps->head == nullptr) return;
node* p = ps->head;
do {
cout << p->data << " ";
p = p->next;
} while (p != ps->head);
cout << endl;
}
//4.删除节点
bool erasenode(linklist* ps, node* ptr) {
assert(ps != nullptr && ptr != nullptr);
if (ps->cursize == 1) {
ps->head = nullptr;
}
else {
ptr->prev->next = ptr->next;
ptr->next->prev = ptr->prev;
if (ptr == ps->head) {
ps->head = ptr->next;
}
}
free(ptr);
ps->cursize--;
return true;
}
//5.头删
bool erasefront(linklist* ps) {
assert(ps != nullptr);
if (ps->head == nullptr) return false;
return erasenode(ps, ps->head);
}
//6.尾删
bool eraselast(linklist* ps) {
assert(ps != nullptr);
if (ps->head == nullptr) return false;
return erasenode(ps, ps->head->prev);
}
//7.头插
bool insertfront(linklist* ps, int val) {
assert(ps != nullptr);
if (ps->head == nullptr) {
ps->head = buynode(val);
ps->cursize++;
return true;
}
return insertelem(ps, ps->head, val);
}
//8.尾插
bool insertback(linklist* ps, int val) {
assert(ps != nullptr);
if (ps->head == nullptr) {
ps->head = buynode(val);
ps->cursize++;
return true;
}
return insertelem(ps, ps->head, val);
}
int main() {
return 0;
}