위의 1과 2를 통해 list 원소들을 복사하는 방법에 대해 알아봤다. 물론 또다른 방법으로는 직접 루프를 작성하거나 list의 insert 멤버 함수를 사용하는 방법이 있을 것이다. 하지만 효용성의 측면에서 assign 멤버 함수를 사용하여, 원소를 복사하는 것이 좋다고 하는데, 이는 이중 링크트 리스트인 list의 next, prev 포인터가 계속되는 원소 추가에 대해 불필요한 포인터 세팅을 하지 않도록 하고, 한번의 대입 만으로 각 포인터가 삽입 후의 노드 주소 값을 가지도록 세팅해주기 때문이다. 안녕하세요 오늘은 C++ 자료구조 컨테이너 중 하나인 vector 라이브러리에 대해 살펴봅시다. [1탄 목차] 1. 벡터란 무엇인가? 2. 벡터의 구조와 특징 (장단점) 3. 언제 벡터를 사용하는가 4. 벡터를 사 jhnyang.tistory.com 리스트 LIST란 무엇인가? 간단요약이전 포스팅에서 살펴봤던 vector 처럼 데이터를 저장하기 위한 일종의 자료구조예요. vector, list외에도 stack, queue, heap, graph 등등.. 다양한 자료구조가 존재하는대요.
다수의 데이터를 저장할 수 있는 vector가 있음 그걸 쓰면 되지, 왜 리스트와 같은 또 다른 자료구조가 필요하냐고요? 자료를 저장하는 방식에 따라 장단점이 달라지기 때문입니다. A방식은 데이터를 추가하는데 성능이 좋은데, B방식은 검색하는데 성능이 좋고~ 모두 다 좋으면 좋겠지만 그럴 수 없기에 내가 구현하고자 하는 프로그램의 목적에 맞춰서 효율적으로 데이터를 사용하기 위함이예요. 리스트란 순서를 가진 항목들의 모임입니다. ADT를 정의하면 저장 형태는 데이터를 나란히 저장을 하며 저장 특성으로는 중복된 데이터의 저장을 허용한다는 것입니다. 리스트 자료구조의 ADT의 예시는 다음과 같습니다. (지정 하기 나름입니다)
그럼 이걸 C언어 함수 같이 만들어 볼까요?
배열을 이용하여 만드는 방법과 동적 할당을 통해서 이용하는 방법입니다. 우선 이번에는 배열을 통한 리스트 구현에 대해서 알아보겠습니다. 1차원 배열을 이용하기 때문에 다음과 같은 특징이 있습니다. 우선 1차원 배열에 항목들을 순서대로 저장합니다. 2번째는 삽입위치부터의 항목들을 뒤로 밀어 주어야 한다는 것이고 3번쨰는 삭제 연산시에 삭제를 한 자리를 비우고 다음항목들을 앞으로 당겨 줘야 합니다. 이는 배열의 특징중 중간 데이터가 빌 수 없다는 특징에 따라서 위의 경우들을 지켜주어야합니다. 배열로 만들면 어떤게 좋고 어떤게 안좋을까요? 다음과 같이 나눠봤습니다.
이제 특징과 장단점도 알아봤으나 구현을 해보겠습니다. 배열로 구현을 하기 위하여 순차 리스트 구조체를 다음과 같이 썼습니다.. int Array[MAX_SIZE];//배열의 크기 int length = 0;//배열에 저장된 항목 개수 cs앞으로의 자료구조가 그렇듯 꼭 같을 필요는 없습니다. 구현해보는 것이기 때문에 데이터 참조위치 변수를 더 추가한다거나 할 수도 있습니다. 저는 배열로 리스트를 구현할 때 다음의 ADT들을 구현하였습니다. void Add_First(ListArray *L, int Value)//배열 리스트의 가장 처음 데이터를 추가 void Add(ListArray *L, int Value, int POSITION)//배열 리스트의 특정 위치에 데이터를 추가 void Add_Last(ListArray *L, int Value)// 배열 리스트의 제일 마지막에 데이터를 추가 void Erase(ListArray *L, int POSITION)//배열 리스트의 특정 위치의 데이터를 삭제 void Array_Clear(ListArray *L)// 배열 리스트의 모든 데이터를 없앰 void Find_Value(ListArray *L, int VALUE)// 특정값을 배열 리스트에서 찾음 int Replace(ListArray *L, int POSITION, int VALUE)//배열 리스트의 특정 위치의 값을 다음 값으로 바꿈 void Return_length(ListArray *L)// 배열 리스트의 총 길이를 보여줌 void is_Full(ListArray *L)//배열 리스트가 가득 찾는지를 확인 void is_Empty(ListArray *L)//배열 리스트가 비엇는지를 확인 void Output(ListArray *L)//현재 배열 리스트에 있는 데이터를 순차적으로 모두 출력 cs다른 기능을 구현해도 좋지만 제가 한 것들 하나씩 살펴보겠습니다.
|