문제의 코드입니다. gcc로 컴파일하면서 잘 하다가 visual studio로 넘어오니 여러 문제들이 생겼습니다.
scanf
등등은 맨 윗 줄을 붙여서 해결하고, 어찌저찌 했는데,
메인 함수 말고 다른 함수들에서 Node* curr 써주고 curr 이나 curr->멤버변수 를 사용하려니 문제가 생깁니다.
<예외가 throw됨: 읽기 액세스 위반입니다.
**curr**이(가) 0xCDCDCDCD였습니다.>
라고 하네요.
curr을 어떻게 손을 대야 할 지 감이 하나도 오지 않습니다.
+추가합니다. curr 에서
<문자열의 문자를 읽는 동안 오류가 발생했습니다.>
라고 하네요. 거기다 curr->stud_id 나 curr->stud_score의 값이 ?? 라고 뜨네요.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h> // 동적메모리관리에 필요함.
#include <string.h> // 문자열 관련에 필요함.
//==================================================================//
// 리스트 노드 구조체 선언
typedef struct studentNode {
char name[20];
int stud_id;
float stud_score;
struct studentNode* link;
}Node;
// 전역변수들
Node* L = NULL; // 헤더
int N, i; // 노드 개수 카운트
//==================================================================//
// 학생 추가 함수
void insertStudent() {
char a[20]; // 이름 입력 변수
int b=0; // 학번 입력 변수
float c=0; // 학점 입력 변수
printf("\n추가 대상 학생의 이름을 입력하세요 : ");
scanf("%s", a);
Return1:
printf("\n추가 대상 학생의 학번을 입력하세요 : ");
scanf("%d", &b);
Node* curr = L;
while (curr != NULL) {
if (b == curr->stud_id) {
printf("\n동일한 학번의 학생이 존재합니다.\n");
goto Return1;
}
else {
curr = curr->link;
}
}
Return2:
printf("\n추가 대상 학생의 학점을 입력하세요 : ");
scanf("%f", &c);
if (!(c >= 0 && c <= 4.5)) {
printf("\n잘못된 범위입니다.\n");
goto Return2;
}
Node* node = (Node*)malloc(sizeof(Node));
if (node == NULL) {
exit(1);
}
strcpy(node->name, a);
node->stud_id = b;
node->stud_score = c;
if (L == NULL) {
L = node;
}
else {
Node* curr = L;
Node* pre = NULL;
int n = 1;
while (curr != NULL) {
printf("%d", strcmp(node->name, curr->name));
if (strcmp(node->name, curr->name) > 0) {
pre = curr;
curr = curr->link;
n++;
}
else if (strcmp(node->name, curr->name) <= 0) {
if (n == 1) {
node->link = curr;
L = node;
break;
}
else {
node->link = curr;
pre->link = node;
break;
}
}
}
if (curr == NULL) {
node->link = NULL;
pre->link = node;
}
}
N++;
}
// 학생 제거 함수
void deleteStudent(char* a) {
Node* curr = L;
Node* pre = NULL;
for (i = 1; i <= N; i++) {
if (strcmp(curr->name, a)) {
pre = curr;
curr = curr->link;
}
else {
if (i == 1) {
L = curr->link;
}
else if (i == N) {
pre->link = NULL;
}
else {
pre->link = curr->link;
}
free(curr);
N--;
break;
}
}
if (curr == NULL) {
printf("\n해당 학생이 없습니다.\n");
printf("\n계속하려면 아무 키나 입력하십시오...\n");
system("PAUSE");
}
}
// 학생 조회 함수
void searchStudent(char* a) {
Node* curr = L;
while (curr != NULL) {
if (strcmp(curr->name, a)) {
curr = curr->link;
}
else {
printf("\n[%s]\n학번 : %06d\n평균 학점 : %.1f\n", curr->name, curr->stud_id, curr->stud_score);
break;
}
}
if (curr == NULL) {
printf("\n해당 학생이 없습니다.\n");
}
printf("\n계속하려면 아무 키나 입력하십시오...\n");
system("read");
}
// 리스트 전체 출력 함수
void printAllStudent() {
if (L == NULL) {
printf("\n학생이 하나도 없습니다.\n");
}
else {
Node* curr = L;
while (curr != NULL) {
printf("\n[%s]\n학번 : %06d\n평균 학점 : %.1f\n", curr->name, curr->stud_id, curr->stud_score);
curr = curr->link;
}
}
printf("\n계속하려면 아무 키나 입력하십시오...\n");
system("PAUSE");
}
// 리스트 초기화 함수
void deleteAllStudent() {
if (L == NULL) {
printf("\n학생이 하나도 없습니다.\n");
}
else {
Node* curr = L;
while (curr != NULL) {
free(curr);
curr = curr->link;
}
L = NULL;
N = 0;
}
printf("\n계속하려면 아무 키나 입력하십시오...\n");
system("PAUSE");
}
// 메인 함수
void main() {
system("cls");
int n = 0;
char a[20] = { 0 };
printf("\n======================[학생 관리 프로그램]======================\n[1] 학생 추가\n[2] 학생 제거\n[3] 학생 조회\n[4] 학생 리스트 전체 출력\n[5] 학생 리스트 초기화\n[6] 프로그램 종료\n===============================================================\n");
printf("\n원하는 항목의 번호를 입력하세요 : ");
scanf("%d", &n);
switch (n) {
case 1:
insertStudent();
main();
break;
case 2:
printf("\n제거 대상 학생의 이름을 입력하세요 : ");
scanf("%s", a);
deleteStudent(a);
main();
break;
case 3:
printf("\n조회 대상 학생의 이름을 입력하세요 : ");
scanf("%s", a);
searchStudent(a);
main();
break;
case 4:
printAllStudent();
main();
break;
case 5:
deleteAllStudent();
main();
break;
case 6:
deleteAllStudent();
printf("\n프로그램을 종료합니다.\n");
break;
default:
printf("\n잘못된 입력입니다.\n");
printf("\n계속하려면 아무 키나 입력하십시오...\n");
system("PAUSE");
main();
break;
}
}