//
// NAME
// plist.cpp
//
// DESCRIPTION
// This file contains the functions used to implement the
// Person-List module.
//
// For descriptions of parameters and return value of
// exported (non-static) functions, see plist.h.
//
//
// Include files.
//
#include <stdlib.h>
#include "bool.h"
#include "person.h"
#include "plist.h"
//
// NAME
// personElem
//
// DESCRIPTION
// This structure represents an element in a singly-linked list
// of people.
//
// MEMBERS
// p - information about a person.
// next - a pointer to the next element in the list.
//
struct personElem {
person p;
personElem* next;
};
//
// Function prototypes.
//
static personElem* newElem(person& p);
static void moveToEnd();
//
// Module variables.
//
static personElem* head = NULL; // Pointer to the head of the list.
static personElem* current = NULL; // Pointer to the "current" element.
//
// NAME
// addToEnd
//
// DESCRIPTION
// This functions adds the given person to the end of the list.
// It traverse the list from the head to find the end, then adds
// a new element to the end of the list.
//
void addToEnd(person& p) {
personElem* pe = newElem(p);
if (head == NULL) {
head = pe;
current = head;
return;
}
moveToEnd();
current->next = pe;
current = pe;
return;
}
//
// NAME
// getFirst
//
// DESCRIPTION
// This function gets the first person from the list. The module
// variable "current" is set to point to the head of the list, and
// the person information stored in that element is returned, if such
// an element exists.
//
bool getFirst(person& p) {
current = head;
if (current == NULL) {
return false;
}
p = current->p;
return true;
}
//
// NAME
// getNext
//
// DESCRIPTION
// This function gets the person information for the next person.
// The "current" pointer is moved ahead one position in the list,
// and the person information stored in that element is returned,
// if such an element exists.
//
bool getNext(person& p) {
current = current->next;
if (current == NULL) {
return false;
}
p = current->p;
return true;
}
//
// NAME
// atEnd
//
// DESCRIPTION
// This function determines if the list is empty by seeing if the
// "current" module variable is NULL or not.
//
bool atEnd() {
return (current == NULL) ? true : false;
}
//
// NAME
// clearList
//
// DESCRIPTION
// This function removes all elements from the list by traversing
// the list from the head and deallocating each element. The
// "current" module variable is used to traverse the list, and the
// local variable "next" points to the next element. When the
// list has been empties, the "head" and "current" module variables
// are set to NULL.
//
void clearList() {
personElem* next;
current = head;
while (current != NULL) {
next = current->next;
delete current;
current = next;
}
head = NULL;
current = head;
return;
}
//
// NAME
// newElem
//
// DESCRIPTION
// This function allocates a new list element and copies the given
// person information into it.
//
// PARAMETESRS
// p (in) - person information to copy into the new element.
//
// RETURNS
// pointer to the newly allocated list element
//
static personElem* newElem(person& p) {
personElem* pe = new personElem;
pe->p = p;
pe->next = NULL;
return pe;
}
//
// NAME
// moveToEnd
//
// DESCRIPTION
// This function causes the "current" module variable to point to
// the last element in the list. This function assumes that the
// list is not empty.
//
// PARAMETERS
// (none)
//
// RETURNS
// (none)
static void moveToEnd() {
if (current == NULL) {
current = head;
}
while (current->next != NULL) {
current = current->next;
}
return;
}
//
// End of file.
//