단방향 연결 리스트(Linked List)
▷ 단방향 연결 리스트(Linked List)
형태
▷구성방법
시작전.
1). 데이터를 담을 구조체를 만든다.
2). 헤드(Head)변수를 만든다.
0. 데이터 출력.
1). 헤드를 가르킬 임시 노드 변수를 만든다.
2). 노드가 null이 아닐경우 그 노드가 가지고 있는 데이터를 출력한다.
3). 노드를 한칸 앞으로 이동해준다.
4). 현재 노드가 null이 나올때까지 2~3번을 반복한다.
1. 데이터 추가
1). 노드를 생성한다.
2). 헤드의 포인터를 처음 생성된 노드에 가르킨다.
3). 노드를 생성한다.
4). 헤드를 가르킬 임시 노드 변수를 만든다.
5). 현재 노드가 가르키는게 null이 나올때까지 노드 이동을 한다.
6). 현재 노드가 가르키는게 null일경우 새롭게 추가한 노드를 가르킨다.
7). 데이터를 추가 할 때 마다 4~6번을 반복한다.
2. 데이터 모두 삭제.
1). 헤드를 담을 임시 노드 변수를 생성한다.
2). 헤드 노드를 한 칸 앞으로 이동시킨다.
3). 임시 노드 변수를 삭제한다.
4). 헤드가 가르키는 노드가 null일때까지 1~3번을 반복한다.
3. 데이터 선택 삭제
1). 자신이 삭제할 데이터를 담을 변수를 하나 만들어서 데이터를 입력받는다
2). 첫 번째 노드(헤드)가 삭제할 데이터이면 새로운 노드 변수를 만들어 헤드를 담고
헤드를 한 칸 전진한 뒤 만든 변수를 삭제.
3). 첫 번째 노드(헤드)가 삭제할 데이터가 아니라면 헤드를 담을 변수와 헤드를 담을 변수의 전 노드를 가르킬 변수를
만든다.
4). 노드를 한 칸씩 전진 시키며 자신이 입력한 데이터와 같은지 비교한다.
5). 같다면 삭제 전용 변수의 포인터를 처음 만든 노드에 가르키고 두 번째 만든 노드는 처음 만든 노드가 가르키는 노드를 가르 킨다.
6). 삭제 전용 노드 변수를 삭제한다.
4. 데이터 선택 추가.
1). 삽입할 데이터를 입력받는다.
2). 몇 번째에 삽입할건지 인덱스를 입력 받는다.
3). 첫 번째 인덱스에 데이터를 삽입할 경우 새롭게 만든 노드를 헤드에 연결시킨 뒤
헤드를 새롭게 만든 노드를 가르킨다.
4). 첫 번째 인덱스에 데이터를 삽입하는게 아닐경우 입력받은 인덱스 - 1 만큼 노드를 이동한다.
새롭게 만든 노드를 현재 노드의 다음 노드에 연결 시킨뒤 현재 노드의 포인터를 새롭게 만든 노드에 가르킨다.
0). 데이터 출력 (Data DisPlay)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | void DisPlay() { if( pHead == NULL ) { printf("데이터가 존재하지 않습니다. \n"); return; } NODE* pNode = pHead; while(pNode != NULL) { printf("%d\n", pNode->Num); pNode = pNode->pNext; } } |
1). 데이터 추가(DataAdd)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | typedef struct NODE{ int Num; struct NODE* pNext; }NODE; NODE* pHead = NULL; void AddData() { int Data; while(1) { printf("추가할 데이터를 입력해주세요.( 종료 -1 )"); scanf("%d", &Data); if( Data == -1 ) return; NODE* NewNode = new NODE; NewNode->Num = Data; NewNode->pNext = NULL; // 처음 생성되는 노드를 헤드가 가르킨다. if( pHead == NULL ) pHead = NewNode; else { // 헤드를 직접움직이면 시작 데이터를 알수 없으므로 // 임시 변수를 만들어주어서 노드의 끝으로 이동한다. NODE* pNode = pHead; while( pNode->pNext != NULL ) pNode = pNode->pNext; // 노드를 새롭게 추가한다.(새로운 노드를 가르킨다.) pNode->pNext = NewNode; } } } |
2). 데이터 모두 삭제(Data All Delete)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | void AllDataRemove() { // 예외처리. if( pHead == NULL ) { printf("데이터가 존재하지 않습니다. \n"); return; } while(pHead != NULL) { NODE* pRemove = pHead; pHead = pHead->pNext; delete pRemove; } pHead = NULL; } |
3). 데이터 선택 삭제(Data Select Delete)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | void SelectDataRemove() { // 예외처리. if( pHead == NULL ) { printf("데이터가 존재하지 않습니다. \n"); return; } int Data; printf("삭제할 데이터를 입력하세요."); scanf("%d",&Data); NODE* pRemove; // 처음 노드가 삭제할 데이터일 경우. if(pHead->Num == Data) { pRemove = pHead; pHead = pHead->pNext; } else { NODE* pNode = pHead; NODE* pPrev; while( pNode->Num != Data ) { pPrev = pNode; pNode = pNode->pNext; } pRemove = pNode; pPrev->pNext = pNode->pNext; } delete pRemove; } |
예외처리 추가.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | void SelectDataRemove() { // 예외처리. if( pHead == NULL ) { printf("데이터가 존재하지 않습니다. \n"); return; } int Data; printf("삭제할 데이터를 입력하세요."); scanf("%d",&Data); NODE* pRemove; // 처음 노드가 삭제할 데이터일 경우. if(pHead->Num == Data) { pRemove = pHead; pHead = pHead->pNext; } else { NODE* pNode = pHead; NODE* pPrev; while( pNode->Num != Data ) { if(pNode->pNext == NULL) { printf("삭제할 데이터가 존재하지 않습니다.\n"); return; } pPrev = pNode; pNode = pNode->pNext; } pRemove = pNode; pPrev->pNext = pNode->pNext; } delete pRemove; } | cs |
4). 데이터 선택 삽입(Data Select Insert)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | void SelectDataInsert() { int Num = 0; int DataRemove = 0; printf("삽입할 데이터를 입력: "); scanf("%d",&Num); printf("몇번째에 데이터를 넣을건지 입력 : "); scanf("%d",&DataRemove); NODE* p = pHead; NODE* pNode = new NODE; pNode->Num = Num; pNode->pNext = NULL; if( DataRemove == 1 ) { pNode->pNext = pHead; pHead = pNode; } else { // n번 째 노드까지 for문을 통해 이동시킨다. for(int i = 1; i < DataRemove-1; i++) p = p->pNext; pNode->pNext = p->pNext; // 데이터가 삽입된 노드의 연결을 n번째의 다음 노드에 연결시킨다. p->pNext = pNode; // n번째의 노드의 연결을 새로 삽입된 노드에 뒤에 연결시킨다. } } |
'자료구조' 카테고리의 다른 글
큐(Queue) (0) | 2017.01.07 |
---|---|
스택(Stack) (0) | 2017.01.07 |
연결 리스트(Linked List) (0) | 2017.01.06 |
퀵 정렬 (Quick sort) (0) | 2017.01.04 |
병합 정렬(Merge sort) (0) | 2017.01.02 |
연결 리스트(Linked List)
▷ 연결 리스트(Linked List)
1. 단방향 연결 리스트.
- 한쪽 방향으로 연결된 리스트이다.
- 자료 생성시 노드가 생성되고 포인터는 생성된 포인터를 가르킨다.
2. 양방향 연결 리스트
- 양쪽 방향으로 연결된 리스트이다.
- 자료 생성시 노드가 생성되고 포인터는 생성된 포인터를 가르킨다.
그리고 새로 생성된 노드의 포인터는 전 노드를 가르킨다.
3. 환형 연결 리스트
- 양방향 연결 리스트와 비슷하지만 마지막 노드의 포인터가 가리키는 노드는 리스트의 처음 노드이다.
장점: 늘어선 노드의 중간지점 자료의 추가와 삭제가 O(1)의 시간내에 가능하다.
단점: 특정 위치의 데이터를 검색하는데에 O(n)의 시간이 걸린다는 단점이 있다.
'자료구조' 카테고리의 다른 글
스택(Stack) (0) | 2017.01.07 |
---|---|
단방향 연결 리스트(Linked List) (0) | 2017.01.06 |
퀵 정렬 (Quick sort) (0) | 2017.01.04 |
병합 정렬(Merge sort) (0) | 2017.01.02 |
쉘 정렬 (Shell sort) (0) | 2017.01.02 |
퀵 정렬 (Quick sort)
▷ 퀵 정렬 (Quick Sort)
정렬 알고리즘 중에 평균 실행 속도가 가장 빠르고 우수하므로 퀵 정렬(Quick sort)라는 명칭으로 불린다.
▷ 정렬방법.
1. 먼저 PIVOT 계수를 정한다. PIVOT 계수는 임의로 선정할 수 있으나, 중간 크기의 숫자를 PIVOT 계수로 선정하는 것이 가장 효율적이기 때문에 대부분 3개의 임의의 숫자를 랜덤으로 선택한 후 3개 중 가운데 값을 PIVOT 계수로 정한다.
2. PIVOT 값과 LEFT 값을 비교한다. 만약 LEFT 값이 PIVOT 값보다 크다면 PIVOT 값과 RIGHT 값을 비교한다.
RIGHT 값이 PIVOT 값보다 크다면, RIGHT 인덱스를 왼쪽으로 위치시킨 후 다시 PIVOT 값과 비교한다.
3. RIGHT 값이 PIVOT 값보다 작다면, LEFT 값과 RIGHT 값을 바꾼 후, LEFT 값을 오른쪽으로 한칸 전진시킨다.
4. LEFT 값과 RIGHT 값이 만날 때까지 2~3번 과정을 반복한다.
5. LEFT와 RIGHT가 만나면 해당 값과 PIVOT 값을 비교한다. PIVOT 값이 크면 오른 쪽 작으면 왼쪽에 위치 시킨다.
6. 3을 기준으로 블록을 크게 3보다 큰 값, 3보다 작은 값으로 나뉘게 된다. 3보다 작은 블록에 대해 다시 PIVOT 계수를 설정한다.
7. 기존에 한 방식대로 다시 LEFT와 RIGHT 값을 PIVOT과 비교한 후, 값을 교환한다.
8. 3보다 큰 블록에 대해서도 위와 같이 비교한다.
9. 최종 sorting이 완료된다.
Code.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | #include <iostream> using namespace std; #define MAX 9 int Partition( int *Number, int Low, int High); void QuickSort( int *Number, int Low, int High); void Swap( int *_X, int *_Y); void main() { int Number[MAX] = {5,1,6,4,8,3,7,9,2}; QuickSort( Number, 0, MAX - 1); for(int i = 0; i < MAX; i++) printf("%d \n", Number[i] ); } void Swap( int *_X, int *_Y) { int Temp = *_X; *_X = *_Y; *_Y = Temp; } void QuickSort( int *Number, int Low, int High) { if(Low < High) { int Pivot = Partition( Number, Low, High); QuickSort( Number, Low, Pivot - 1); QuickSort( Number, Pivot + 1, High); } } int Partition( int *Number, int Low, int High) { int Left = Low + 1; int Right = High; int Pivot = Number[Low]; while( Left <= Right ) { while( Number[Left] < Pivot && Left <= MAX - 1) Left++; while( Number[Right] > Pivot && Right >= 0 ) Right--; if(Left <= Right) Swap( &Number[Left], &Number[Right]); } Swap( &Number[Low], &Number[Right]); return Right; } | cs |
결과
'자료구조' 카테고리의 다른 글
단방향 연결 리스트(Linked List) (0) | 2017.01.06 |
---|---|
연결 리스트(Linked List) (0) | 2017.01.06 |
병합 정렬(Merge sort) (0) | 2017.01.02 |
쉘 정렬 (Shell sort) (0) | 2017.01.02 |
삽입정렬 (Insertion sort) (0) | 2017.01.01 |