#include "namesarchive.h" #include #include #include typedef struct queueElem { char *name; struct queueElem *next; } QueueElem; static QueueElem *head = NULL; static QueueElem *iter = NULL; static QueueElem *createEmptyElem() { return calloc(1, sizeof(QueueElem)); } static QueueElem *createNameElem(const char *name) { QueueElem *newElem = NULL; if(name != NULL) { newElem = createEmptyElem(); if(newElem != NULL) { newElem->name = malloc(sizeof(char) * (strlen(name)+1)); if(newElem->name != NULL) strcpy(newElem->name, name); else { free(newElem); newElem = NULL; } } } return newElem; } int addName(const char *name) { int wasSuccessful = 0; if(head == NULL) head = createEmptyElem(); if(head != NULL) { QueueElem *newElem = createNameElem(name); if(newElem != NULL) { QueueElem *currentElem = head; while(currentElem->next != NULL) { currentElem = currentElem->next; } currentElem->next = newElem; wasSuccessful = 1; } } return wasSuccessful; } int addNameSorted(const char *name) { int wasSuccessful = 0; if(head == NULL) head = createEmptyElem(); if(head != NULL) { QueueElem *newElem = createNameElem(name); if(newElem != NULL) { QueueElem *currentElem = head; while(currentElem->next != NULL && strcmp(name, currentElem->next->name) > 0) { currentElem = currentElem->next; } newElem->next = currentElem->next; currentElem->next = newElem; wasSuccessful = 1; } } return wasSuccessful; } void printNames() { if(head != NULL) { QueueElem *elem = head->next; while(elem != NULL) { printf("%s\n", elem->name); elem = elem->next; } } } static QueueElem *getPreviousNode(const char *name) { QueueElem *currentElem = head; while(currentElem != NULL && currentElem->next != NULL && strcmp(currentElem->next->name, name) != 0) { currentElem = currentElem->next; } if(currentElem == NULL || currentElem->next == NULL) return NULL; else return currentElem; } static void disposeElem(QueueElem *elem) { if(elem != NULL) free(elem->name); free(elem); } int removeName(const char *name) { QueueElem *prevElem = getPreviousNode(name); if(prevElem != NULL) { QueueElem *elemToRemove = prevElem->next; prevElem->next = prevElem->next->next; disposeElem(elemToRemove); } return prevElem != NULL; } void clearArchive() { while(head != NULL) { QueueElem *oldHead = head; head = head->next; disposeElem(oldHead); } } const char *getNextName() { const char *name = NULL; if(iter != NULL) iter = iter->next; if(iter != NULL) name = iter->name; return name; } void initIter() { iter = head; }