- // List.h
- #ifndef SSCPP2014_DOULIST_A_H
- #define SSCPP2014_DOULIST_A_H
- #include<string>
- structDouListNode{
- int elem;
- DouListNode*prev,*next;
- DouListNode(int e =0,DouListNode*p =0,DouListNode*n =0){
- elem = e;
- prev = p;
- next = n;
- }
- };
- classDouList{
- private:
- DouListNode*m_head,*m_tail;
- public:
- DouList();
- DouList(constDouList&src);
- ~DouList();
- void clear();
- bool empty()const;
- std::string to_str()const;
- int front()const;
- int back()const;
- void push_front(constint&e);
- void push_back(constint&e);
- void pop_front();
- void pop_back();
- voidoperator=(constDouList&other);
- friend std::ostream&operator<<(std::ostream &out,
- constDouList&list);
- // non-meaning static value
- staticint _error_sign;// for illegal front()/back()
- };
- #endif
- // List.cpp
-
#include<iostream>
#include<string>
#include "DouList.h"
using namespace std;DouList::DouList() {
m_head = m_tail = NULL;
}DouList::DouList(const DouList &src) {
m_head = m_tail = NULL;
*this = src;
}DouList::~DouList() {
clear();
}void DouList::clear() {
DouListNode *temp;
while (m_head != NULL) {
temp = m_head;
m_head = m_head->next;
delete temp;
}
m_head = m_tail = NULL;
}bool DouList::empty() const {
return (m_head == NULL && m_tail == NULL);
}std::string DouList::to_str() const {
DouListNode *t = m_head;
string strtemp;
strtemp += "[";
if (m_head == NULL) {
} else if (m_head == m_tail) {
int i = 0, x = t->elem, ch[10] = {0};
if (x == 0) {
strtemp.push_back('0');
} else {
while (x) {
ch[i] = x % 10;
x /= 10;
i++;
}
for (int j = i-1; j >= 0; j--) {
strtemp.push_back(ch[j] + '0');
}
}
} else {
while (t->next != NULL) {
int i = 0, x = t->elem, ch[10] = {0};
if (x == 0) {
strtemp.push_back('0');
strtemp += ", ";
t = t->next;
} else {
while (x) {
ch[i] = x % 10;
x /= 10;
i++;
}
for (int j = i-1; j >= 0; j--) {
strtemp.push_back(ch[j] + '0');
}
strtemp += ", ";
t = t->next;
}
}
int i = 0, x = t->elem, ch[10] = {0};
if (x == 0) {
strtemp.push_back('0');
} else {
while (x) {
ch[i] = x % 10;
x /= 10;
i++;
}
for (int j = i-1; j >= 0; j--) {
strtemp.push_back(ch[j] + '0');
}
}
}
strtemp += "]";
return strtemp;
}int DouList::front() const {
return m_head->elem;
}int DouList::back() const {
return m_tail->elem;
}void DouList::push_front(const int &e) {
if (m_head == NULL && m_tail == NULL) {
DouListNode *temp = new DouListNode(e);
m_head = temp;
m_tail = temp;
} else {
DouListNode *temp = new DouListNode(e);
temp->next = m_head;
temp->prev = NULL;
m_head->prev = temp;
m_head = temp;
}
}void DouList::push_back(const int &e) {
if (m_head == NULL && m_tail == NULL) {
DouListNode *temp = new DouListNode(e);
m_head = temp;
m_tail = temp;
} else {
DouListNode *temp = new DouListNode(e);
temp->prev = m_tail;
temp->next = NULL;
m_tail->next = temp;
m_tail = temp;
}
}void DouList::pop_front() {
if (empty()) {
return;
}
if (m_head == m_tail) {
clear();
return;
} else {
DouListNode *temp = m_head;
m_head = m_head->next;
m_head->prev = NULL;
delete temp;
}
}void DouList::pop_back() {
if (empty()) {
return;
}
if (m_head == m_tail) {
clear();
return;
} else {
DouListNode *temp = m_tail;
m_tail = m_tail->prev;
m_tail->next = NULL;
delete temp;
}
}void DouList::operator=(const DouList &other) {
clear();
DouListNode *temp2 = other.m_head;
DouListNode *temp = m_head = new DouListNode(temp2->elem);
temp2 = temp2->next;
while (temp2 != NULL) {
temp->next = new DouListNode(temp2->elem, temp);
temp = temp->next;
temp2 = temp2->next;
}
m_tail = temp;
}std::ostream& operator<<(std::ostream &output, const DouList &list) {
output << list.to_str();
return output;
}