일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 퍼셉트론
- 딥러닝
- Old-17
- 코딩테스트 연습
- 5585
- Old-14
- 웹해킹
- openCV
- 신규 아이디 추천
- c++
- 소프트맥스 함수
- 10809
- C언어
- 코드엔진
- old-1
- 백준
- 리버싱
- 자바
- 웹케이알
- 네트워크
- c언어 게임
- tcp
- 자바스크립트
- 계단함수
- JS
- 크레인 인형뽑기
- 게임 프로그래밍
- webhacking.kr
- boj
- 프로그래머스
Archives
- Today
- Total
SteffenLee
[C/C++]동적할당 연결리스트 본문
동적할당 연결리스트를 만들어봤습니다.
1 2 3 4 | typedef struct Node { int data; struct Node * next_node; }Node; | cs |
Node 구조체입니다.
node는 데이터와 다음 노드의 주소를 갖고 있습니다.
이런 식으로 이어지면 연결리스트가 됩니다.
1 2 3 4 5 6 | typedef struct _List { Node * head; Node * tail; Node * current; int NumOfData; }List; | cs |
head는 머리, tail은 꼬리, current는 현재 노드를 가르킵니다.
노드 초기화
1 2 3 4 5 6 7 | void reset_node(List *list) { list->head = NULL; list->current = NULL; list->tail = NULL; list->NumOfData = 0; } | cs |
각각의 노드는 데이터가 없으므로 NULL로 초기화 합니다.
노드 출력
1 2 3 4 5 6 7 8 | void Print_Node(List *list) { list->current = list->head; while (list->current != NULL) { cout << "노드 출력 : " << list->current->data << endl; list->current = list->current->next_node; } } | cs |
노드를 출력하는데 NULL을 만나면 출력이 종료가 됩니다.
노드 추가
머리 노드 추가는 이런 식으로 진행이 됩니다.
꼬리 노드 추가도 같은 방식으로 진행이 됩니다.
1. 머리노드 추가
1 2 3 4 5 6 7 8 9 10 11 12 | void Add_Data_head(List *list, int data) { Node *NewNode = (Node *)malloc(sizeof(Node)); NewNode->data = data; NewNode->next_node = NULL; if (list->head == NULL) list->tail = NewNode; else NewNode->next_node = list->head; list->head = NewNode; (list->NumOfData)++; } | cs |
2. 꼬리노드 추가
1 2 3 4 5 6 7 8 9 10 11 12 13 | void Add_Data_tail(List *list, int data) { Node *NewNode = (Node*)malloc(sizeof(Node)); NewNode->data = data; NewNode->next_node = NULL; if (list->tail == NULL) list->tail = NewNode; else list->tail->next_node = NewNode; list->tail = NewNode; (list->NumOfData)++; } | cs |
3. 원하는 위치에 노드 추가
원하는 위치의 노드 추가는 이러한 방식으로 진행이 됩니다.
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 | void Add_Data_any(List*list, int location, int _data) { Node* NewNode = (Node*)malloc(sizeof(Node)); NewNode->data = _data; NewNode->next_node = NULL; if (location == 1) { Add_Data_head(list, _data); (list->NumOfData)++; } else if (location > list->NumOfData) { Add_Data_tail(list, _data); (list->NumOfData)++; } else { list->current = list->head; while (location > 2) { list->current = list->current->next_node; location--; } NewNode->next_node = list->current->next_node; list->current->next_node = NewNode; (list->NumOfData)++; } } | cs |
노드 삭제
1. 머리 노드 삭제
이런 식으로 진행이 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | void Del_Data_head(List *list) { if (list->NumOfData == 0) cout << "Node is None" << endl; Node *Muck = (Node *)malloc(sizeof(Node)); Node *NextData = (Node *)malloc(sizeof(Node)); Muck = list->head; NextData = list->head->next_node; free(Muck); list->head = NextData; (list->NumOfData)--; } | cs |
2. 꼬리 노드 삭제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | void Del_Data_tail(List*list) { if (list->NumOfData == 0) cout << "Node is None" << endl; int data = list->NumOfData; list->current = list->head; while (data > 2) { list->current = list->current->next_node; --data; } Node *Muck = (Node *)malloc(sizeof(Node)); Node *NextData = (Node *)malloc(sizeof(Node)); Muck = list->current; NextData = list->current->next_node; free(NextData); list->tail = Muck; list->tail->next_node = NULL; (list->NumOfData)--; } | cs |
3.특정 위치 노드 삭제
특정 위치 노드 삭제는 이런 식으로 진행이 됩니다.
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 | void Del_Data_any(List *list, int _data) { if (_data == 1) { Del_Data_head(list); (list->NumOfData)--; } else if (_data == list->NumOfData) { Del_Data_tail(list); (list->NumOfData)--; } int data = list->NumOfData; list->current = list->head; while (_data > 2) { list->current = list->current->next_node; --_data; } Node * Muck = (Node*)malloc(sizeof(Node)); Node * NextData = (Node*)malloc(sizeof(Node)); Muck = list->current; NextData = list->current->next_node; list->current->next_node = NextData->next_node; free(Muck); (list->NumOfData)--; } | cs |
데이터 교체
데이터 교체는 특정한 위치에 있는 노드의 데이터를 바꾸는 것인데
제가 생각한 것은 그 위치에 노드를 삭제하고 그 부분에 데이터를 추가하면 된다 생각해서
1 2 3 4 5 6 | void Node_Data_Change(List*list, int location, int _data) { Del_Data_any(list, location); Add_Data_any(list, location, _data); } | cs |
이런 식으로 만들게 되었습니다.
Main함수
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 | int main() { List *P = (List *)malloc(sizeof(List)); reset_node(P); Add_Data_head(P, 10); Add_Data_head(P, 20); Add_Data_head(P, 30); Add_Data_tail(P, 40); Add_Data_tail(P, 50); Print_Node(P); cout << "//////////////////////////////////" <<endl; Add_Data_any(P, 3, 350); Add_Data_any(P, 4, 150); Add_Data_any(P, 2, 550); Print_Node(P); cout << "//////////////////////////////////" << endl; Del_Data_head(P); Del_Data_tail(P); Del_Data_any(P, 3); Del_Data_any(P, 4); Print_Node(P); cout << "/////////////////////////////////" << endl; Node_Data_Change(P, 2, 5000); Print_Node(P); } | cs |
실행 결과
처음으로 구현해본거라 타 블로그를 참고해가면서 만들었습니다.
부족한 부분이 있을 수 있습니다.
지적해주시면 잘 참고하겠습니다.
감사합니다
'Progamming > C,C++' 카테고리의 다른 글
[C언어]자료구조-스택(Stack) (0) | 2018.06.14 |
---|---|
[C++]STL vector (0) | 2018.04.07 |
[C++]decltype 타입 지정자 (0) | 2018.03.11 |
[C언어]게임 만들기 - 숫자야구.ver2(2인용) (1) | 2017.10.11 |
[C언어]게임 만들기 - 행맨[Hang Man](텍스트 기반) (5) | 2017.09.23 |
Comments