티스토리 뷰
앞서 구현한 원형 연결 리스트를 기반으로 다음 내용을 모두담고 있는 프로그램을 작성해 봅니다.
- 직원 정보를 등록할 수 있다. 직원 정보는 사번과 이름으로 구성이 된다.
직원 정보를 담을 수 있는 구조체를 정의하고, 이를 기반으로 대략 네 명의 직원 정보를 원형 연결 리스트에 저장합니다. 네 명의 직원 정보는 임의로 결정하기로 하고(프로그램 사용자로부터 입력받지 않아도 됩니다), 직원의 사번은 int형 변수에 담을 수 있다고 가정합니다. 그리고 원형 연결 리스트에는 구조체 변수의 주소 값을 저장하는 것을 원칙으로 합니다.
- 직원은 순서대로 돌아가면서 당직을 섭니다.
당직의 순서는 프로그램에 등록되는 등록 순서를 기준으로 결정됩니다. 예를 들어서 A, B, C의 순으로 직원이 등록되었다면 당직을 서는 순서도 A → B → C → A → B → C 순서대로 돌아갑니다.
- 직원의 이름과 하나의 숫자를 이용해서 당직자를 확인합니다.
함수를 하나 정의합니다. 이 함수는 직원의 이름과 숫자를 인자로 전달받습니다. 그러면 전달된 이름의 직원이 당직을 선 후로, 정달된 숫자에 해당하는 만큼의 날이 지나서 당직을 서게 되는 직원의 정보를 반환합니다. 예를 들어서 '이수정'과 숫자 7이 전달되면 이수정이 당직을 선 후로 7일 뒤에 누가 당직을 서는지에 대한 정보가 반환되어야 합니다.
그럼 이제 위에서 언급한 내용을 모두 담고 있는 프로그램을 작성해 봅니다.
제가 작성한 코드는 아래의 '더보기'를 클릭하여 확인할 수 있습니다.
혹시 이해가 가지 않거나 추가 설명이 필요하다면 언제든지 물어봐주시기 바랍니다.
더보기
//Employee.h 헤더 파일로 저장
#ifndef EMPLOYEE_H
#define EMPLOYEE_H
typedef struct Employee
{
int num;
char* name;
} Employee;
void EmployeeInit(Employee* pemp, int num, char name[]);
void DelEmployeeInfo(Employee* pemp);
#endif
//Employee.c 소스 파일로 저장
#include "Employee.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void EmployeeInit(Employee* pemp, int num, char name[])
{
pemp->num = num;
pemp->name = (char*)malloc(strlen(name) + 1);
if (pemp->name == NULL) exit(1);
strcpy(pemp->name, name);
}
void DelEmployeeInfo(Employee* pemp)
{
printf("%s을(를) 제거합니다\n", pemp->name);
free(pemp->name);
}
//CLinkedList.h 헤더 파일로 저장
#ifndef C_LINKEDLIST_H
#define C_LINKEDLIST_H
#include "Employee.h"
#define TRUE 1
#define FALSE 0
typedef Employee* Data;
typedef struct Node
{
Data data;
struct Node* next;
} Node;
typedef struct CLinkedList
{
Node* tail;
Node* cur;
Node* before;
int numOfData;
} CLinkedList;
typedef CLinkedList List;
void ListInit(List* plist);
void LInsert(List* plist, Data data);
int LFirst(List* plist, Data* pdata);
int LNext(List* plist, Data* pdata);
Data LRemove(List* plist);
int LCount(List* plist);
#endif
//CLinkedList.c 소스 파일로 저장
#include "CLinkedList.h"
#include <stdio.h>
#include <stdlib.h>
void ListInit(List* plist)
{
plist->tail = NULL;
plist->cur = NULL;
plist->before = NULL;
plist->numOfData = 0;
}
void LInsert(List* plist, Data data)
{
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
if (plist->tail == NULL)
{
newNode->next = newNode;
plist->tail = newNode;
}
else
{
newNode->next = plist->tail->next;
plist->tail->next = newNode;
plist->tail = newNode;
}
plist->numOfData++;
}
int LFirst(List* plist, Data* pdata)
{
if (plist->tail == NULL) return FALSE;
plist->before = plist->tail;
plist->cur = plist->before->next;
*pdata = plist->cur->data;
return TRUE;
}
int LNext(List* plist, Data* pdata)
{
plist->before = plist->cur;
plist->cur = plist->before->next;
*pdata = plist->cur->data;
return TRUE;
}
Data LRemove(List* plist)
{
Node* delNode = plist->cur;
Data delData = delNode->data;
if (delNode == plist->tail)
{
if (plist->tail == plist->tail->next) plist->tail = NULL;
else plist->tail = plist->before;
}
plist->cur = plist->before;
plist->before->next = delNode->next;
printf("데이터를 삭제합니다.\n");
free(delNode);
return delData;
}
int LCount(List* plist)
{
return plist->numOfData;
}
//main.c 소스 파일로 저장
#include "CLinkedList.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Employee* AfterWho(List* plist, char* name, int count)
{
Employee* data;
int res = 0;
if (LFirst(plist, &data))
{
if (strcmp(data->name, name) == 0) res = 1;
else
{
int i;
for (i = 0; i < plist->numOfData - 1; i++)
{
LNext(plist, &data);
if (strcmp(data->name, name) == 0)
{
res = 1;
break;
}
}
}
}
else
{
printf("저장된 데이터가 없습니다.\n");
return NULL;
}
if (res != 1)
{
printf("입력하신 이름의 직원이 존재하지 않습니다.\n");
return NULL;
}
int i;
for (i = 0; i < count; i++)
{
LNext(plist, &data);
}
return data;
}
int main(void)
{
List list;
ListInit(&list);
Employee* employee;
//네 명의 직원 정보 등록
employee = (Employee*)malloc(sizeof(Employee));
EmployeeInit(employee, 11, "하리보");
LInsert(&list, employee);
employee = (Employee*)malloc(sizeof(Employee));
EmployeeInit(employee, 22, "이관순");
LInsert(&list, employee);
employee = (Employee*)malloc(sizeof(Employee));
EmployeeInit(employee, 33, "KOEY");
LInsert(&list, employee);
employee = (Employee*)malloc(sizeof(Employee));
EmployeeInit(employee, 44, "유순신");
LInsert(&list, employee);
//이관순 다음 5일 뒤 당직 서는 사람
employee = AfterWho(&list, "이관순", 5);
if (employee != NULL)
{
printf("이름 : %s\n", employee->name);
printf("사번 : %d\n", employee->num);
}
printf("\n");
//안소근 다음 2일 뒤 당직 서는 사람
employee = AfterWho(&list, "안소근", 3);
if (employee != NULL)
{
printf("이름 : %s\n", employee->name);
printf("사번 : %d\n", employee->num);
}
printf("\n");
if (LFirst(&list, &employee))
{
DelEmployeeInfo(employee);
LRemove(&list);
while (LNext(&list, &employee))
{
DelEmployeeInfo(employee);
LRemove(&list);
}
}
}
/*
실행결과
이름 : KOEY
사번 : 33
입력하신 이름의 직원이 존재하지 않습니다.
하리보을(를) 제거합니다
데이터를 삭제합니다.
이관순을(를) 제거합니다
데이터를 삭제합니다.
KOEY을(를) 제거합니다
데이터를 삭제합니다.
유순신을(를) 제거합니다
데이터를 삭제합니다.
*/
'공부 일지 > 자료구조 공부 일지' 카테고리의 다른 글
연습문제 05. 2 더미 노드 기반의 양방향 연결 리스트의 구현 (0) | 2021.03.11 |
---|---|
Chapter 05. 양방향 연결 리스트 (0) | 2021.03.11 |
Chapter 05. 원형 연결 리스트 (0) | 2021.03.10 |
연습문제 04. 4 정렬의 기준으로 활용되는 함수의 정의 (0) | 2021.03.10 |
Chapter 04. 연결 리스트의 정렬 삽입의 구현 (0) | 2021.03.10 |