//////
Search
📒

연결 리스트2

1. 소스코드

#include <stdio.h> #include <stdlib.h> // 구조체 정의 typedef int element; typedef struct ListNode { element data; // 해당 노드의 원소값 struct ListNode *link; // 다음 노드 주소값을 가리키는 포인터 } ListNode; void print_list(ListNode *head) { // 다음 노드가 없을때까지 반복 for(ListNode *p = head; p != NULL; p = p->link) { printf("%d -> ", p->data); } printf("NULL \n"); } void insert_first(ListNode *head, int value) { ListNode *p = (ListNode *)malloc(sizeof(ListNode)); p->data = value; p->link = head->link; // 현재 헤드 포인터가 지니고 있는 주소값 복사 head->link = p; // 삽입할 노드의 주소값을 헤드 포인터에게 전달 } void insert_last(ListNode *head, int value) { ListNode *p = (ListNode *)malloc(sizeof(ListNode)); p->data = value; p->link = NULL; // 리스트가 비어 있는 경우 if (head->link == NULL) { head->link = p; return; } // 리스트가 비어 있지 않은 경우 ListNode *node_ptr = head; while (node_ptr->link != NULL) { node_ptr = node_ptr->link; } node_ptr->link = p; } void delete_first(ListNode *head) { ListNode *removed = head->link; if(head->link == NULL) { printf("빈 리스트입니다.\n"); } // 헤드가 두 번째 노드를 가리키도록 조정 head->link = removed->link; free(removed); } void delete_last(ListNode *head) { ListNode *removed = head; ListNode *prev; if(head->link == NULL) { printf("빈 리스트입니다.\n"); } while(removed->link != NULL) { prev = removed; removed = removed->link; } if(prev == NULL) { head->link = NULL; } else { // 이전 노드가 마지막 노드순서가 될 수 있도록 링크값을 NULL로 설정 prev->link = NULL; } // 메모리 할당 해제 free(removed); } void search(ListNode *head, int value) { ListNode *p = head; int located_index = 0; while(p != NULL) { ++located_index; if(p->data == value) { printf("%d번째에 위치하고 있습니다.\n", located_index+1); break; } // 다음 노드로 이동 p = p->link; } } int main(void) { // 일단 메모리 동적할당 및 초기화 작업 수행 ListNode* head = (ListNode *)malloc(sizeof(ListNode)); head->data = 10; head->link = NULL; // 값 삽입 for(int i=2; i<6; i++) { insert_first(head, i*10); } // 끝에 삽입 insert_last(head, 60); // 삭제 delete_last(head); delete_first(head); // 출력 print_list(head); // 탐색 search(head, 10); free(head); return 0; }
C
복사

2. 실행결과

3. 고찰

link를 업데이트 해주면서 순회를 해야하는데, 자꾸 빠뜨리는 바람에 계속 에러가 많이 났습니다.
꼼꼼히 하려고 하는데도 자꾸 과제로 시간어택하는 때만 되면 급해지는 것 같아서, 좀 더 차분하게 코드를 써내려갈 필요가 있다고 느꼈습니다.