- Today
- Total
Recent Posts
Recent Comments
Archives
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
Tags
- 알고리즘 강의
- 파이썬 강좌
- 코딩시험
- 알고리즘
- 쉬운 파이썬
- 면접 파이썬
- 채용문제
- 파이썬활용
- 파이썬 알고리즘
- selenium
- 알고리즘 강좌
- 셀레니움
- 프로그래밍
- python 중간고사
- 자료구조 강의
- 파이썬 입문
- 크롤링
- 중간시험
- 코딩문제
- 파이썬
- c언어
- Crawling
- 대학시험
- gdrive
- python data structure
- 파이썬3
- 기말시험
- 파이썬 강의
- 자료구조
- 파이썬 자료구조
Notice
반원 블로그
[C 프로그래밍] 파일 출력 함수_3.연결 리스트 저장, 불러오기 본문
#1 ■연결 리스트를 파일에 저장하고 불러오기
연결리스트는 C언어의 기본자료형이 아닌 '사용자 정의 자료형'이기에 파일을 바이너리 쓰기 모드로 오픈하고 읽고 써야한다.
연습 1-1 : 구조체 Node 정의, 함수 saveList 구현
-데이터를 담을 구조체와 리스트의 데이터를 파일에 저장할 함수 구현
#include <stdio.h>
#incldue <stdlib.h>
//연결 리스트의 노드로 사용될 Node 구조체를 정의
struct Node{
int val1;
float val2;
struct Node* next;
};
//saveList 함수 구현 - 연결 리스트를 파일에 저장하는 기능
void saveList(FILE* fp, struct Node *p){
while(p != NULL){ //노드가 없을 때까지 반복
//전달된 연결 리스트의 모든 노드를 반복하면서 구조체의 바이너리 정보를 fwrite 함수를 이용해서 파일에 쓴다.
fwrite((void*)p, sizeof(struct Node), 1, fp);
p = p->next;
}
}
연습 1-2 : 함수 loadList 구현
- 파일 포인터를 전달 받아서 파일에 저장되어 있는 바이너리 정보를 읽어 구조체에 값을 저장하는 함수//loadList 함수 구현 - 파일 포인터를 전달 받아서 파일에 저장된 바이너리 정보를 읽어 구조체에 저장
//결과적으로 연결 리스트를 반환하기 때문에 반환을 struct Node*로 한다.
struct Node* loadList(FILE* fp){
//연결리스트의 처음 노드를 가리킬 포인터 head, 노드 가리킬 포인터 p 선언
struct Node *head = NULL, *p = NULL;
while(1) //무한 반복
{
//파일에서 읽어올 값을 저장할 구조체 동적 할당
struct Node* node = (strcut Node*)malloc(sizeof(struct Node));
//구조체 1개에 해당하는 정보를 파일에서 읽어 node 변수에 할당
int isRead = fread((void*)node, sizeof(struct Node), 1, fp);
//읽어온 값이 없을 경우 반복문 탈출
if(!isRead)
break;
//head가 비어있을 경우 node를 head로 사용
if(head == NULL){
head = node;
p = node;
}else{ //head가 비어있지 않을 경우 마지막 노드에 node 연결
p->next = node;
p = p->next;
}
}
//마지막 노드의 next를 NULL로 설정
p->next = NULL;
//연결 리스트의 첫 노드를 반환
return head;
}
※C언어에는 boolean타입이 없는 것을 생각하며 if(!isRead) 작동을 예상하자.
연습 1-3 : getLastNode 함수
- 연결리스트의 마지막 노드를 반환하는 함수, 연결리스트의 node중 하나를 매개체로 받으면 마지막 노드를 반환할 수 있다.
//getLastNode 함수 구현 - 연결 리스트의 마지막 노드를 반환하는 함수
struct Node* getLastNode(struct Node *p)
{
//연결 리스트의 마지막 노드를 P 에 저장한 뒤, 반환
while(p->next !=NULL){
p=p->next;
}
return p;
}
연습 1-4: freeNodes 함수
- 연결 리스트에 사용된 동적 메모리를 모두 해제하는 함수//freeNodes 함수 - 연결 리스트에 사용된 동적 메모리를 모두 해제하는 함수
void freeNodes(struct Node* head){
struct Node *last = head; //free할 노드를 가리키는 포인터
struct Node *temp; //다음 노드를 기억하기 위한 포인터 temp, free를 하기전 값을 저장하기 위한 용도
while(last !=NULL){
temp = last -> next; //다음 노드를 가리킨다.
free(last); //해당 노드의 메모리 해제
last = temp; //저장해놨던 다음노드를 last에도 저장
}
}
연습 1-5: makeNode 함수
- 사용자의 입력을 받아 구조체를 만들고 반환해주는 기능
//makeNode 함수 - 사용자의 입력을 받아 구조체를 만들고 반환해주는 기능
struct Node* makeNode()
{
int val1;
float val2;
struct Node* node;
//구조체에 저장할 값을 입력 받음
printf("구조체의 값을 입력하시오 INT = ");
scanf_s("%d" , &val1);
printf(" FLOAT = ");
scanf_s("%f" , &val2);
//Node 구조체를 동적 할당한 뒤, 위의 값들을 저장
node = (struct Node*)malloc(sizeof(struct Node));
node->val1= val1;
node->val2= val2;
node->next = NULL
//생성한 구조체를 반환
return node;
}
연습 1-6 : addNode 함수
- 함수의 인자로 전달된 연결리스트의 마지막 노드에 새로 생성된 노드를 추가하는 역할
- 새로 생성된 노드는 makeNode함수일 것이고 마지막 노드를 찾기위해 getLastNode함수가 쓰일 것이다.
//addNode 함수 - 함수의 인자로 전달된 연결리스트의 마지막 노드에 새로 생성된 노드를 추가하는 역할
//새로 생성된 노드는 makeNode함수일 것이고 마지막 노드를 찾기위해 getLastNode함수가 쓰일 것이다.
struct Node* addNode(struct Node *head){
//새로운 노드를 생성
struct Node *node = makeNode();
// head가 비어있을 경우 추가할 노드를 head로 사용 = 첫 노드
if(head == NULL){
head = node;
}
else{ //head 가 비어있지 않을 경우 head 의 마지막 노드에 추가할 노드를 연결
struct Node *last = getLastNode(head);
last->next = node;
}
return head; //노드가 추가된 연결 리스트를 반환
}
연습 1-7 : printList 함수
- 연결리스트의 값을 화면에 출력하는 기능
//printList 함수 - 연결리스트의 값을 화면에 출력하는 기능
void printList(struct Node *p)
{
int count = 1;
printf("-------입력된 데이터 -------\n");
//연결리스트의 각 노드를 순환하며 값을 화면에 출력
while(p!=NULL){
printf("[%d] %d, %.2f\n", count, p->val1, p->val2);
p = p->next;
count++;
}
printf("---------------------------\n");
}
연습 1-8 main 함수 작성
void main()
{
//파일 포인터, 연결 리스트 첫 노드 포인터 변수 선언
FILE *fp1, *fp2;
struct Node *head;
int input = 1;
//list.txt를 바이너리 읽기 모드로 오픈하고 fp1으로 지정한다. 실패한다면 fp1은 NULL이 될 것이다.
fp1 = fopen("list.txt", "rb");
if(fp1) //fp1가 NULL이 아니면 실행, 즉 불러올 파일 존재
{
head = loadList(fp1); //파일에 저장된 연결 리스트를 head 변수에 저장
printList(head); //불러온 연결 리스트를 화면에 출력
fclose(fp1); //읽기에 사용한 파일 포인터 해제
}
else
{
printf("저장된 자료가 없음\n");
head = NULL; //파일이 없을 경우 head를 NULL로 초기화
}
//사용자의 입력을 확인하며 연결리스트에 노드 추가
while(1)
{
printf(" [ 입력 : 1, 중단 : 0 ] ");
scanf_s("%d",&input);
if(input == 0)
break;
else
head = addNode(head); //새로운 노드를 연결리스트에 추가
}
//연결리스트의 모든 노드 값을 화면에 출력
printList(head);
//list.txt 파일을 바이너리 쓰기 모드로 오픈
fp2 = fopen("list.txt", "wb");
if(fp2)
{
//연결리스트의 모든 값을 파일에 저장
saveList(fp2, head);
fclose(fp2); //파일포인터 해제
}
//연결리스트에 사용된 모든 동적 메모리 해제
freeNodes(head);
}
'2017 > C 프로그래밍' 카테고리의 다른 글
| [C 프로그래밍] 구조체_1.기본이론 (0) | 2017.02.26 |
|---|---|
| [C 프로그래밍] 동적 메모리_4.실습_연결리스트1(Linked List) (0) | 2017.02.25 |
| [C 프로그래밍] 동적 메모리_3.이론_연결리스트1(Linked List) (0) | 2017.02.24 |
| [C 프로그래밍] 동적 메모리_2.sizeof 응용 (0) | 2017.02.22 |
| [C 프로그래밍] 동적 메모리_1.기본이론 (0) | 2017.02.21 |
| [C 프로그래밍] 파일 출력 함수_2.바이너리 모드 (0) | 2017.02.19 |
| [C 프로그래밍] 파일 출력 함수_1.기본 (0) | 2017.02.17 |
| [C 프로그래밍] 파일 입력 함수 (0) | 2017.02.17 |
Comments