게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
C++ 링크드 리스트 질문입니다.
게시물ID : science_3447짧은주소 복사하기
작성자 : 악성코드
추천 : 0
조회수 : 905회
댓글수 : 4개
등록시간 : 2010/12/04 18:58:37
얼마전에 여기 질문올렸던 사람입니다.
코딩도중 뭐가 잘 돌아가는것 같지 않아 질문 드립니다. (아직 프로그램은 미완성)
아래는 코드 전문입니다. 좀 길어요;;
일단 컴파일에러는 없지만, 동작이 영 문제가 있네요.
뭐때문인지 좀 알려주시면 감사하겠습니다.
1번에서 학생등록을 한 뒤에 2번에서 삭제 하려고하면 삭제가 안되네요.

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

class Student //클래스 선언.
{
private:
string name;
string major;
string number; 
double mscore, lscore, average;

public:
Student *node;
string cpynum;
Student(string a, string b, string c)
{
name = a;
major = b;
number = c;
cpynum = c;
node = NULL;
}
void setscore(int x, int y)
{
mscore = x;
lscore = y;
}
};

Student *head = NULL;
Student *p = NULL;
Student *temp = NULL;
Student *next = NULL;
string a, b, c;
double x, y;

void enroll(); //학생 등록함수
void delstudent(); //학생 삭제함수

int main()
{
int sel;

while(1) //무엇을 할 것인지 선택하는 화면.
{
cout << "메뉴" << endl;
cout << "1. 새로운 학생 등록" << endl;
cout << "2. 학생 삭제" << endl;
cout << "3. 중간 고사 점수 등록" << endl;
cout << "4. 기말 고사 점수 등록" << endl;
cout << "5. 성적 보기" << endl;
cout << "6. 전체 성적 보기" << endl;
cout << "입력 : ";
cin >> sel;

if(sel == 1)
enroll();

else if(sel == 2)
delstudent();
}

return 0;
}

void enroll()
{
while(1)
{
cout << "학번에 0을 입력하시면 입력 종료가 됩니다." << endl;
cout << "학생 이니셜을 띄어쓰기 없이 입력해 주세요. : ";
cin >> a;
cout << "학생의 전공을 띄어쓰기 없이 입력해 주세요. : ";
cin >> b;
cout << "학생의 학번을 띄어쓰기 없이 입력해 주세요. : ";
cin >> c;

p = new Student(a, b, c);

if(c == "0")
{
delete p;
break;
}

if(head == 0) //head가 NULL일 때에.
head = p;

else //head가 NULL이 아닐 경우.
{
temp = head; //검색을 위한 초기화.
while(temp == NULL)
{
if(temp->cpynum < p->cpynum && next->cpynum > p->cpynum)
{
if(temp->node == NULL)
{
temp->node = p;
break;
}
next = temp->node;
temp->node = p;
p->node = next;
break;
}
else if(temp->cpynum == p->cpynum)
{
cout << "같은 학번이 이미 등록되어 있습니다! 다시 입력해 주세요!" << endl;
delete p;
break;
}

temp = temp->node;
}

temp->node = p;
}
}
}

void delstudent()
{
string delnum;
int success; //데이터 삭제의 성공 여부를 판단하는 변수.
Student *prev;

while(1)
{
success = 0;
cout << "학번에 0을 입력하면 삭제가 종료 됩니다." << endl;
cout << "삭제할 학생의 학번을 입력해 주세요 : ";
cin >> delnum;

if(delnum == "0")
break;

p = head; //검색을 위한 초기화.
prev = head; //삭제하는 노드의 전 노드.
next = p->node; //삭제하는 노드의 다음 노드.

while(p->node == NULL)
{
if(p->cpynum == delnum)
{
prev->node = next;
delete p;

if(prev == head) //삭제한 항목이 가장 첫 항목이었을 때.
head = next;

cout << "해당 학생의 성적 삭제가 완료 되었습니다." << endl;
success++; //데이터 삭제에 성공 했으므로 성공의 표시를 한다.
break;
}
prev = p;
p = p->node;
next = next->node;
}
if(success == 0) //해당 학번이 존재하지 않아 성적 삭제에 실패했을 때.
cout << "성적부에서 삭제하고자 하는 학번이 존재하지 않습니다!" << endl;
}
}
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호