mylink双链表
#ifndef MYLINK_H__
#define MYLINK_H__
#include <ostream>
#include<iostream>
using namespace std;
template <typename T>
struct Unit {
T value;
Unit *next;
Unit *pre;//前指针
};
template <typename T>
std::ostream& operator << (std::ostream& out, const Unit<T>& t) {
// must be const !
out << t.value;
return out;
}
template <typename T>
class MyLink {
Unit<T> *head; // 头指针指向整体
Unit<T> *tail; // 尾指针指向null
Unit<T> *prev; // point before tail
Unit<T> *head_f; // 头指针指向null
Unit<T> *tail_f; // 尾指针指向整体
public:
MyLink() {
head = tail = prev =head_f=tail_f= NULL;
}
void Add(T &value) {
Unit<T> *u = new Unit<T>();
u->value = value;
u->next = NULL;
if (head == NULL) {
head = u;
prev = u;
head_f=NULL;
u->pre=NULL;
} else {
tail_f=u;
prev->next = u;//连接后面
u->pre=prev;//连接前面
prev = u;
}
tail = u->next;
}
Unit<T>* Begin() {
return head;
}
Unit<T>* End() {
return tail;
}
Unit<T>* Begin1() {
return head_f;
}
Unit<T>* End1() {
return tail_f;
}
virtual ~MyLink() {
if (head != NULL) {
Unit<T> *prev = head;
Unit<T> *next = NULL;
while (prev != tail) {
next = prev->next;
delete prev;
prev = next;
}
}
}
};
linkiterator.h反向迭代器
#include<iostream>
#ifndef LINKITERATOR_H__
#define LINKITERATOR_H__
using namespace std;
template <typename T>
class LinkIterator {
T *t;
public:
LinkIterator(T *t) {
this->t = t;
}
bool operator!=(LinkIterator& it) {
return this->t != it.t;
}
void operator++(int) {
t = t->pre;//向前迭代
}
T operator*() {
return *t;
}
};
display.h
#include <iostream>
template <typename T>
void display(T start, T end) {
for (T i=start; i != end; i++){
std::cout << *i << "\t";
}
std::cout << std::endl;
}
ts1.cpp主函数
#include <iostream>
#include "mylink.h"
#include "linkiterator.h"
#include "display.h"
using namespace std;
int main() {
int m = 0;
MyLink<int> m1;
for (int i = 0; i < 5; i++){
m = i + 1;
m1.Add(m);
}
LinkIterator<Unit<int> > start(m1.Begin1());
LinkIterator<Unit<int> > end(m1.End1());
cout << "Total Number:\n";
display(end, start);
return 0;
}