[C언어 소스] 학생 성적 관리 프로그램 - 이중 연결리스트
더미있는 이중 연결리스로 학생 성적 관리 프로그램
//성적 관리
프로그램 - 이중 연결리스트
//생성 순서로
연결
리스트에
보관
//중복 데이터
처리
없음
//입력 오류에
관한
예외
처리
없음
#include <stdio.h>
#include <memory.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NLEN 20 //최대 이름
길이
#define MAX_SUBJECT
3 //과목
수
typedef struct Student{//학생 구조체
정의
char name[MAX_NLEN+1];//이름
int num; //번호
int scores[MAX_SUBJECT];//국,영,수
성적
struct Student *next;
struct Student *prev;
}Student;
const char *stitles[MAX_SUBJECT]={"국어","영어","수학"};
Student *head, *tail;
void Initialize();//초기화
void Run();
void Exit();//종료하기 전에
할당한
메모리
해제
int main(void)
{
Initialize();//초기화
Run();
Exit();//종료하기
전에
할당한
메모리
해제
return 0;
}
void Initialize()
{
head = (Student *)malloc(sizeof(Student));//더미
노드
생성
tail = (Student *)malloc(sizeof(Student));//더미
노드
생성
head->next = tail;//맨
앞
더미노드 next를 tail로
설정
tail->prev = head;//맨
뒤
더미노드 prev를 head로
설정
head->prev = tail->next = NULL;
}
int SelectMenu();//메뉴 출력
및
선택
void AddStudent();//학생 데이터
입력
void RemoveStudent();//학생 데이터
삭제
void FindStudent();//학생 검색
void ListStudent();//목록 보기
void Run()
{
int key = 0;
while((key = SelectMenu())!=0)//선택한
메뉴가 0이 아니면
반복
{
switch(key)//선택한
키에
따라
기능
수행
{
case 1: AddStudent(); break;
case 2: RemoveStudent(); break;
case 3: FindStudent(); break;
case 4: ListStudent(); break;
default: printf("잘못 선택하였습니다.\n"); break;
}
}
printf("프로그램 종료\n");
}
int SelectMenu()
{
int key=0;
printf("성적 관리 프로그램 0:종료\n");
printf("1: 학생 데이터 입력 2: 학생 데이터 삭제 3: 학생 검색 4: 목록 보기 \n");
scanf_s("%d",&key);
return key;
}
int IsAvailNum(int num);//유효한 번호인지
판별
int IsAvailScore(int score);//유효한 성적인지
판별
void AddStudent()
{
int num=0;
Student *stu=0;
int s=0;
printf("추가할 학생 번호: ");
scanf_s("%d",&num);
stu = (Student *)malloc(sizeof(Student));//학생
구조체
동적
메모리
할당
stu->num = num;
printf("이름: ");
scanf_s("%s",stu->name,sizeof(stu->name));
for(s=0;s<MAX_SUBJECT;s++)
{
printf("%s 성적:",stitles[s]);
scanf_s("%d",stu->scores+s);
if(IsAvailScore(stu->scores[s])==0)//유효한 성적이
아닐
때
{
stu->scores[s]=-1;
printf("입력한 성적이 유효하지 않아서 %s 성적은 입력 처리하지 않았습니다.\n",stitles[s]);
}
}
//새로
생성한
노드를 tail 앞에 매달기
stu->next = tail;
stu->prev = tail->prev;
tail->prev->next = stu;
tail->prev = stu;
}
int IsAvailScore(int score)
{
return (score>=0)&&(score<=100);
}
void RemoveStudent()
{
int num;
Student *seek;
printf("삭제할 학생 번호: ");
scanf_s("%d",&num);
for(seek=head->next; seek != tail; seek =seek->next)
{
if(seek->num == num)
{
//연결리스트에서 링크
조절
seek->prev->next
= seek->next;
seek->next->prev
= seek->prev;
free(seek);//메모리 해제
printf("삭제하였습니다.\n");
return;
}
}
printf("데이터가 없습니다.\n");
}
void ViewStuData(Student
*stu);
void FindStudent()
{
int num=0;
Student *seek=0;
printf("검색할 학생 번호: ");
scanf_s("%d",&num);
for(seek=head->next; seek != tail; seek
=seek->next)
{
if(seek->num == num)
{
ViewStuData(seek);
return;
}
}
printf("데이터가 없습니다.\n");
}
void ViewStuData(Student
*stu)
{
int i =
0;
int s = 0;
printf("%4d
%10s ",stu->num,stu->name);
for(s=0;s<MAX_SUBJECT;s++)
{
printf("%4d ",stu->scores[s]);
}
printf("\n");
}
void ListStudent()
{
int s = 0;
Student *seek=0;
printf("%4s
%10s ","번호","이름");
for(s=0;s<MAX_SUBJECT;s++)
{
printf("%4s ",stitles[s]);
}
printf("성적이 -1인 곳은 미입력\n");
for(seek=head->next; seek != tail; seek
=seek->next)
{
ViewStuData(seek);
}
}
void Exit()
{
Student *seek=head;
while(seek->next)
{
seek = seek->next;
free(seek->prev);
}
free(seek);
}
'언어 자료구조 알고리즘 > C언어 예제' 카테고리의 다른 글
소수인지 판별, C언어 소스 (0) | 2016.04.03 |
---|---|
이차 방정식 해 구하기, C언어 소스 (2) | 2016.04.03 |
균형 원소 찾기, C언어 소스 (0) | 2016.04.03 |
[C언어 소스] 로또 발생기 (0) | 2016.04.03 |
[C언어 소스] 디지털 시계 (0) | 2016.04.03 |
[C언어 소스] 성적 관리 프로그램 - 학생 데이터 동적 메모리 할당 (0) | 2016.04.03 |
[C언어 소스] 성적 관리 프로그램 - 동적 메모리 할당 (0) | 2016.04.03 |
[C언어 소스] 성적 관리 프로그램 - 전역 변수 사용 (0) | 2016.04.03 |
[C언어 소스] 대소문자 변환 (0) | 2016.04.03 |
[C언어 소스] 적분 공식을 이용한 파이 계산 (0) | 2016.04.03 |