본문 바로가기
CS/DataStructure

[Data Structure] List

by NeNemEee 2023. 4. 10.
728x90

특징

  • Linked List로 구현
  • 원소 접근 O(n)
  • 원소가 변견되어도 iterator 동일

주의

  • 아래 코드는 단방향 Linked List로 구현되어 있음
#include<iostream>
#include<string>

using namespace std;

template <typename T>
class Node{
    private:
        T data;
        Node<T>*next;
    public:
        Node(T _data){
            next = NULL;
            data = _data;
        }

        ~Node(){
            if(next!=NULL){
                delete next;
            }
        }

        T getData(){
            return data;
        }

        Node*getNext(){
            return next;
        }

        void setNext(Node*_next){
            next = _next;
        }

        void setData(T _data){
            data = _data;
        }
};

template <typename T>
class List{
    private:
        int size;
        Node<T>*head;
    public:
        List(){
            size = 0;
            head = NULL;
        }

        ~List(){
            delete head;
        }

        void add(T _tmp, int idx){
            if(size<=idx){
                printf("error\n");
                return;
            }

            if(idx==0){
                if(head == NULL){
                    head = new Node<T>(_tmp);
                }else{
                    Node<T>*newHead = new Node<T>(_tmp);
                    newHead->setNext(head);
                    head = newHead;
                }
            }else{
                Node<T>*tmp = head;

                for(int i=0; i<idx; i++){
                    tmp = tmp->getNext();
                }

                Node<T>*tmpp = new Node<T>(_tmp);
                tmpp->setNext(tmp->getNext());
                tmp->setNext(tmpp);
            }

            size++;

            return;
        }

        void remove(int idx){
            if(size==0){
                printf("don't!\n'");
                return;
            }

            if(idx==0){
                Node<T>*tmp = head->getNext();
                head->setNext(NULL);
                delete head;
                head = tmp;
                size--;
                return;
            }

            if(size<=idx){
                printf("don't!\n'");
                return;
            }

            Node<T>*tmp = head;
            for(int i=0; i<idx-1; i++){
                tmp = tmp->getNext();
            }

            Node<T>*tmpp = tmp->getNext()->getNext();
            tmp->getNext()->setNext(NULL);
            delete tmp->getNext();
            tmp->setNext(tmpp);
            size--;
            return;

        }

        void push_back(T _tmp){
            if(head==NULL){
                head = new Node<T>(_tmp);
            }else{
                Node<T>*tmp = head;
                while(1){
                    if(tmp->getNext() == NULL){
                        Node<T>*tmpp = new Node<T>(_tmp);
                        tmp->setNext(tmpp);
                        break;
                    }

                    tmp = tmp->getNext();
                }
            }

            size++;
        }

        void pop_back(){
            if(size==0){
                printf("don't!\n'");
                return;
            }

            if(size==1){
                delete head;
                head = NULL;
                size--;
                return;
            }

            Node<T>*tmp = head;
            for(int i=0;i<size-1; i++){
                tmp = tmp->getNext();
            }

            delete tmp->getNext();
            tmp->setNext(NULL);
            size--;
        }

        T at(int idx){
            if(size==0){
                printf("don't!\n'");
                return 0;
            }

            if(idx>=size){
                printf("don't!\n'");
                return 0;
            }

            Node<T>*tmp = head;

            for(int i=0; i<idx; i++){
                tmp = tmp->getNext();
            }

            return tmp->getData();
        }

        int len(){
            return size;
        }
};

int main(){
    List<string>*start = new List<string>();

    start->push_back("sdsd");
    start->push_back("sdsdsd");
    start->add("5555", 0);
    start->add("9999", 1);
    cout<<start->len()<<endl;


    for(int i=0; i<start->len(); i++){
        cout<<start->at(i)<<endl;
    }

    delete start;

    return 0;
}
728x90

'CS > DataStructure' 카테고리의 다른 글

[Data Structure] Vector 와 List의 차이  (0) 2023.04.10
[Data Structure] Stack  (0) 2023.04.10
[DataStructure] Stack과 Queue 의 차이  (0) 2023.04.10
[Data Structure] Unordered_Map  (0) 2023.04.10

댓글