수강한 개념
구조체 포인터
- 화살표 (->) 연산자 : 구조체 포인터의 멤버에게 접근할때 사용하는 연산자
- 자기참조 구조체
struct link {
int id;
char Bookname[30];
struct link* prev; //이전 노드 주소
struct link* next; //다음 노드 주소
};
- 링크드리스트 구현
- 이중 링크드리스트 구현
구조체 비트 필드
- 임베디드에서 가끔 사용됨. 알아보기
- 비트단위로 메모리 할당을 할 수도 있다
다양한 자료형
- union 공용체
- enum 열거형
ㄴ 코드의 가독성 상승
- typedef
ㄴ 타입 재정의
ㄴ 구조체에 많이 쓴다
문제 구현 / 개선방안
1. 이중 연결 리스트 구현
1) DLLfx.h
#pragma once
struct link {
int id;
char Bookname[30];
struct link* prev; //이전 노드 주소
struct link* next; //다음 노드 주소
};
void nodeEnter(struct link** HEAD, struct link** TAIL);
void nodePrint(struct link** HEAD, struct link** TAIL);
void nodeSearch(struct link** HEAD, struct link** TAIL);
void nodeDelet(struct link** HEAD, struct link** TAIL);
void nodeReset(struct link** HEAD);
2) DLLfx.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "DLLfx.h"
void nodeEnter(struct link** HEAD, struct link** TAIL)
{
while (1)
{
struct link* temp = (struct link*)malloc(sizeof(struct link));
if (temp == NULL)//메모리 할당 실패
{
printf("할당 실패\n");
exit(1);
}
printf("ID : ");
scanf("%d", &temp->id);
if (temp->id == -1) break; //루프 종료
printf("NAME : "); getchar();
fgets(temp->Bookname, 30, stdin);
temp->Bookname[strlen(temp->Bookname) - 1] = '\0';
temp->prev = NULL;
temp->next = NULL;
if (*HEAD == NULL) //첫번째 노드
{
*HEAD = *TAIL = temp;
}
else //첫번째 노드가 아닌경우
{
temp->prev = *TAIL;
(*TAIL)->next = temp;
*TAIL = (*TAIL)->next;
}
} getchar();
}
void nodePrint(struct link** HEAD, struct link** TAIL)
{
//출력
struct link* temp = (struct link*)malloc(sizeof(struct link));
if (temp == NULL)//메모리 할당 실패
{
printf("할당 실패\n");
exit(1);
}
temp = *HEAD;
while (temp != NULL)
{
printf("%d, %s\n", temp->id, temp->Bookname);
temp = temp->next;
}
}
void nodeSearch(struct link** HEAD, struct link** TAIL)
{
//검색 : 이름기준
struct link* temp = (struct link*)malloc(sizeof(struct link));
if (temp == NULL)//메모리 할당 실패
{
printf("할당 실패\n");
exit(1);
}
temp = *HEAD;
int sinx = 0; //이름유무 체크
char sname[20];
printf("이름검색 : ");
fgets(sname, 20, stdin);
sname[strlen(sname) - 1] = '\0';
while (temp != NULL)
{
if (!strcmp(sname, temp->Bookname))
{
printf("%d, %s\n", temp->id, temp->Bookname);
sinx = 1; break;
}
else temp = temp->next;
}
if (sinx == 0) printf("검색 결과 없음\n");
}
void nodeDelet(struct link** HEAD, struct link** TAIL)
{
//삭제
struct link* temp = (struct link*)malloc(sizeof(struct link));
if (temp == NULL)//메모리 할당 실패
{
printf("할당 실패\n");
exit(1);
}
temp = *HEAD;
int cinx = 0; //이름유무 체크
char sname[20];
printf("이름검색(삭제) : ");
fgets(sname, 20, stdin);
sname[strlen(sname) - 1] = '\0';
struct link* btemp = *HEAD; //이전 노드 주소
while (temp != NULL)
{
//btemp = 이전노드, temp = 현재노드
if (!strcmp(sname, temp->Bookname))
{
//HEAD
if (temp == *HEAD)
{
*HEAD = temp->next;
free(temp);
(*HEAD)->prev = NULL;
cinx = 1; break;
}
//TAIL
if (temp == *TAIL)
{
*TAIL = btemp;
free(temp);
cinx = 1; break;
}
//middle
else
{
temp = temp->next;
temp->prev = btemp;
temp = btemp->next;
btemp->next = temp->next;
free(temp);
cinx = 1; break;
}
}
else
{
btemp = temp;
temp = temp->next;
}
}
if (cinx == 0) printf("검색 결과 없음\n");
//삭제확인
printf("\n[삭제 후 재출력]\n");
temp = *HEAD;
while (temp != NULL)
{
printf("%d, %s\n", temp->id, temp->Bookname);
temp = temp->next;
}
}
void nodeReset(struct link** HEAD)
{
struct link* temp = (struct link*)malloc(sizeof(struct link));
if (temp == NULL)//메모리 할당 실패
{
printf("할당 실패\n");
exit(1);
}
temp = *HEAD;
while (temp != NULL)
{
*HEAD = temp->next;
free(temp);
temp = *HEAD;
}
printf("삭제가 완료되었습니다.\n");
}
3) Menu.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "DLLfx.h"
int main() {
//do-while 입력/출력/검색 메뉴 프로그램
int menuNo;
struct link* HEAD, * TAIL;
HEAD = TAIL = NULL;
do {
printf("\n----메뉴----\n");
printf("1. 입력\n");
printf("2. 출력\n");
printf("3. 검색\n");
printf("4. 삭제\n");
printf("\n");
printf("9. 종료\n");
printf("------------\n");
printf("선택 ---> ");
scanf("%d", &menuNo); getchar();
switch (menuNo) {
case 1:
printf("입력 선택하였습니다\n");
nodeEnter(&HEAD, &TAIL);
break;
case 2:
printf("출력 선택하였습니다\n");
nodePrint(&HEAD, &TAIL);
break;
case 3:
printf("검색 선택하였습니다\n");
nodeSearch(&HEAD, &TAIL);
break;
case 4:
printf("삭제 선택하였습니다\n");
nodeDelet(&HEAD, &TAIL);
break;
case 9:
printf("이중연결리스트를 해제합니다\n");
nodeReset(&HEAD);
break;
default:
printf("잘못 선택하였습니다\n");
break;
}
} while (menuNo != 9);
}
기타 사항
- 메모리맵
- 비트연산과 매크로 함수
- 엔디언
ㄴ 메모리 등에 대상을 배열하는 방법
ㄴ 방법에 따라 빅 엔디언, 리틀 엔디언, 미들 엔디언 등으로 나뉜다
VEDA 바로가기 : www.vedacademy.co.kr
VEDA(한화비전 아카데미) 영상으로 확인하기 : https://url.kr/zy9afd
본 후기는 VEDA(한화비전 아카데미) 1기 학습 기록으로 작성되었습니다.
'교육관련 > 한화비전 VEDA 수강일지' 카테고리의 다른 글
[VEDA 1기 수강일지] 6일차 - C언어 (임베디드/리눅스) (1) (0) | 2024.07.22 |
---|---|
[VEDA 1기 수강일지] 5일차 - C언어 기초 (5) : 파일입출력, 전처리, 비트연산, volatile (0) | 2024.07.19 |
[VEDA 1기 수강일지] 3일차 - C언어 기초 (3) : 포인터 응용, 동적 할당, 구조체 (0) | 2024.07.17 |
[VEDA 1기 수강일지] 2일차 - C언어 기초 (2) : 함수, 배열, 포인터 (0) | 2024.07.16 |
[VEDA 1기 수강일지] 1일차 - C언어 기초 (1) : 변수, 입출력, 제어문 (0) | 2024.07.15 |
댓글