728x90
- 연결 리스트 : 각 데이터를 포인터를 이용해 다음 자료를 가리키도록 연결해둔 형태의 자료구조
배열 | 연결 리스트 | |
임의 원소 탐색 | O(1) | O(n) |
임의 위치에 추가/제거 | O(n) | O(1) (위치 주소를 아는 경우) O(n) (위치 주소를 모르는 경우) |
메모리 배치 | 연속 | 불연속 |
Cache hit rate | 높음 | 낮음 |
- 연결 리스트의 종류
- 단일 연결 리스트 : 각 원소가 다음 원소를 가리킴
- 이중 연결 리스트 : 각 원소가 이전/다음 원소를 가리킴 (STL의 list 자료형이 이중 연결 리스트)
- 원형 연결 리스트 : 끝 원소가 다음 원소로 처음 원소를 가리킴
- 연결 리스트의 구현
//구조체를 이용한 구현
struct node{
struct node *prev, *next;
int data;
}
- 배열을 이용한 연결리스트의 구현
//배열을 이용한 연결리스트 구현
#include <algorithm>
const int MX = 1000005;
int dat[MX], pre[MX], nxt[MX]; //dat : 데이터, pre/nxt : 이전/다음 원소 위치
int unused = 1; // 사용되지 않은 원소 인덱스
fill(pre, pre + MX, -1);
fill(nxt, nxt + MX, -1);
//모든 원소 순회
void traverse(){
int cur = nxt[0];
while(cur != -1){
cout << dat[cur] << ' ';
cur = nxt[cur];
}
}
void insert(int addr, int num){
dat[unused] = num;
pre[unused] = addr;
nxt[unused] = nxt[addr];
if(nxt[addr] != -1) pre[next[addr]] = unused;
nxt[addr] = unused;
unused++;
}
void erase(int addr){
nxt[pre[addr]] = nxt[addr];
pre[nxt[addr]] = pre[addr];
}
- 메모리 문제가 있어 실제로는 쓰기 그렇고, 코테에서만 사용할 것
- STL list를 사용한 구현
#include <list>
int main(void){
list<int> L = {1, 2};
list<int>::iterator t = L.begin(); // list 원소를 가리키는 변수
L.push_front(10); // 앞에 데이터 추가 O(1)
L.push_back(10); // 뒤에 데이터 추가 O(1)
L.insert(t, 6); // t가 가리키는 곳 앞에 6 삽입
t = L.erase(t); // t가 가리키는 곳을 지우고, 다음 주소를 반환
//연결리스트 순회
for(t = L.begin();t != L.end() ; t++){
cout << *t;
}
// C++11 이상
for(auto i : L) cout << i;
}
728x90