Week 3-1 : Linked List
< 180410 >
1) 수시고사 review
- 특정 알파벳 갯수를 구하는 함수 만들기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include <stdio.h> int findCh(char *s, char ch) { int cnt=0; while(*s) { if(*s == ch) cnt++; s++; } return cnt; } int main() { char str[]="Data Structure"; int cnt; cnt = findCh(str, 'u'); printf("%d\n", cnt); return 0; } | cs |
2) 노드 디자인하기 (with 자기참조 구조체) AND 헤드 포인터 선언 및 초기화
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <stdio.h> typedef struct node { int data; struct node *link; } ListNode; int main() { ListNode *head = NULL; return 0; } | cs |
>> 3-6 : 노드 디자인하기
>> 10 : 노드를 연결하는 시작끈의 역할..정도?
>> NULL 로 초기화 해야한다.
>> main() 에서 10라인이 수행되고 나서의 상황.
3) create_node(10, NULL) 함수 만들기.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include <stdio.h> #include <stdlib.h> typedef struct node { int data; struct node *link; } ListNode; ListNode* create_node(int date, ListNode *link) { ListNode *newNode = (ListNode*)malloc(sizeof(ListNode)); newNode->data = data; newNode->link = link; return newNode; } int main() { ListNode *head = NULL; ListNode *newNode = create_node(10, NULL); return 0; } | cs |
>> 그냥 노드를 만들어서 그 노드를 리턴하는 함수..!!
>> 매개변수로는 data 에 저장할 값과 새로운 노드에 연결할 노드의 주소를 전달한다.
>> create_node() 가 호출되어 종료되기 직전의 상황이며, 빨간선으로 된 화살표는 함수가 리턴한 결과이다.
>> data 와 link 의 매개변수에 대한 그림은 생략...(사실 그렸어야 하는데, 빼먹음. 피피티 작업 다시 하기 귀찮......)
>> create_node() 함수의 호출이 끝난 다음 main() 의 상황이다.
4) 지역변수와 동적할당
1 2 3 4 5 6 7 | ListNode* create_node(int date, ListNode *link) { ListNode newNode; newNode.data = data; newNode.link = link; return &newNode; } | cs |
>> 이런식으로 하면 newNode 의 주소가 넘어가지만,
newNode 는 지역변수이므로 함수가 끝나는 시점(중괄호가 끝나는 시점)에서 더이상 유효하지 않게 된다.
그렇기 때문에, 해당 메모리는 언제 다른 변수에게 할당될 지 모르는 일.
>> 하지만 동적할당을 하면 해당 변수의 라이프 타임은 프로그래머가 free() 로 직접 해제하기 전까지 유효하게 된다.
>> 그렇기 때문에 3) 에서 처럼 작성하는 것이 옳다. (함수가 끝나도 해당 데이터는 유효하므로..!!)
5) 헤드 포인터에 첫 노드 연결하기.
>> 이런 모양의 결과가 나오도록 add_node() 를 구현해보려고 한다.
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 | #include <stdio.h> #include <stdlib.h> typedef struct node { int data; struct node *link; } ListNode; ListNode* create_node(int date, ListNode *link) { ListNode newNode; newNode.data = data; newNode.link = link; return &newNode; } void add_node(ListNode **head, ListNode *listNode) { *head = listNode; } int main() { ListNode *head = NULL; ListNode *newNode = create_node(10, NULL); add_node(&head, newNode); return 0; } | cs |
>> 17-20, 26 : 매개변수를 전달하는 데 있어 타입에 꼭 신경을 쓰자, 포인터 변수의 주소를 넘기므로 더블포인터로 값(주소)을 받을 수 있다.
>> 단순히 하나를 연결하기 위한 함수이다. 확장할 예정이니 태클은 ㄴㄴ.
>> add_node() 함수가 호출된 직후의 상황. add_node() 의 head 와 link 는 매개변수이지만, 해당함수의 지역변수라고 보면 된다.
>> 19 번 라인이 수행된 결과이다.
- 시간내서 http://ychooni.tistory.com/34?category=277002 여기에 있는 내용들도 확인해보자..!!
'Tutoring > 18-1 DS' 카테고리의 다른 글
Week 4-1 : Linked List (0) | 2018.04.18 |
---|---|
Week 3-2 : Linked List (0) | 2018.04.15 |
Week 2-2 : ArrayList (0) | 2018.04.05 |
Week 2-1 : How to code Recursive function2 (0) | 2018.04.04 |
Week 1-2 : How to code Recursive function (0) | 2018.03.30 |