링크드리스트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
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,