구조체와 리스트
: 단일연결리스트 : singly linked list (링크드 리스트)
리스트 : 데이터 구조 (데이터 여러개. 배열도 데이터 구조)
유연한 데이터 관리가 가능 (배열과 비교)
1. 리스트 중간에 새로운 데이터 추가/삭제
2. 리스트의 크기를 동적으로 관리
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
typedef struct s_Student{
int id;
char subject[MAX];
struct s_Student* next; //자기 자신을 가리키는 포인터
} Student;
//3개의 Student를 가지고 리스트를 만들어 본다.
int main(){
//1. 포인터 선언
Student* student1 = 0;
Student* student2 = 0;
Student* student3 = 0;
//for문을 돌릴 포인터변수
Student* p_student = 0;
//2. 메모리 할당
student1 = (Student*)malloc(sizeof(Student));
student2 = (Student*)malloc(sizeof(Student));
student3 = (Student*)malloc(sizeof(Student));
//데이터 입력
student1->id=1111;
strcpy(student1->subject, "math");
student2->id=2222;
strcpy(student2->subject, "law");
student3->id=3333;
strcpy(student3->subject, "computer");
//node연결
//node: 리스트를 구성하는 원소 하나 = 배열의 원소와 같은 개념.
student1->next = student2;
student2->next = student3;
student3->next = 0;
//출력 : linked list를 순회(앞으로 하나씩 전진하면서 방문)하면서 출력
for(p_student = student1; p_student != 0 ; p_student= p_student->next ){
printf("%d %s\n", p_student->id, p_student->subject );
}
//3. 메모리 반환
free(student1);
free(student2);
free(student3);
}
열거형 상수 enumrate
: enum , 상수 정의하는 용도로 사용 (enum은 %d.). 코드 가독성이 뛰어남.
enum 정의 방법: typedef를 이용. 대체적으로 대문자(상수)
#include <stdio.h>
#define MAX 100
#define SIZE 3
typedef enum e_ShcoolYear{ //열거형 이름
FRESHMEN, //1학년
SOPHOMORE, //2학년
JUNIOR, //3학년
SENIOR //4학년
} SchoolYear;
//Structure을 정의
typedef struct s_Student{
int id;
char major[MAX];
SchoolYear year;
}Student;
void print_student(Student students){
printf("%d %s ", students.id, students.major);
switch(students.year){
case FRESHMEN:
printf("Freshmen\n");
break;
case SOPHOMORE:
printf("Sophomore\n");
break;
case JUNIOR:
printf("Junior\n");
break;
case SENIOR:
printf("Senior\n");
break;
}
}
int main(){
int i = 0;
Student students[SIZE] = {{1111, "math", FRESHMEN},
{2222, "bio", SENIOR},
{3333, "art", JUNIOR} };
for(i=0; i<SIZE; i++){
//printf("%d %s %d\n", students[i].id, students[i].major, students[i].year);
print_student(students[i]);
}
}
구조체와 함수의 인수
구조체를 함수의 인자로 넘길 때.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
//1단계
//Student 구조체 만들기
//메인에서 배열갯수를 입력받기
//배열갯수만큼 메모리를 동적할당 : 동적으로 배열만들기
//사용자로부터 값 입력받기
//배열 출력
//2단계
//배열입력받는 함수(포인터, 배열갯수)
//배열출력하는 함수(포인터, 배열갯수)
typedef struct s_Student{
int id;
char major[MAX];
} Student;
void read_student(Student* p_student, int count){
int i =0;
for(i=0; i<count; i++){
printf("id를 입력하세요\n");
scanf("%d", &p_student[i].id );
printf("전공을 입력하세요\n");
scanf("%s", p_student[i].major);
}
}
void print_student(Student* p_student, int count){
int i =0;
for(i =0; i<count; i++){
printf("id는 %d, 전공은 %s\n", p_student[i].id, p_student[i].major);
}
}
void print(Student student){
printf("id는 %d, 전공은 %s\n", student.id, student.major);
}
int main(){
int count = 0;
int i =0;
//1. 포인터 선언
Student* p_student = 0;
printf("배열의 갯수를 입력하세요\n");
scanf("%d", &count);
printf("배열의 갯수는 %d\n\n", count);
//2. 포인터 할당
p_student = (Student*)malloc(sizeof(Student)*count);
//사용자로부터 입력
read_student(p_student, count);//배열은 배열이름(포인터)과 크기(size) **동적할당은 무조건 포인터!!
printf("\n");
//출력
print_student(p_student, count);
for(i=0; i <count; i++){
print(p_student[i]);
}
//3. 포인터 반환
free(p_student);
}
'C언어 > 복습' 카테고리의 다른 글
[C언어]DAY18_ 구조체 배열, 구조체 포인터, 구조체 동적할당 (0) | 2020.02.11 |
---|---|
[C언어]DAY17_동적 메모리 할당(문자열이 여러개인 경우), 구조체 선언 (0) | 2020.02.10 |
[C언어]DAY16_동적 할당, 동적 배열 (0) | 2020.02.10 |
[C언어]DAY15_ 포인터 배열, 더블포인터, 문자열 표준 라이브러리 (0) | 2020.02.10 |
[C언어]DAY14_배열포인터 (0) | 2020.02.05 |