링크드리스트ADT를 이용한 학생성적관리 Pro
LinkedListADT.h
#ifndef LinkedListADT_H
#define LinkedListADT_H
#include <iostream>
using namespace std;
template<typename TYPE>
struct NODE
{
TYPE data;
NODE<TYPE>* link;
};
template<typename TYPE, typename KTYPE>
class List
{
private :
int count;
NODE<TYPE>* head; // 헤드 노드
NODE<TYPE>* pos; // 프로세스가 끝난 current 노드
bool _search(NODE<TYPE>* &pPre, NODE<TYPE>* &pLoc, KTYPE key); //(_내부)
bool _insert(NODE<TYPE>* pPre, TYPE dataln);
void _delete(NODE<TYPE>* pPre, NODE<TYPE>* pLoc, TYPE * pDataOut);
public :
List(); //생성자
~List(); //소멸자
int addNode(TYPE dataIn);
bool removeNode(KTYPE dltkey, TYPE * pDataOut);
int listCount();
bool getNext(int fromWhere, TYPE & dataOut);
};
template<typename TYPE, typename KTYPE>
List<TYPE, KTYPE>::List()
{
count=0;
head=NULL;
pos=NULL;
}
template<typename TYPE, typename KTYPE>
List<TYPE, KTYPE>::~List()
{
NODE<TYPE>* deletePtr;
if(head != NULL)
{
while(count>0)
{
deletePtr=head;
head= deletePtr->link;
count--;
delete deletePtr;
}
}
cout<<"소멸자 콜"<<endl;
}
template<typename TYPE, typename KTYPE>
bool List<TYPE, KTYPE>::_search(NODE<TYPE>* &pPre, NODE<TYPE>* &pLoc, KTYPE key)
{
bool found;
if(count==0)
{
return false;
}
pPre=NULL;
pLoc= head;
while((pLoc !=NULL) && (key > pLoc->data.key))
{
pPre = pLoc;
pLoc = pLoc->link;
}
if(pLoc==NULL)
{
found=false;
}
else
{
if(key == pLoc->data.key)
{
found=true;
}
else
{
found=false;
}
}
return found;
}
template<typename TYPE, typename KTYPE>
bool List<TYPE, KTYPE>::_insert(NODE<TYPE>* pPre,TYPE datain)
{
NODE<TYPE>* pNew;
pNew = new NODE<TYPE>;
if(pNew==NULL)
{
return false;
}
pNew->data = datain;
pNew->link = NULL;
if(pPre==NULL)
{
pNew->link=head;
head=pNew;
}
else //중간 또는 끝에 삽입
{
pNew->link = pPre-> link;
pPre->link = pNew;
}
count++;
return true;
}
//연결리스트로부터 데이터를 삭제하고 호출한 모듈의 데이터를 반환한다.
template<typename TYPE, typename KTYPE>
void List<TYPE, KTYPE>::_delete(NODE<TYPE>* pPre, NODE<TYPE>* pLoc, TYPE * pDataOut)
{
*pDataOut = pLoc->data;
if(pPre==NULL)
{
head=pLoc->link;
}
else
{
pPre->link=pLoc->link;
}
count--;
delete pLoc;
}
template<typename TYPE, typename KTYPE>
int List<TYPE, KTYPE>::addNode(TYPE dataln)
{
bool found;
bool success;
NODE<TYPE>* pPre=NULL;
NODE<TYPE>* pLoc=NULL;
found = _search(pPre,pLoc,dataln.key);
if(found==true)
{
return (+1); // 중복
}
else //insertTYPE 할 예정 메모리 넘침주의
{
success= _insert(pPre,dataln); // pPre= 벨류~
if(success==true)
{
return (0); //true
}
else
{
return (-1);
}
}
}
template<typename TYPE, typename KTYPE>
bool List<TYPE, KTYPE>::removeNode(KTYPE dltkey, TYPE * pDataOut)
{
bool found;
NODE<TYPE> * pPre=NULL;
NODE<TYPE> * pLoc=NULL;
found = _search(pPre, pLoc, dltkey);
if(found==true)
{
_delete(pPre,pLoc,pDataOut);
return found;
}
else
{
return found;
}
}
template<typename TYPE, typename KTYPE>
int List<TYPE, KTYPE>::listCount()
{
return count;
}
//fromwhere가 0이면 첫 노드의 데이터 값을 전달
//pos는 프로세스가 끝난 노드를 가리킴
template<typename TYPE, typename KTYPE>
bool List<TYPE, KTYPE>::getNext(int fromWhere, TYPE &dataOut)
{
bool success;
if(fromWhere==0)
{
if(count==0)
{
success= false;
}
else
{
pos = head;
dataOut=pos->data;
success=true;
}
}
else
{
if(pos->link==NULL)
{
success= false;
}
else
{
pos= pos->link;
dataOut = pos->data;
success= true;
}
}
return success;
}
#endif
main.cpp
#include "LinkedListADT.h"
#include <iostream>
using namespace std;
const int Max_name=51;
struct STUDENT
{
int key;
char name[Max_name];
int kor, eng, math;
float ave;
};
//==============이하 응용==================
// "_이름" 은 내부함수!!
enum MENU{MENU_ADD_STUDENT,MENU_REMOVE_STUDENT, MENU_SHOW_ALL, MENU_QUIT};
MENU ShowMenu(); //응용
void printstuList(List<STUDENT, int> & studentlist); //응용
void addstu(List<STUDENT, int>& studentlist);
void removeStu(List<STUDENT, int>& studentlist);
int main()
{
List <STUDENT, int> studentlist; //생성자 콜
bool flag=false;
while(true)
{
MENU select;
select=ShowMenu();
switch(select)
{
case MENU_ADD_STUDENT:
{
addstu(studentlist);
break;
}
case MENU_REMOVE_STUDENT:
{
removeStu(studentlist);
break;
}
case MENU_SHOW_ALL:
{
printstuList(studentlist);
break;
}
case MENU_QUIT:
{
cout<<"프로그램종료"<<endl;
flag=true;
break;
}
}
if(flag==true)
{
break;
}
}
return 0; //소멸자
}
MENU ShowMenu()
{
while(true)
{
cout<< "\n------메뉴-----\n";
cout<< "1. 학생 성적 추가 \n";
cout<< "2. 학생 성적 삭제 \n";
cout<< "3. 전체 성적 보기\n";
cout<< "Q. 프로그램 종료\n";
cout<<"===================\n";
cout<<"원하는 작업의 번호를 입력하세요 : ";
char select;
cin>>select;
switch(select)
{
case '1':
return MENU_ADD_STUDENT;
case '2':
return MENU_REMOVE_STUDENT;
case '3':
return MENU_SHOW_ALL;
case 'q':
case 'Q':
return MENU_QUIT;
default :
cout<<"\n올바른 값을 입력해주세요\n";
break;
}
}
}
//학생 하나에 대한 정보를 얻기
//학생 구조체만들기
//서버의 addNode함수 호출하기
void addstu(List<STUDENT, int>& studentlist)
{
STUDENT std;
cout<<"학번, 이름, 국어, 영어, 수학 점수를 입력: ";
cin>>std.key>>std.name>>std.kor>>std.eng>>std.math;
std.ave=float(std.kor+std.eng+std.math)/3.0f;
int res= studentlist.addNode(std);
if(res==0)
{
cout<<"학생 하나 성공적으로 추가"<<endl;
}
else
{
if(res==1)
{
cout<< "중복된 학번으로 추가 실패"<<endl;
}
else
{
cout<<"메모리 부족으로 추가 실패"<<endl;
}
}
}
//삭제할 학생의 학번 물어보기
//서버의 removeNode함수 콜
void removeStu(List<STUDENT, int>& studentlist)
{
cout<< "삭제할 학번 : ";
int sNo;
cin>> sNo;
STUDENT std;
bool found =studentlist.removeNode(sNo, &std);
if(found==true)
{
cout<<"학번" <<sNo<<"가 성공적으로 삭제 되었습니다."<<endl;
}
else
{
cout<<"학번"<<sNo <<"의 학생이 존재하지 않습니다"<<endl;
}
}
void printstuList(List<STUDENT, int>& studentlist)
{
STUDENT std;
bool success;
if(studentlist.listCount()==0)
{
cout<< "리스트에 아무도 없음" <<endl;
}
else
{
//studentlis의 getNext함수를 호출하여 첫 번쨰 노드의 데이터 값을 가지고 와서 출력
success=studentlist.getNext(0,std);
cout<<" 전체 성적보기 "<<endl;
cout<<" 학번 이름 국어 영어 수학 평균"<<endl;
cout<< std.key<<" "<<std.name<<" "<<std.kor << " "<< std.eng <<" "<< std.math <<" "<<std.ave<<endl;
while(studentlist.getNext(1, std))
{
cout<< std.key<<" "<<std.name<<" "<<std.kor << " "<< std.eng <<" "<< std.math <<" "<<std.ave<<endl;
}
cout<<"리스트의 끝"<<endl;
}
}
'1. IT Story > Development' 카테고리의 다른 글
StackADT를 이용한 중위식구하기 (0) | 2012.03.29 |
---|---|
배열로 구현한 Stack을 이용한 중위식구하기 (0) | 2012.03.29 |
seqSearch (0) | 2012.03.29 |
AddressListing (0) | 2012.03.29 |
insertionSort (0) | 2012.03.28 |
Heap Tree (보기좋게출력) (0) | 2012.03.28 |
하노이타워 (0) | 2012.03.28 |
이진찾기 (0) | 2012.03.28 |