#include using namespace std; //////////////////////////////////////////////////////////////////////////////// class VirtualArray { //////////////////////////////////////////////////////////////////////////////// protected: VirtualArray * next; int value; int position; //////////////////////////////////////////////////////////////////////////////// public: VirtualArray() { next = this; value = 0; position = 0; } VirtualArray(int v1, int p1) { next = this; value = v1; position = p1; } //////////////////////////////////////////////////////////////////////////// VirtualArray * Add(VirtualArray * p1) { p1->next = next; next = p1; return p1; } void RemoveNext() { VirtualArray * rem = next; next = next->next; delete rem; } void Set(int pos, int val) { VirtualArray * curr = this; do { if (curr->position == pos) { curr->value = val; return; } curr = curr->next; } while (curr != this); Add(new VirtualArray(val, pos)); } int & operator[](int pos) { VirtualArray * curr = this, * prev = NULL; do { if (curr->position == pos) return curr->value; prev = curr; curr = curr->next; if ((curr->value == 0) && (curr != this)) { prev->RemoveNext(); curr = prev->next; } } while (curr != this); return Add(new VirtualArray(0, pos))->value; } void Clear() { VirtualArray * curr = next, * prev = NULL; while (curr != this) { prev = curr; curr = curr->next; delete prev; } value = 0; next = this; } int GetLenght() { VirtualArray * curr = next; int len = 1; while (curr != this) { len++; curr = curr->next; } return len; } void Shift(int p1, int m1 = 0) { VirtualArray * curr = this; int len = GetLenght(); if (m1 && (m1 < len)) m1 = len + 1; do { curr->position = (m1 ? (curr->position + p1) % m1 : (curr->position + p1)); curr = curr->next; } while (curr != this); } void Print() { VirtualArray * curr = next; cout << "[" << value; while (curr != this) { cout << ", " << curr->value; curr = curr->next; } cout << "]" << endl; } }; //////////////////////////////////////////////////////////////////////////////// int main() { VirtualArray va1; for (int i=0; i<20; i++) { va1[i] = (i*9) % 10; } for (int i=0; i<20; i++) cout << "a[" << i << "] = " << va1[i] << endl; cout << "va1 = "; va1.Print(); cout << "Shift on 1 element toward:" << endl; va1.Shift(1, 10); for (int i=0; i<20; i++) cout << "a[" << i << "] = " << va1[i] << endl; va1.Print(); cout << "Count of elements = " << va1.GetLenght(); getchar(); return 0; }