티스토리 뷰
자료구조는 구현도 중요하지만 이에 못지않게 활용도 중요합니다. 실제로 이미 구현되어 있는 자료구조를 활용하는 것도 실력입니다. 따라서 다음 헤더 파일에 정의된 구조체를 기반으로 리스트를 활용하는 예제를 작성해 보기로 합니다.
//NameCard.h 헤더 파일로 저장
#define NAME_LEN 30
#define PHONE_LEN 30
typedef struct
{
char name[NAME_LEN];
char phone[PHONE_LEN];
} NameCard;
//NameCard 구조체 변수의 동적 할당 및 초기화 후 주소 값 반환
NameCard* MakeNameCard(char* name, char* phone);
//NameCard 구조체 변수의 정보 출력
void ShowNameCardInfo(NameCard* pcard);
//이름이 같으면 0, 다르면 0이 아닌 값 반환
int NameCopare(NameCard* pcard, char* name);
//전화번호 정보를 변경
void ChangePhoneNum(NameCard* pcard, char* phone);
위의 헤더 파일에 대응하는 소스 파일 NameCard.c를 작성합니다. 그리고 아래에 나열된 순서대로 일을 진행하도록 main함수를 정의합니다. 물론 이를 위해서 앞서 구현한 리스트를 활용해야 합니다.
- 총 3명의 전화번호 정보를, 앞서 우리가 구현한 리스트에 저장합니다.
- 특정 이름을 대상으로 탐색을 진행하여, 그 사람의 정보를 출력합니다.
- 특정 이름을 대상으로 탐색을 진행하여, 그 사람의 전화번호를 변경합니다.
- 특정 이름을 대상으로 탐색을 진행하여, 그 사람의 정보를 삭제합니다.
- 끝으로 남아 있는 모든 사람의 전화번호 정보를 출력합니다.
더불어 저장의 형태는 NameCard 구조체 변수의 주소 값이어야 하며, 위에서 언급하는 '특정 이름'은 임의로 지정하되 서로 다른 이름으로 지정하기로 합니다.
제가 작성한 코드는 아래의 '더보기'를 클릭하여 확인할 수 있습니다.
//NameCard.h 헤더 파일로 저장
#ifndef NAMECARD_H
#define NAMECARD_H
#define NAME_LEN 30
#define PHONE_LEN 30
typedef struct
{
char name[NAME_LEN];
char phone[PHONE_LEN];
} NameCard;
//NameCard 구조체 변수의 동적 할당 및 초기화 후 주소 값 반환
NameCard* MakeNameCard(char* name, char* phone);
//NameCard 구조체 변수의 정보 출력
void ShowNameCardInfo(NameCard* pcard);
//이름이 같으면 0, 다르면 0이 아닌 값 반환
int NameCopare(NameCard* pcard, char* name);
//전화번호 정보를 변경
void ChangePhoneNum(NameCard* pcard, char* phone);
#endif
//NameCard.c 소스 파일로 저장
#include"NameCard.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
NameCard* MakeNameCard(char* name, char* phone)
{
NameCard* pcard = (NameCard*)malloc(sizeof(NameCard));
strcpy(pcard->name, name);
strcpy(pcard->phone, phone);
return pcard;
}
//NameCard 구조체 변수의 정보 출력
void ShowNameCardInfo(NameCard* pcard)
{
printf("이름 : %s\n", pcard->name);
printf("전화번호 : %s\n", pcard->phone);
}
//이름이 같으면 0, 다르면 0이 아닌 값 반환
int NameCopare(NameCard* pcard, char* name)
{
if (strcmp(pcard->name, name) == 0) return 0;
else return -1;
}
//전화번호 정보를 변경
void ChangePhoneNum(NameCard* pcard, char* phone)
{
strcpy(pcard->phone, phone);
}
//ArrayList.h 헤더 파일로 저장
#ifndef ARRAYLIST_H
#define ARRAYLIST_H
#include "NameCard.h"
#define LData NameCard*
#define LIST_LEN 100;
#define TRUE 1
#define FALSE 0
typedef struct
{
int count;
int point;
LData data[100];
} List;
void ListInit(List* plist);
int LCount(List* plist);
void LInsert(List* plist, LData pdata);
int LFirst(List* plist, LData* pdata);
int LNext(List* plist, LData* pdata);
LData LRemove(List* plist);
#endif
//ArrayList.c 소스 파일로 저장
#include "ArrayList.h"
void ListInit(List* plist)
{
plist->count = 0;
plist->point = 0;
}
int LCount(List* plist)
{
return plist->count;
}
void LInsert(List* plist, LData pdata)
{
plist->data[plist->count++] = pdata;
}
int LFirst(List* plist, LData* pdata)
{
plist->point = 0;
if (plist->count < 1) return FALSE;
*pdata = plist->data[0];
return TRUE;
}
int LNext(List* plist, LData* pdata)
{
if (plist->point + 1 >= plist->count) return FALSE;
plist->point++;
*pdata = plist->data[plist->point];
return TRUE;
}
LData LRemove(List* plist)
{
LData data = plist->data[plist->point];
plist->count--;
int i;
for (i = plist->point; i < plist->count; i++)
{
plist->data[i] = plist->data[i + 1];
}
plist->point--;
return data;
}
//main.c 소스 파일로 저장
#include "ArrayList.h"
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
List list;
ListInit(&list);
NameCard* pcard;
//3명의 전화번호 정보 저장
pcard = MakeNameCard("홍길동", "010-1122-3344");
LInsert(&list, pcard);
pcard = MakeNameCard("KOEY", "010-5522-6644");
LInsert(&list, pcard);
pcard = MakeNameCard("유관순", "010-7788-1212");
LInsert(&list, pcard);
//특정 이름을 대상으로 탐색을 진행하여, 그 사람의 정보를 출력
if (LFirst(&list, &pcard))
{
printf("찾으시는 사람의 정보입니다.\n");
if (NameCopare(pcard, "KOEY") == 0)
{
ShowNameCardInfo(pcard);
}
else
{
while (LNext(&list, &pcard))
{
if (NameCopare(pcard, "KOEY") == 0)
{
ShowNameCardInfo(pcard);
break;
}
}
}
}
else printf("리스트에 저장된 데이터가 없습니다.\n");
printf("\n");
//특정 이름을 대상으로 탐색을 진행하여, 그 사람의 전화번호를 변경
if (LFirst(&list, &pcard))
{
if (NameCopare(pcard, "유관순") == 0)
{
ChangePhoneNum(pcard, "011-1234-6789");
}
else
{
while (LNext(&list, &pcard))
{
if (NameCopare(pcard, "유관순") == 0)
{
ChangePhoneNum(pcard, "011-1234-6789");
break;
}
}
}
}
else printf("리스트에 저장된 데이터가 없습니다.\n");
//특정 이름을 대상으로 탐색을 진행하여, 그 사람의 정보를 삭제
if (LFirst(&list, &pcard))
{
if (NameCopare(pcard, "홍길동") == 0)
{
pcard = LRemove(&list);
free(pcard);
}
else
{
while (LNext(&list, &pcard))
{
if (NameCopare(pcard, "홍길동") == 0)
{
pcard = LRemove(&list);
free(pcard);
break;
}
}
}
}
else printf("리스트에 저장된 데이터가 없습니다.\n");
//남아 있는 모든 사람의 전화번호 정보를 출력
if (LFirst(&list, &pcard))
{
printf("남아 있는 모든 사람의 정보를 출력합니다.\n");
ShowNameCardInfo(pcard);
while (LNext(&list, &pcard))
{
printf("\n");
ShowNameCardInfo(pcard);
}
}
else printf("리스트에 저장된 데이터가 없습니다.\n");
printf("\n");
return 0;
}
/*
실행결과
찾으시는 사람의 정보입니다.
이름 : KOEY
전화번호 : 010-5522-6644
남아 있는 모든 사람의 정보를 출력합니다.
이름 : KOEY
전화번호 : 010-5522-6644
이름 : 유관순
전화번호 : 011-1234-6789
*/
'공부 일지 > 자료구조 공부 일지' 카테고리의 다른 글
Chapter 04. 연결 리스트 관련 코드에 익숙해지기 연습문제 1 (0) | 2021.03.10 |
---|---|
Chapter 04. 연결 리스트의 개념적인 이해 (0) | 2021.03.08 |
Chapter 03. 배열을 이용한 리스트의 구현 (0) | 2021.03.08 |
Chapter 03. 추상 자료형 : Abstract Data Type (0) | 2021.03.08 |
Chapter 02. 하노이 타워 : The Tower of Hanoi (0) | 2021.03.08 |