修改mylink为双向链表,写反向迭代器

在这里插入图片描述
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;
}

猜你喜欢

转载自blog.csdn.net/qq_44162236/article/details/108977446