2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
सूची C++ पात्रे एकः शीर्षकः द्विगुणितः सूची अस्ति दत्तांश। (अधः चित्रे संरचना दर्शिता अस्ति)
लिङ्क् कृतसूचौ प्रत्येकस्य नोड् इत्यस्य संरचना दत्तांशभागः, अग्रसूचकः, पृष्ठसूचकः च इति विभक्तः भवति (निम्नलिखितं संरचनाचित्रं कोडं च अस्ति)
लिङ्क्ड्-सूचौ दत्तांशस्य प्रकाराः, अग्रे पृष्ठे च सूचकाः टेम्पलेट्-द्वारा उत्पद्यन्ते, ते च अन्तःनिर्मित-प्रकारेषु, कस्टम्-प्रकारेषु च अनुकूलितुं शक्यन्ते ।अत्र क्लास् परिभाषितुं struct इत्यस्य उपयोगः भवति इति कारणं अस्ति यत् struct इत्यस्य पूर्वनिर्धारित सदस्यचरप्रकाराः सार्वजनिकाः सन्ति, अन्ये कार्याणि च सुलभतया आह्वयितुं शक्यन्ते ।अत्र list_node कन्स्ट्रक्टर् T() अपि अस्ति, यत् अस्य फंक्शन् न केवलं data संग्रहणार्थं उपयुज्यते तदतिरिक्तं, यदि list_node constructor इत्यस्य आह्वानं कुर्वन् कोऽपि पैरामीटर् न लिखितः भवति ।
सूचीयां सदस्यचरद्वयं स्तः : _node, नोड् प्रकारस्य सूचकः, _size च, यत् नोड्-सङ्ख्यां गणयति ।
- template<class T>
- class list
- {
- typedef list_node<T> Node;
- void empty_init()
- {
- _head = new Node;
- _head -> next = _head;
- _head -> prev = _head;
- _size = 0;
- }
- list()
- {
- empty_init();
- }
- private:
- Node* _node;
- size_t _size;
- }
वयं सूचीयाः मूलभूतसंरचना परिभाषितवन्तः, अधुना वयं केचन मूलभूतकार्यं योजयिष्यामः, यथा सूचीयां दत्तांशं सम्मिलितुं, सूचीं भ्रमितुं पुनरावर्तकानां उपयोगः च ।
Push_back function: प्रथमं नूतनं नोड् newnode निर्मायताम्, ततः newnode मध्ये संग्रहीतुं आवश्यकं data X संग्रहयन्तु, tail node अन्वेष्टुम् अपि च tail node इत्यस्य पार्श्वे node मध्ये newnode इत्येतत् सम्मिलितं कुर्वन्तु
- template<class T>
- struct list_node
- {
- T _data;
- list_node<T>* _next;
- list_node<T>* _prev;
- list_node(const T& x=T())
- :_data(x)
- , _next(nullptr)
- , _prev(nullptr)
- {
-
- }
- };
-
- template<class T>
- class list
- {
- typedef list_node<T> Node;
- void empty_init()
- {
- _head = new Node;
- _head -> next = _head;
- _head -> prev = _head;
- _size = 0;
- }
- list()
- {
- empty_init();
- }
- void push_back(const T& x)
- {
- Node* newnode = new Node(x);
- Node* tail = _head->prev;
-
- tail->_next = newnode;
- newnode->prev = tail;
-
- newnode->_next = _head;
- _head->prev = newnode;
-
- _size++;
- }
- private:
- Node* _node;
- size_t _size;
- }
क्रमसूचिकातः भिन्नं, यतः लिङ्क् कृतसूचिकायाः नोड्सः एकत्र निरन्तरस्थाने न संगृह्यन्ते, सूचकस्य ++ तथा dereference प्रत्यक्षतया दत्तांशं प्राप्तुं न शक्नुवन्ति, अतः अत्र अस्माकं * -> ++ -- इत्यादीनां अतिभारस्य आवश्यकता वर्तते .आदि संचालकः ।
- template<class T>
- struct list_node
- {
- T _data;
- list_node<T>* _next;
- list_node<T>* _prev;
- list_node(const T& x=T())
- :_data(x)
- , _next(nullptr)
- , _prev(nullptr)
- {
-
- }
- };
- template<class T>
- struct __list_iterator
- {
- typedef list_node<T> Node;
- typedef __list_iterator self;
-
- Node* _node;
- __list_iterator(Node* node)
- :_node(node)
- {
-
- }
-
- T& operator *(Node * node)
- {
- return _node->_data;
- }
-
- T* operator(Node * node)
- {
- return &_node->_data;
- }
- self& operator++()
- {
- _node = _node->next;
- return *this;
- }
-
- self& operator--()
- {
- _node = _node->prev;
- return *this;
- }
-
- bool operator!=(const self& s)
- {
- return _node != s._node;
- }
- }
-
- template<class T>
- class list
- {
- typedef list_node<T> Node;
- typedef __list_iterator<T> iterator;
-
- iterator begin()
- {
- return iterator(_head->next);
- }
-
- iterator end()
- {
- return iterator(_head);
- }
-
- void empty_init()
- {
- _head = new Node;
- _head -> next = _head;
- _head -> prev = _head;
- _size = 0;
- }
-
- list()
- {
- empty_init();
- }
-
- void push_back(const T& x)
- {
- Node* newnode = new Node(x);
- Node* tail = _head->prev;
-
- tail->_next = newnode;
- newnode->prev = tail;
-
- newnode->_next = _head;
- _head->prev = newnode;
-
- _size++;
- }
- private:
- Node* _node;
- size_t _size;
- }
उपर्युक्तानि कार्याणि सम्पन्नं कृत्वा वयं प्रोग्राम् इत्येतत् एवं त्रुटिनिवारणं कर्तुं शक्नुमः यद्यपि List इति सरणी नास्ति तथापि List इत्यस्य अन्तः तत्त्वानि अपि तथैव अभिगन्तुं शक्नुमः ।यद्यपि पुनरावर्तकाः पात्रस्य प्रत्येकस्य तत्त्वस्य उपरि समानरूपेण पुनरावृत्तिं कुर्वन्ति तथापि पुनरावर्तकाः अन्तर्निहितं कार्यान्वयनविवरणं रक्षन्ति तथा च एकीकृतप्रवेशविधिं प्रदास्यन्ति。
- test_list()
- {
- list<int> lt;
- lt.push_back(1);
- lt.push_back(2);
- lt.push_back(3);
- list<int>::iterator it = lt.begin();
-
- while(it != lt.end())
- {
- cout << *it << " ";
- ++it;
- }
- cout<< endl;
- }
प्रथमं वयं insert() फंक्शन् लिखितुं शक्नुमः एतत् फंक्शन् अन्यैः फंक्शन् इत्यनेन यथा push_back तथा push_front इत्यनेन पुनः उपयोक्तुं शक्यते, अपि च कस्मिन् अपि स्थाने data इन्सर्ट् कर्तुं शक्यते ।
- iterator insert(iterator pos , const T& x)
- {
- Node* newnode = new Node(x);
- Node* cur = pos._node;
- Node* prev = cur ->_prev;
-
- prev->_next = newnode;
- newnode->_prev = prev;
- newnode->_next = cur;
- cur->_prev = newnode;
-
- return newnode;
- }
-
- iterator erase(iterator pos)
- {
- Node* cur = pos._node;
- Node* prev = cur->_prev;
- Node* next = cur->_next;
-
- delete cur;
- prev->_next = next;
- next->_prev = prev;
-
- return next;
- }
-
- void push_back(const T& x)
- {
- insert(this.end(),x);
- }
-
- void push_front(const T& x)
- {
- insert(begin(),x);
- }
-
- void pop_back()
- {
- erase(--end());
- }
-
- void pop_front()
- {
- erase(begin());
- }
यतः erase फंक्शन् इत्यस्य return value इत्येतत् deleted data इत्यस्य अग्रिमस्थानं भवति, अतः अत्र ++ न लिखित्वा ++ इत्यस्य प्रभावः भविष्यति ।
- ~list()
- {
- clear();
- delete _head;
- _head = nullpre;
- }
-
- void clear()
- {
- iterator it = begin();
- while(it != end())
- {
- it = erase(*it);
- }
- }
(1) प्रतिलिपिसंरचना
- list( list<int> lt )
- {
- empty_init();
- for(auto e : lt)
- {
- this.push_back(e);
- }
- }
(2) असाइनमेण्ट् अतिभारः
- void swap(list<T>& lt)
- {
- std::swap(_head, lt._head);
- std::swap(_size, lt._size);
- }
- list<int>& operator=(list<int> lt)
- {
- swap(lt);
- return *this;
- }
const type iterators कृते अस्माभिः अवगन्तुं आवश्यकं यत्,const प्रकारस्य पुनरावर्तकाः पुनरावर्तकेन सूचितं दत्तांशं परिवर्तयितुं न शक्नुवन्ति, परन्तु पुनरावर्तकः एव परिवर्तयितुं न शक्यते ।पुनरावर्तकस्य एव ++, -- इत्यादीनि क्रियाणि पूर्णानि कर्तुं आवश्यकानि सन्ति, अतः const प्रकारस्य पुनरावृत्तिकर्तारं लिखन् अहं केवलं तस्य कार्यस्य const परिवर्तनं करोमि यत् पुनरावर्तकः सूचितसामग्रीयां प्रत्यागच्छति, अन्ये कार्याणि च अवशिष्यन्ते अपरिवर्तितः ।
- template<class T>
- struct __list_const_iterator
- {
- typedef list_node<T> Node;
- typedef __list_const_iterator<T> self;
- Node* _node;
- __list_const_iterator(Node* node)
- :_node(node)
- {
-
- }
-
- const T& operator *()
- {
- return _node->_data;
- }
- const T* operator->()
- {
- return &_node->_data;
- }
- };
- #pragma once
- #include<iostream>
- using namespace std;
- namespace hjy
- {
- template<class T>
- struct list_node
- {
- T _data;
- list_node<T>* _next;
- list_node<T>* _prev;
- list_node(const T& x=T())
- :_data(x)
- , _next(nullptr)
- , _prev(nullptr)
- {
-
- }
- };
- template<class T,class Ref,class Ptr>
- struct __list_iterator
- {
- typedef list_node<T> Node;
- typedef __list_iterator<T,Ref,Ptr> self;
- Node* _node;
- __list_iterator(Node* node)
- :_node(node)
- {
-
- }
- self& operator ++()
- {
- _node = _node->_next;
- return *this;
- }
- self& operator --()
- {
- _node = _node->_prev;
- return *this;
- }
- self operator ++(int)
- {
- self tmp(*this);
- _node = _node->_next;
- return tmp;
- }
- self operator --(int)
- {
- self tmp(*this);
- _node = _node->_prev;
- return tmp;
- }
- Ref operator *()
- {
- return _node->_data;
- }
- Ptr operator->()
- {
- return &_node->_data;
- }
- bool operator!=(const self& s)
- {
- return _node != s._node;
- }
- };
- /*template<class T>
- struct __list_const_iterator
- {
- typedef list_node<T> Node;
- typedef __list_const_iterator<T> self;
- Node* _node;
- __list_const_iterator(Node* node)
- :_node(node)
- {
- }
- self& operator ++()
- {
- _node = _node->_next;
- return *this;
- }
- self& operator --()
- {
- _node = _node->_prev;
- return *this;
- }
- self operator ++(int)
- {
- self tmp(*this);
- _node = _node->_next;
- return tmp;
- }
- self operator --(int)
- {
- self tmp(*this);
- _node = _node->_prev;
- return tmp;
- }
- const T& operator *()
- {
- return _node->_data;
- }
- const T* operator->()
- {
- return &_node->_data;
- }
- bool operator!=(const self& s)
- {
- return _node != s._node;
- }
- };*/
- template<class T>
- class list
- {
- typedef list_node<T> Node;
- public:
- typedef __list_iterator<T,T&,T*> iterator;
- typedef __list_iterator<T, const T&, const T*> const_iterator;
- //typedef __list_const_iterator<T> const_iterator;
-
- const_iterator begin()const
- {
- return const_iterator(_head->_next);
- }
- const_iterator end()const
- {
- return const_iterator(_head);
- }
-
- iterator begin()
- {
- return _head->_next;
- }
- iterator end()
- {
- return _head;
- }
- void empty_init()
- {
- _head = new Node;
- _head->_next = _head;
- _head->_prev = _head;
- _size = 0;
- }
- list()
- {
- empty_init();
- }
- //list<int>& operator=(const list<int>& lt) 传统写法
- //{
- // if (this != <)
- // clear();
- // for (auto e : lt)
- // {
- // push_back(e);
- // }
- // return *this;
- //}
- void swap(list<T>& lt)
- {
- std::swap(_head, lt._head);
- std::swap(_size, lt._size);
- }
- list<int>& operator=(list<int> lt)
- {
- swap(lt);
- return *this;
- }
- ~list()
- {
- clear();
- delete _head;
- _head = nullptr;
- }
- //list(const list<T>& lt)//没有const迭代器所以这样写不行
- //{
- // empty_init();
- // for (auto e : lt)
- // {
- // push_back(e);
- // }
- //}
- list( list<T>& lt)
- {
- empty_init();
- for (auto e : lt)
- {
- push_back(e);
- }
- }
- void push_back(const T& x)
- {
- insert(end(), x);
- }
- void push_front(const T& x)
- {
- insert(begin(), x);
- }
- void pop_front()
- {
- erase(begin());
- }
- void pop_back()
- {
- erase(end()--);
- }
- void clear()
- {
- iterator it = begin();
- while (it != end())
- {
- it = erase(it);
- }
- }
- iterator insert(iterator pos, const T& val)
- {
- Node* cur = pos._node;
- Node* newnode = new Node(val);
- Node* prev = cur->_prev;
- prev->_next = newnode;
- newnode->_prev = prev;
- newnode->_next = cur;
- cur->_prev = newnode;
- ++_size;
- return iterator(newnode);
- }
- iterator erase(iterator pos)
- {
- Node* cur = pos._node;
- Node* prev = cur->_prev;
- Node* next = cur->_next;
- delete cur;
- prev->_next = next;
- next->_prev = prev;
- --_size;
- return iterator(next);
- }
- size_t size()
- {
- return _size;
- }
- private:
- Node* _head;
- size_t _size;
- };
- void test_list1()
- {
- list<int>lt;
- lt.push_back(1);
- lt.push_back(2);
- lt.push_back(3);
- lt.push_back(4);
- lt.push_back(5);
- for (auto e : lt)
- cout << e << " ";
- cout << endl;
-
- list<int>lt1 = lt;
- for (auto e : lt1)
- cout << e << " ";
- cout << endl;
-
- }
- /*void print_list(const list<int>& lt)
- {
- list<int>::const_iterator it = lt.begin();
- while (it != lt.end())
- {
- cout << *it << " ";
- ++it;
- }
- cout << endl;
- for (auto e : lt)
- {
- cout << e << " ";
- }
- cout << endl;
- }*/
- template<typename T>
- void print_list(const list<T>& lt)
- {
- typename list<T>::const_iterator it = lt.begin();
- while (it != lt.end())
- {
- cout << *it << " ";
- ++it;
- }
- cout << endl;
- }
- void test_list2()
- {
- list<string>lt;
- lt.push_back("111");
- lt.push_back("111");
- lt.push_back("111");
- print_list(lt);
- }
- }