#include <bits/stdc++.h>
using namespace std;
class DoubleLinkedList {
private:
struct node {
int val;
node *next, *prior;
node() {}
node(int x) {
this->val = x;
}
};
node *head;
int size;
public:
DoubleLinkedList() {
head = new node();
head->next = head->prior = NULL;
size = 0;
}
~DoubleLinkedList() {
while (head->next!=NULL && head->prior!=NULL) {
delTail();
}
delete head;
}
void insert(int index, int x) {
if (index<0 || index>size) {
cout << "the index is invalid!" << endl;
return;
}
node *p = head;
for (int i=0; i<index; ++i) p = p->next;
/*
node *q = new node(q)
q->next = p->next; p->next可能是NULL指针
*/
node *q = new node(x);
q->next = p->next;
if (p->next) p->next->prior = q;
q->prior = p;
p->next = q;
size ++;
}
void insertHead(int x) {insert(0, x);}
void insertTail(int x) {insert(size, x);}
int del(int index) {
if (index<0 || index>=size) {
cout << "the index is invalid!" << endl;
return -1;
}
if (head->next==NULL && head->prior==NULL) {
cout << "the DoubleLinkedList is null!" << endl;
return -1;
}
node *p = head;
for (int i=0; i<index; ++i) p = p->next;
node *del = p->next;
int res = del->val;
if (del->next) {
del->next->prior = p;
p->next = del->next;
delete del;
} else {
p->next = NULL;
delete del;
}
size --;
return res;
}
int delHead() {del(0);}
int delTail() {del(size-1);}
int get(int index) {
if (index<0 || index>=size) {
cout << "the index is invalid!" << endl;
return -1;
}
if (head->next==NULL && head->prior==NULL) {
cout << "the DoubleLinkedList is null!" << endl;
return -1;
}
node *p = head->next;
for (int i=0; i<index; ++i) p = p->next;
return p->val;
}
int getHead() {return get(0);}
int getTail() {return get(size-1);}
void show() {
node *p = head->next;
while (p) {
cout << p->val << " ";
p = p->next;
}
cout << endl;
}
bool isEmpty() {
return head->next==NULL && head->prior==NULL;
}
};
int main() {
int a[] = {1,2,3,4,5};
int n = sizeof(a)/sizeof(int);
DoubleLinkedList l = DoubleLinkedList();
for (int i=0; i<n; ++i) l.insertTail(a[i]);
l.show();
l.delHead();
l.show();
l.delTail();
l.show();
cout << l.getHead() << endl;
cout << l.getTail() << endl;
return 0;
}
数据结构:带头结点双向链表的实现(考研)
最新推荐文章于 2022-07-30 23:26:13 发布