Clean up memory and add function search for student by name and id

This commit is contained in:
Sambo Chea 2020-08-02 20:50:31 +07:00
parent 55a392584e
commit ef484509f3
3 changed files with 91 additions and 62 deletions

5
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,5 @@
{
"files.associations": {
"typeinfo": "c"
}
}

View File

@ -6,29 +6,3 @@ Computer
98
52
95
SS
323
SC
3
2
4
2
Sambo2
73823
MSK2
3
3
54
2
SS
SS3
212
3
5
3
2
SS
SS
SS
1
2

View File

@ -4,6 +4,7 @@
#define BUFFER_SIZE 128
#define MAX_NO_OF_UNITS 4
#define NAME_SIZE 20
const char *FILE_STUDENT_DATA_PATH = "./data/students.test.txt";
@ -37,6 +38,8 @@ typedef struct student_tag STUDENT;
void display_menu();
void print_welcome();
void print_student(STUDENT *student);
void release(STUDENT *data);
STUDENT *search_student_by_name_or_id(char search_key[NAME_SIZE]);
// core functions
void display_students();
@ -101,13 +104,9 @@ void print_welcome()
void display_students()
{
printf("\n");
read_file();
STUDENT *student;
student = head;
STUDENT *student = head;
if (student == NULL)
{
@ -116,19 +115,14 @@ void display_students()
}
printf("\n================ Student Details ================\n");
print_student(student);
while (student->next != NULL)
{
printf("\n");
student = student->next;
print_student(student);
}
}
void print_student(STUDENT *student)
{
while (student != NULL)
{
printf("\n");
printf("Student Name: %s\n", student->student_info.name);
printf("Student ID: %s\n", student->student_info.id);
printf("Course Name: %s\n", student->course_info.course_name);
@ -141,6 +135,13 @@ void print_student(STUDENT *student)
}
printf("]\n");
printf("Avg: %.2f\n", student->course_info.avg);
student = student->next;
}
// clean up the memory
// after output the data
// because we don;t need it anymore after output
release(student);
}
void display_menu()
@ -216,7 +217,35 @@ int count()
void search_student()
{
printf("\nNot implement yet!");
char search_key[NAME_SIZE];
printf("Enter student name or id to search: ");
scanf("%s", &search_key);
STUDENT *found_student = search_student_by_name_or_id(search_key);
if (found_student == NULL)
{
printf("No student found!");
return;
}
print_student(found_student);
}
STUDENT *search_student_by_name_or_id(char search_key[NAME_SIZE])
{
STUDENT *temp = head;
while (temp != NULL)
{
if (temp->student_info.name == search_key || temp->student_info.id == search_key)
{
return temp;
}
temp = temp->next;
}
return NULL;
}
void find_maximum()
@ -253,9 +282,9 @@ again:
printf("Enter no of units: ");
scanf("%d", &no_of_units);
if (no_of_units > MAX_NO_OF_UNITS)
if (no_of_units > MAX_NO_OF_UNITS && no_of_units <= 0)
{
printf("you cannot input the units bigger than %d\n", MAX_NO_OF_UNITS);
printf("you cannot input the units bigger than %d or less than 0\n", MAX_NO_OF_UNITS);
getchar();
goto again;
}
@ -295,10 +324,10 @@ again:
void read_file()
{
// free the nodes
// because it can be use in memory
// we need to clear it first
// before we re-initailize the new data
// release nodes
// we need to clean up the memory
if (head != NULL)
{
STUDENT *temp;
while (head != NULL)
{
@ -306,6 +335,7 @@ void read_file()
head = head->next;
free(temp);
}
}
FILE *file;
file = fopen(FILE_STUDENT_DATA_PATH, "r");
@ -377,3 +407,23 @@ void quite()
printf("\nGoodbye!");
exit(EXIT_SUCCESS);
}
void release(STUDENT *data)
{
if (data == NULL)
{
return;
}
// free the nodes
// because it can be use in memory
// we need to clear it first
// before we re-initailize the new data
STUDENT *temp;
while (data != NULL)
{
temp = data;
data = data->next;
free(temp);
}
}