Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define Nlen 26
// Add bool type if needed
#ifndef BOOL
#define BOOL int
#define TRUE 1
#define FALSE 0
#endif
typedef struct _node
{
char FName[Nlen];
char LName[Nlen];
char Sex;
char Grade;
struct _node * Next;
} PERSON;
typedef struct _personlist
{
PERSON * pNodeHead;
} PersonList;
BOOL AddaPerson(PersonList * pList , char *fname, char *lname, char sex, char grade)
{
PERSON * pNodeCurrent;
PERSON * pNodeNew;
PERSON * pNodePrevious;
pNodeNew = (PERSON *)malloc(sizeof(PERSON));
if (pNodeNew == NULL)
return(FALSE);
pNodeNew->Next = NULL;
strcpy(pNodeNew->FName,fname);
strcpy(pNodeNew->LName, lname);
pNodeNew->Sex = sex;
pNodeNew->Grade= grade;
pNodePrevious = NULL;
pNodeCurrent = pList->pNodeHead;
while (pNodeCurrent != NULL)
{
pNodePrevious = pNodeCurrent;
pNodeCurrent = pNodeCurrent->Next;
}
if (pNodePrevious != NULL)
{
pNodeNew->Next = pNodePrevious->Next;
pNodePrevious->Next = pNodeNew;
}
else
{
pList->pNodeHead = pNodeNew;
}
return(TRUE);
}
void PrintAllPersons(PersonList * pList)
{
PERSON * pNodeCurrent;
pNodeCurrent = pList->pNodeHead;
while (pNodeCurrent != NULL)
{
printf("%s %s %c %c\n", pNodeCurrent->FName, pNodeCurrent->LName, pNodeCurrent->Grade, pNodeCurrent->Sex);
pNodeCurrent = pNodeCurrent->Next;
}
}
void RemoveAllPersons(PersonList * pList)
{
PERSON * pNodeKill;
PERSON * pNodeCurrent;
pNodeKill = NULL;
pNodeCurrent = pList->pNodeHead;
while (pNodeCurrent != NULL)
{
pNodeKill = pNodeCurrent;
pNodeCurrent = pNodeCurrent->Next;
free(pNodeKill);
}
pList->pNodeHead = NULL;
}
BOOL SaveTheFile(PersonList * pList, char *fname)
{
PERSON * pNodeCurrent;
FILE *fp;
fp = fopen(fname, "wb");
if(!fp)
return FALSE;
pNodeCurrent = pList->pNodeHead;
while (pNodeCurrent != NULL)
{
fwrite(pNodeCurrent, sizeof(PERSON), 1 ,fp);
pNodeCurrent = pNodeCurrent->Next;
}
return TRUE;
}
BOOL LoadTheFile( PersonList * pList, char *fname)
{
BOOL bReturn = TRUE;
FILE *fp;
PERSON TempPersonList;
fp = fopen(fname, "rb");
if(!fp)
return FALSE;
while(!feof(fp))
{
if(fread(&TempPersonList, sizeof(PERSON), 1, fp) != 1)
{
bReturn = FALSE;
break;
}
if (!AddaPerson(pList, TempPersonList.FName,TempPersonList.LName,TempPersonList.Sex,TempPersonList.Grade ))
{
bReturn = FALSE;
break;
}
}
fclose(fp);
return bReturn;
}
int main (void)
{
char file[] = "data.txt";
PersonList MyPersonList;
MyPersonList.pNodeHead = NULL;
if (!AddaPerson(&MyPersonList, "BOB", "Doe", 'M', '4'))
{
fprintf(stderr, "Error adding a node to the linked list\n");
exit(1);
}
if (!AddaPerson(&MyPersonList, "Bill", "Jones", 'M', '5'))
{
fprintf(stderr, "Error adding a node to the linked list\n");
exit(1);
}
if (!AddaPerson(&MyPersonList, "Ted", "Smith", 'M', '6'))
{
fprintf(stderr, "Error adding a node to the linked list\n");
exit(1);
}
SaveTheFile(&MyPersonList, file);
PrintAllPersons(&MyPersonList);
RemoveAllPersons(&MyPersonList);
LoadTheFile( &MyPersonList, file);
PrintAllPersons(&MyPersonList);
return(0);
}