티스토리 뷰

앞서 구현한 원형 연결 리스트를 기반으로 다음 내용을 모두담고 있는 프로그램을 작성해 봅니다.

  • 직원 정보를 등록할 수 있다. 직원 정보는 사번과 이름으로 구성이 된다. 

직원 정보를 담을 수 있는 구조체를 정의하고, 이를 기반으로 대략 네 명의 직원 정보를 원형 연결 리스트에 저장합니다. 네 명의 직원 정보는 임의로 결정하기로 하고(프로그램 사용자로부터 입력받지 않아도 됩니다), 직원의 사번은 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을(를) 제거합니다
데이터를 삭제합니다.
유순신을(를) 제거합니다
데이터를 삭제합니다.

*/
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
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
29 30 31
글 보관함