My program to read a list of students from a file
and create a linked list.
Each entry in the link list is to have the student's name, a pointer to the next
student, and a pointer to linked list of scores.
Can have up to four scores for each student.
Can anyone help me fix this program?
I don't know what wrong.
Thank
FILE
Peter Perry
John Smith
Mary Lee
=====================
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int readStudentFile();
int getScores();
int readLine(FILE *inFile, char *currentLine);
int printScores();
int freeStudents();
typedef struct qNode
{
int score;
struct qNode *link;
};
typedef struct sNode
{
char name[80];
struct sNode *next;
struct qNode *link;
};
struct sNode *student;
int main()
{
readStudentFile();
getScores();
printScores();
freeStudents();
return 0;
}
/******************************** READ FILE***************************/
int readStudentFile()
{
FILE *studentFile;
char studentName[80] ;
struct sNode *prev;
struct sNode *studentPtr;
if ((studentFile=(fopen("record.txt", "r")))==NULL)
{
printf("Exiting the program\n");
exit(1);
}
prev = NULL;
while (!feof(studentFile))
{
readLine(studentFile, studentName);
if(!(studentPtr = (sNode*) malloc(sizeof sNode)))
{
printf("Out of memory");
return 0;
}
(prev != NULL) ? (prev->next = studentPtr) : (student = studentPtr);
strcpy(studentPtr->name,studentName);
printf("%s\n", studentPtr->name );
studentPtr->link = NULL;
prev = studentPtr;
studentPtr->next = NULL;
};
fclose(studentFile);
return 0;
}
/**********************************GET SCORES**************************/
int getScores()
{
int intScr = 0;
int first;
struct qNode *prevPtr;
struct qNode *quizPtr;
struct sNode *studentPtr;
studentPtr = student;
printf("Entering the Scores\n");
printf("To jump to next student enter -1\n");
while(studentPtr!=NULL)
{
first = 1;
printf("%s's scores:\n", studentPtr->name);
intScr=0;
while (intScr !=-1)
{
scanf("%d", &intScr);
if(intScr != -1)
{
if(!(quizPtr = (qNode*) malloc(sizeof qNode)))
{
printf("Out of memory");
return 0;
}
quizPtr->score = intScr;
quizPtr->link = NULL;
(first == 1) ? (studentPtr->link = quizPtr prevPtr->link = quizPtr;
prevPtr=quizPtr;
first = 0;
}
}
studentPtr = studentPtr->next;
}
return 1;
}
/*************************************READ LINE******************************/
int readLine(FILE *inFile, char *currentLine)
{
int i=0;
char ch;
do
{
fscanf(inFile, "%c", &ch);
((ch !=10) && (!feof(inFile))) ? (*(currentLine+i) = ch) *(currentLine+i) = '\0');
i++;
}while ((ch !=10) && (!feof(inFile)));
return 0;
}
/********************************PRINT SCORES*******************************/
int printScores()
{
struct qNode *quizPtr;
struct sNode *studentPtr;
int total;
int numGrades;
int classTotal = 0;
int classNumGrades = 0;
studentPtr = student;
while(studentPtr!=NULL)
{
printf("\n%s's scores:\n", studentPtr->name);
numGrades = 0;
total = 0;
quizPtr = studentPtr->link;
while (quizPtr!=NULL)
{
printf("%d\t", quizPtr->score);
total= total + quizPtr->score;
numGrades++;
quizPtr = quizPtr->link;
}
printf("Ave= %d\tTotal= %d", total/numGrades, total);
classTotal= classTotal + total;
classNumGrades = classNumGrades + numGrades;
studentPtr = studentPtr->next;
}
printf("\n");
return 0;
}
/*********************************FREE************* ****************/
int freeStudents()
{
int linkEnd, loopEnd=0;
struct qNode *quizPtr;
struct sNode *studentPtr;
struct qNode *prevPtr;
struct sNode *sPtr;
studentPtr = student;
while ((studentPtr!=NULL) && (!loopEnd))
{
if (studentPtr->link != NULL)
{
quizPtr = studentPtr->link;
linkEnd = 0;
while ((quizPtr!=NULL) && (!linkEnd))
{
prevPtr = quizPtr;
(quizPtr->link != NULL) ? (quizPtr = quizPtr->link) : (linkEnd = 1);
free (prevPtr);
}
}
sPtr=studentPtr;
(studentPtr->next != NULL) ? (studentPtr = studentPtr->next): (loopEnd = 1);
free(sPtr);
}
printf("\n");
return 0;
}