사이먼's 코딩노트
[C언어] linked List 본문
[Linked List]
- 문제 하나를 통해 링크드리스트에 대해서 살펴봅시다.
- 문제의 목표는 구조체로 선언된 사람들을 서로 연결하여 하나의 리스트로 만들고 반복문으로 순회하는 프로그램을 구현하는 것입니다.
- 문제 접근법은 아래의 여러가지 절차로 나눠 진행할 수 있습니다.
1단계 : 사람 구조체 생성 (개인의 구성요소는 이름, 나이, 사람의 위치)
2단계 : 사람 3명 생성 (구조체 변수 선언)
3단계 : 사람 3명 세팅 (이름, 나이, 위치 지정)
4단계 : 1번째 사람이 2번째 사람의 위치를 기억하고 2번째 사람이 3번째 사람의 위치를 기억
5단계 : 3번째 사람의 위치에는 NULL을 저장
6단계 : 반복문을 통해 3명의 이름과 나이를 출력
7단계 : 현재 작업중인 사람의 위치 변수에 NULL이 나올때 까지 반복하면서 다른 사람으로 이동
- 위 단계별로 진행했을 때 완성되는 코드는 아래와 같다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _Person {
int age;
char name[100];
struct _Person* next;
} Person;
int main(void) {
Person* p1 = malloc(sizeof(Person));
Person* p2 = malloc(sizeof(Person));;
Person* p3 = malloc(sizeof(Person));;
strcpy(p1->name, "홍길동");
p1->age = 11;
p1->next = p2;
strcpy(p2->name, "홍길순");
p2->age = 22;
p2->next = p3;
strcpy(p3->name, "임꺽정");
p3->age = 33;
p3->next = NULL;
Person* current = p1;
for(int i = 0; current != NULL; i++) {
printf("%d번 사람 : %s, %d살\n", i+1, current->name, current->age);
current = current->next;
}
free(p1);
free(p2);
free(p3);
return 0;
}
- 문제의 요점을 간단하게 말하면 총 3명의 사람이 있고 출력문을 통해서 입력된 사람 3명의 정보만을 출력하고 프로그램을 종료시키는 것이다. 근데 각각의 사람은 그 다음 사람과 연결되어 있다.
- 먼저 Person 이라는 구조체를 생성하고 나이(age), 이름(name), 위치(next) 변수를 생성한다.
- 이 때, next는 Person 타입을 참조하는 포인터 변수로서 struct _Person* next와 같이 선언한다.
- main 함수에서는 사람 p1, p2, p3를 포인터 변수로 선언과 동시에 동적 할당을 해준다.
- 각 포인터 변수는 주소를 나타내기 때문에 '->' 를 이용하여 각 사람의 속성 값을 저장한다.
- p1의 위치에는 p2의 주소를 담고, p2의 위치에는 p3의 주소를 담고 p3의 위치에는 그 다음 사람이 없기 때문에 null을 저장한다.
- 그 다음은 현재 위치를 나타내는 포인터 변수인 current를 선언하고 첫번째 사람인 p1의 주소를 넣어준다.
- 각 사람의 정보를 출력하기 위해서 반복문을 사용하고 반복문의 범위는 선언된 사람의 수 만큼이기 때문에 current의 값이 null일 때까지 계속 반복된다.
- current 에는 최초로 첫번째 사람의 정보가 들어가 있기 때문에 그 다음 두번째 사람의 정보를 출력하기 위해서는 next 변수를 활용한다. [current = current->next]
- 마지막으로 free()를 통해 동적 할당을 종료시킨다.
반응형
'C언어' 카테고리의 다른 글
[C언어] 구조체&동적 할당 문제풀이 (0) | 2024.02.28 |
---|---|
[C언어] 정적 및 동적 할당 (0) | 2024.02.21 |
[C언어] 구조체(Struct) (0) | 2024.02.20 |
[C언어] 포인터&배열 문제풀이(2) (0) | 2024.02.19 |
[C언어] 포인터&배열 문제풀이(1) (0) | 2024.02.19 |