3. 이어서 함수 설명
[ Init ]
void Init(linkedList *L) {
L->head = NULL;
L->tail = NULL;
L->cnt = 0;
}
- 리스트를 초기화 한다. 아직 아무런 값이 들어있지 않기 때문에 헤드와 테일을 각각 NULL로 초기화 하고, 카운트 값인 cnt는 0으로 초기화 한다.
[ createNode ]
void createNode(linkedList *L, char *ndata, int pdata, int num) {
node *f = L->head;
node *newNode = (node *)malloc(sizeof(node));
newNode->no = num;
strcpy(newNode->name, ndata);
newNode->phone = pdata;
int i;
if (num <= 0) {
printf("삽입 위치가 리스트의 길이보다 짧음.\n");
exit(1);
}
else if (num == 1) {
if (L->head == NULL && L->tail == NULL) {
printf("헤드\n");
L->head = newNode;
L->tail = newNode;
newNode->next = NULL;
printf("이름 : %s 전화번호 : %d\n", newNode->name, newNode->phone);
L->cnt++;
returnMain(L);
}
else {
printf("헤드뺏기2\n");
newNode->next = L->head;
L->head = newNode;
L->head->next->prev = newNode;
newNode->prev = L->head;
printf("이름 : %s 전화번호 : %d\n", newNode->name, newNode->phone);
L->cnt++;
returnMain(L);
}
}
else if (num == (L->cnt) + 1) {
printf("테일\n");
newNode->prev = L->tail;
L->tail->next = newNode;
L->tail = newNode;
newNode->next = NULL;
printf("이름 : %s 전화번호 : %d\n", newNode->name, newNode->phone);
L->cnt++;
returnMain(L);
}
else {
if (num > (L->cnt) + 2) {
printf("삽입 위치가 리스트의 길이보다 길다\n");
exit(1);
}
else {
for (i = 1; i < num - 1; i++)
f = f->next;
}
newNode->next = f->next;
f->next->prev = newNode;
newNode->prev = f;
f->next = newNode;
printf("이름 : %s 전화번호 : %d\n", newNode->name, newNode->phone);
L->cnt++;
returnMain(L);
}
}
- 함수에 사용되는 인자값으로 리스트 L과 이름 데이터 ndata, 핸드폰 번호 데이터 pdata, 노드위치 데이터인 num을 사용한다.
- 이름에 데이터를 넣을 때, strcpy를 사용하는 이유는 name변수가 배열로 선언되어 있기 때문에, 바로 넣을 수 없기 때문.
- 노드를 삽입하고 나면 cnt변수를 하나씩 증가시켜준다.
- else if (num == 1) 부분
-- 첫번째 노드로 삽입하고 싶을 때의 조건문이다.
-- 조건문 두개로 나뉘어져 있는데
[[ L->head == NULL && L->tail == NULL ]] 리스트에 아무것도 없고 처음 삽입할 경우이다.
헤드와 테일을 전부 새로 만든 노드로 지정해주고, 새 노드의 next에 NULL을 넣어준다. 다음 노드가 없기 때문.
-- 아래 else 부분은 리스트에 노드들이 들어 있는데, 첫 노드로 끼워넣고 싶을 때 사용된다.
헤드의 앞에 넣어야 되기 때문에, 새 노드의 next에 헤드를 넣고, 헤드를 새 노드로 바꾼다.
L->head->next 즉 원래 있던 헤드의 다음 노드의 prev에 새 노드를 넣는다.
마지막으로 새 노드의 prev에 헤드를 넣어준다.
- else if (num == (L->cnt) + 1) 부분
-- 마지막 노드로 십입하고 싶을 때의 조건문이다.
-- 새 노드의 prev에 테일을 넣어주고, 원래 테일의 next에 새 노드를 넣는다.
그리고 테일을 새 노드로 바꿔준다. 새 노드의 next엔 NULL을 넣는다. 테일이 리스트의 맨 끝이기 때문.
리스트의 연결 부분을 말로 하나씩 설명하려니 너무 어렵네.. 이후로는 리스트설명 안합니다!!
잘 이해가 안가시면 그림을 직접 그려보세요!! 아니면 다른 블로그 구글링 ㄱㄱ!!
- else 부분
-- 헤드와 테일 이외의 노드를 삽입할 때이다.
-- 넣을 위치를 먼저 찾아가야 하기 때문에, 더미 역할을 할 노드인 f를 선언하면서 리스트의 첫 위치인 헤드로 초기화 해준다.
-- for (i = 1; i < num - 1; i++) f = f->next;
원하는 위치까지 찾아가는 반복문이다.
[ deleteNode ]
void deleteNode(linkedList *L){
node *f = L->head;
int i, num;
printf("삭제할 노드 번호를 입력하세요 : ");
scanf(" %d", &num);
if (num <= 0) {
printf("삭제 위치가 리스트의 길이보다 짧다\n");
deleteNode(L);
}
else if (num == 1) {
L->head = L->head->next;
printf("%d 번째 노드 삭제 완료\n", num);
L->cnt--;
returnMain(L);
}
else if (num == L->cnt) {
L->tail = L->tail->prev;
L->tail->next = NULL;
printf("%d 번째 노드 삭제 완료\n", num);
L->cnt--;
returnMain(L);
}
else {
if (num > (L->cnt) + 1) {
printf("삭제 위치가 리스트의 길이보다 길다\n");
deleteNode(L);
}
else {
for (i = 1; i < num; i++)
f = f->next;
}
f->prev->next = f->next;
f->next->prev = f->prev;
printf("%d 번째 노드 삭제 완료\n", num);
L->cnt--;
returnMain(L);
}
}
- 삭제할 노드의 순번을 사용자에게 입력받기 때문에 함수 자체의 인자값은 리스트 L 하나만 들어간다.
- 노드를 삭제할 때 마다 cnt 값을 1씩 감소시킨다.
- else if (num == 1) 부분
-- 첫번째 노드를 삭제할 때의 조건문.
-- 헤드를 날려버리기만 하면 되기 때문에 간단하다. 헤드를 다음노드로 변경해준다.
- else if (num == L->cnt) 부분
-- 마지막 노드를 삭제할 때의 조건문.
-- 첫 노드와 마찬가지로 테일만 날려버리면 된다. 테일을 이전노드로 변경해주고, 테일의 다음값을 널로 설정한다.
- else 부분
-- 노드를 삽입할 때와 마찬가지로 더미노드 f를 만들어주고, 삭제할 위치까지 찾아간다.
-- 찾은 노드의 이전 노드와 다음 노드를 이어준다.
다음 글에서 검색과 출력함수 설명하겠음
'개발 > C' 카테고리의 다른 글
| [C]이중연결리스트를 사용한 전화번호부 - 03 (0) | 2018.03.30 |
|---|---|
| [C]이중연결리스트를 사용한 전화번호부 - 01 (0) | 2018.03.30 |