본문 바로가기
P/C++

링크드리스트로 하드디스크 흉내내기.

by Where's my namespace 2012. 11. 13.

링크드 리스트로 하드디스크를 흉내 내봤다. 하드디스크는 통으로 쭉쭉 파일이 저장되고 그런 경우가 컴퓨터를 오래 사용

하면 할수록 잘 없어진다. 보통 하드디스크는 일단 용량이 있으면 그 용량에 넣고, 안될경우 잘게 짤라서 넣게된다. 이때

다음데이터의 위치는 가지고 있어야 사용 가능하다. 이걸 생각해보면 링크드리스트 개념이다. 어디에 들어갈지는 모르지

만, 일단 들어가면 각 노드마다 다음 노드를 가르키고있는 그런 모습이다.

우선, 기본적인 노드로 활용할 구조체와, 하드디스크용으로 쓸 클래스이다.

 

간단하다. 위에 #define 는 일단 하드디스크의 총 용량을 1000으로 잡았다. 클래스내에 있는 함수를 간략히 설명하자면,

End()함수의 경우. 이 프로그램이 파일입출력으로 결과가 나오게끔 되어있는데 파일출력부분에 해당한다.

Execute()함수는 파일을 입력받아 파일에 있는 데이터들을 파일안에 있는 명령에 따라 처리한다.

나머지는 이름이 직관적이므로 설명은 생략한다.

 

main()함수를 보자.

 

 

간단하다. main내부에는 최대한 간단하게 할려고 했다.

 

class 멤버함수들의 정의를 살펴보자,

 

End()함수

 

간단하다. 조금 설명을 하자면. 아까 위 Class 에있던 리스트에 어떤 데이터가 있는지 출력하는 것이다. 만약 그 데이터가 FREE일 경우에는 단순이 FREE만 출력하고, 다른 데이터 일 경우 그게 저장된 순서로 몇번째 인지 까지 출력한다. 이 결과는 밑에서 입력파일과 출력파일을 통해 좀더 살펴보자,

 

Execute() 함수

 

이 함수 또한 그렇게 어려운 내용은 없다. 단순히 파일을 읽어서 그 파일에 + 가 나올 경우 뒤에 나오는 파일명, 크기에 따라 데이터를 넣어주고 - 가 나올 경우 데이터를 뺀다. 간단하다 .

 

DataWrite() 함수

 

 

이 프로그램중에서 가장 중요한 dataWirite 함수이다. 넣는 경우가 조금 생각이 많이 필요했당. write를 할 경우에는, 같은 데이터가 있는지 없는지를 검사하고, 없을 경우에만 데이터를 넣는다. 남은 데이터 크기와 들어갈 데이터 크기도 검사하고, 빈 공간중에서 가장 큰 공간들 부터 차곡차곡 채워나간다. order 변수는 데이터가 몇번째에 있는 것인지 나타낸다. 예를 들어 apple 라는 데이터를 여러개 쪼개어 넣었을때 apple1 -> apple2 -> apple3 처럼 연결된 데이터의 순서이다.

 

DataDelete() 함수

 

delete함수도 간단하다. 다만 조금 생각해야 할 부분이, 연속하는 FREE공간이 나올 경우 하나로 합쳐주어야한다. 그 작업이 어떻게 되는지를 생각해봐야하는데, 이 프로그램에서는 데이터를 지우면 데이터 이름만 FREE라고 고치고 나서 전체적으로 보면서 연속하는 FREE가 있을 경우 합쳐주는 작업을 했다.

 

다음은 입력파일의 예이다.

 

9
+ A 200
+ B 200
+ C 200
+ D 200
+ E 200
- A
- C
- E
+ A 300

 

와 같은 입력으로 들어온다. 가장 첫줄은 명령의 수이다. 밑으로는 +일 경우 데이터 입력을 의미하고 -의 경우 데이터 삭제를 의미한다. 입력의 경우 " + 데이터명 데이터크기 " 로 넣고 데이터 삭제의 경우 "- 데이터명" 으로 넣는다.

 

출력이 예를 보자.

A.1 200
B.1 200
A.2 100
FREE 100
D.1 200
FREE 200

와 같다. "데이터명. 순서 크기 " 순으로 나오고 FREE의 경우 순서는 없이 "FREE 크기" 로 나온다.

 

'P > C++' 카테고리의 다른 글

The Trip  (2) 2014.06.27
ACM 문제중 WERTYU  (0) 2013.09.06
Calling  (0) 2012.10.01
strlen(), strcpy() 구현  (0) 2012.08.29
비속어찾기 프로그램  (0) 2012.08.29