#include <iostream>
using namespace std;
typedef struct Node {
int data;
struct Node* prev;
struct Node* next;
}Node, *ptrNode;
class List {
private:
ptrNode linkList;
int length;
public:
void init();
bool insert(int i, int value);
bool remove(int i, int &value);
void add(int value);
bool isEmpty();
};
bool List::remove(int i, int &value) {
if (i <= length) {
ptrNode p = linkList;
ptrNode q;
while(--i) {
p = p->next;
}
q = p->next;
p->next = q->next;
q->next->prev = p;
value = q->data;
delete q;
length--;
return true;
}
return false;
}
bool List::isEmpty() {
if (linkList->next == linkList) { // 这里的判断条件不能写成linkList->next == linkList->prev
return true;
}
return false;
}
void List::add(int value) {
ptrNode ptr = new Node();
ptr->data = value;
ptr->next = linkList->next;
ptr->prev = linkList;
linkList->next->prev = ptr;
linkList->next = ptr;
length++;
}
bool List::insert(int i, int value) {
if (i <= length) {
ptrNode ptr = new Node();
ptr->data = value;
ptrNode p = linkList;
while(--i) {
p = p->next;
}
ptr->next = p->next;
ptr->prev = p;
p->next->prev = ptr;
p->next = ptr;
length++;
return true;
}
return false;
}
void List::init() {
linkList = new Node();
linkList->prev = linkList;
linkList->next = linkList;
length = 0;
}
int main() {
List *l = new List();
l->init();
l->add(1);
l->add(2);
int value;
l->remove(2, value);
while (!l->isEmpty()) {
l->remove(1, value);
std::cout << value << " ";
}
return 0;
}
带头结点的双向循环链表
最新推荐文章于 2023-10-26 23:48:00 发布