ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 231229 list 자료구조 만들어보기
    기록 2023. 12. 29. 19:13
    #include <iostream>
    #include <crtdbg.h>
    
    //template <typename T>
    class list
    {
    private:
    
    	class Node
    	{
    	public:
    
    		Node()
    			:Prev(nullptr), Next(nullptr), m_value(0)
    		{
    		}
    
    		Node(Node* _Prev)
    		{
    			Prev = _Prev;
    			Prev->Next = this;
    			Next = nullptr;
    			m_value = 0;
    		}
    
    		Node(Node* _Prev, Node* _Next)
    		{
    			Prev = _Prev;
    			Prev->Next = this;
    
    			Next = _Next;
    			Next->Prev = this;
    
    			m_value = 0;
    		}
    		~Node()
    		{
    			if (nullptr != Next)
    			{
    				Next->Prev = nullptr;
    				Next = nullptr;
    			}
    			if (nullptr != Prev)
    			{
    				Prev->Next = nullptr;
    				Prev = nullptr;
    			}
    		}
    		Node* Prev;
    		Node* Next;
    		int m_value;
    	};
    private:
    	int m_size;
    	Node* m_head;
    	Node* m_tail;
    
    public:
    	class iterator {	
    		friend class list;
    		Node* iterNode;
    	public:
    
    		iterator() 
    		{
    			iterNode = new Node;
    		}
    		iterator(list* _list,Node* _node) : iterNode(_node)
    		{
    		};		
    
    		~iterator() 
    		{
    			iterNode = nullptr;
    		}
    
    		iterator& operator++() {					
    			iterNode = iterNode->Next;
    			return *this;
    		}
    
    		iterator& operator--() {					
    			iterNode = iterNode->Prev;
    			return *this;
    		}
    
    		int operator*() {		
    			if (nullptr == iterNode)
    			{
    				return 0;
    			}
    			return iterNode->m_value;
    		}
    
    		bool operator !=(const iterator& other) {		
    			return iterNode != other.iterNode;
    		}
    
    		bool operator ==(const iterator& other) {	
    			return iterNode == other.iterNode;
    		}
    		Node* operator&() {							
    			return iterNode;
    		}
    
    		//iterator erase(iterator pos) {			//건네받은 iterator값 삭제하고 그다읍값 반환
    		//	Node* node = &pos;
    		//	Node* preNode = node->Prev;
    		//	Node* nextNode = node->Next;
    		//	delete node;
    		//	preNode->Prev = nextNode;
    		//	nextNode->Next = preNode;
    		//	m_size--;
    
    		//	return iterator(nextNode);
    		//}
    	};
    
    
    	// 생성자 
    	list(int temp = 0) 
    	{
    		m_size = 0;
    		m_head = new Node();
    		m_tail = new Node(m_head);
    
    		resize(temp);
    	}
    	list(int temp = 0, int val)
    	{
    		m_size = 0;
    		m_head = new Node();
    		m_tail = new Node(m_head);
    
    		resize(temp, val);
    	}
    
    	// 소멸자
    	~list() {
    		clear();
    
    		delete m_head;
    		m_head = nullptr;
    
    		delete m_tail;
    		m_tail = nullptr;
    	}
    
    
    
    	//T& operator[](size_t index)
    	//{
    	//	Node* check_iter = m_head->Next;
    	//	for (int i = 0; i < index; ++i)
    	//	{
    	//		if (nullptr != check_iter->Next)
    	//		{
    	//			check_iter = check_iter->Next;
    	//		}
    	//	}
    	//	
    	//	return check_iter->m_value;
    	//}
    
    	void push_back(int num)
    	{
    		m_tail->m_value = num;
    		new Node(m_tail);
    		m_tail = m_tail->Next;
    		m_size++;
    	}
    
    	void pop_back()
    	{
    		m_tail = m_tail->Prev;
    		delete m_tail->Next;
    		m_size--;
    	}
    
    	void Push_front(int num)
    	{
    		m_head->m_value = num;
    		new Node(nullptr, m_head);
    		m_head = m_head->Prev;
    		m_size++;
    	}
    
    	void pop_front()
    	{
    		m_head = m_head->Next;
    		delete m_head->Prev;
    		m_size--;
    	}
    
    
    	iterator begin() {						
    		return iterator(this, m_head->Next);
    	}
    	iterator end() {						
    		return iterator(this, m_tail);
    	}
    	bool empty()
    	{
    		return 0 == m_size;
    	}
    
    	int front() const
    	{
    		if (0 < m_size)
    		{
    			return m_head->Next->m_value;
    		}
    		else
    		{
    			return -1;
    		}
    	}
    
    	int back() const
    	{
    		if (0 < m_size)
    		{
    			return m_tail->Prev->m_value;
    		}
    		else
    		{
    			return -1;
    		}
    	}
    
    	void resize(const size_t n, int val = 0)
    	{
    		if (m_size < n)
    		{
    			return;
    		}
    
    		Node* cur_iter = m_tail->Prev;
    		for (; m_size <= n; ++m_size)
    		{
    			Node* l_prev = cur_iter;
    			Node* l_next = cur_iter->Next;
    			new Node(l_prev, l_next);
    			cur_iter = cur_iter->Next;
    			cur_iter->m_value = val;
    		}
    	}
    
    
    
    	//vector.size()
    	size_t size()
    	{
    		return m_size;
    	}
    
    
    	void clear()
    	{
    		Node* cur_iter = m_head->Next;
    		while (true)
    		{
    			if (cur_iter == m_tail)
    			{
    				break;
    			}
    			cur_iter = cur_iter->Next;
    			delete cur_iter->Prev;
    		}
    		m_head->Next = m_tail;
    		m_tail->Prev = m_head;
    		m_size = 0;
    	}
    
    	
    
    
    };

     
    노드로 연결되어 있는 std::luist 자료구조를 만들어 보았다.
     

    int main()
    {
    	_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
    	int* a = new int(); // 릭 확인용
    
    	list Tmpvec(5,7);
    	Tmpvec.push_back(7);
    
    	list::iterator it = Tmpvec.begin();
    	list ::iterator endit = Tmpvec.end();
    
    	for (; it != endit; ++it)
    	{
    		std::cout << *it << std::endl;
    	}
    
    	return 0;
    }

     
    직접 iterator를 for 문을 돌려가며 확인해보았다.

    '기록' 카테고리의 다른 글

    230101 Trial Algorithm  (1) 2024.01.02
    231231 MFC  (0) 2023.12.31
    231220 Death's Door project 설명 영상 제작, vector 자료구조 만들어보기  (1) 2023.12.20
    기록) DD project 미리보기  (1) 2023.12.01
    231108 기록  (0) 2023.11.08

    댓글

Designed by Tistory.