5명의 학생 정보를 저장하는 단순연결리스트를 구현해봤습니다.
첫노드, 특정 노드의 앞,뒤, 맨 끝 노드 삽입 등의 경우를 고려하지않고 단순히 입력데이터를 맨 끝에 추가하였습니다.
주의
아래 코드와 같은 구현의 insert함수에서 이중 포인터가 아닌 단순1차원 포인터를 사용하면 정답이 출력되지않습니다.
이유는 1차원 포인터 사용 시 insert함수 내부에서 main문의 head가 아닌 새로운 head변수를 이용하므로
즉, 주소값이 아닌 값을 이용한 call by value 형식이므로 함수내부에서 함수내부의 새로운 head로 연산이 진행될 뿐
main문의 head에는 영향이 없습니다.
즉, 최초에 비어있는 리스트에 1차원포인터로 insert함수에 인자를 넘겨주면 연산 후 main문의 head는 여전히 NULL상태가 됩니다.
따라서 2차원 포인터로 주소값을 받아 함수 내부에서 head를 변경 시킬 수 있도록 해야합니다.
1차원 포인터를 쓰고싶다면 insert 함수에서 사용한 head를 ListNode*형으로 반환하여 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 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 54 55 56 57 58 59 | #pragma warning(disable:4996) #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { char name[10]; int age; int height; } element; typedef struct ListNode { // 노드 타입 element data; struct ListNode* link; } ListNode; // 오류 처리 함수 void error(char* message) { fprintf(stderr, "%s\n", message); exit(1); } void insert_last(ListNode** head, element value) { ListNode* p = (ListNode*)malloc(sizeof(ListNode)); if (p == NULL)return; p->data = value; p->link = NULL; if (*head == NULL) *head = p; else { ListNode* temp = *head; while (temp->link != NULL) temp = temp->link; temp->link = p; } } void print_list(ListNode* head) { for (ListNode* p = head; p != NULL; p = p->link) printf("이름:%s 나이:%d 키%d \n", p->data.name, p->data.age, p->data.height); } // 테스트 프로그램 int main(void) { ListNode* head = NULL; element data; //5명의 학생 정보 입력받기 for (int i = 0; i < 5; i++) { scanf("%s %d %d", data.name, &(data.age), &(data.height)); insert_last(&head, data); } print_list(head); return 0; } | cs |
결과
'자료구조 > 리스트' 카테고리의 다른 글
헤드노드를 이용하지않는 이중연결리스트의 구현 (0) | 2020.05.16 |
---|---|
헤드노드를 이용한 이중연결리스트의 구현 (0) | 2020.05.16 |
원형연결리스트 삽입 구현하기(맨앞,중간,맨뒤) (0) | 2020.04.29 |
단순 연결리스트에서 정렬된 값 찾기 (0) | 2020.04.22 |