115 lines
2.0 KiB
C
115 lines
2.0 KiB
C
#include "namesarchive.h"
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
typedef struct queueElem
|
|
{
|
|
char *name;
|
|
struct queueElem *next;
|
|
} QueueElem;
|
|
|
|
static QueueElem *head = 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;
|
|
}
|
|
|
|
static QueueElem *addNameRec(QueueElem* elem, const char *newName)
|
|
{
|
|
if(elem == NULL)
|
|
elem = createNameElem(newName);
|
|
else
|
|
elem->next = addNameRec(elem->next, newName);
|
|
|
|
return elem;
|
|
}
|
|
|
|
void addName(const char *name)
|
|
{
|
|
head = addNameRec(head, name);
|
|
}
|
|
|
|
static void printNamesRec(QueueElem *elem)
|
|
{
|
|
if(elem != NULL)
|
|
{
|
|
printf("%s\n", elem->name);
|
|
printNamesRec(elem->next);
|
|
}
|
|
}
|
|
|
|
void printNames()
|
|
{
|
|
printNamesRec(head);
|
|
}
|
|
|
|
static void disposeElem(QueueElem *elem)
|
|
{
|
|
if(elem != NULL)
|
|
free(elem->name);
|
|
free(elem);
|
|
}
|
|
|
|
static QueueElem *removeElemRek(QueueElem *elem, const char *name)
|
|
{
|
|
if(elem != NULL)
|
|
{
|
|
if(strcmp(elem->name, name) == 0)
|
|
{
|
|
QueueElem *elemToRemove = elem;
|
|
elem = elem->next;
|
|
disposeElem(elemToRemove);
|
|
}
|
|
else
|
|
elem->next = removeElemRek(elem->next, name);
|
|
}
|
|
return elem;
|
|
}
|
|
|
|
void removeName(const char *name)
|
|
{
|
|
head = removeElemRek(head, name);
|
|
}
|
|
|
|
static void clearElemRek(QueueElem *elem)
|
|
{
|
|
if(elem != NULL)
|
|
{
|
|
clearElemRek(elem->next);
|
|
disposeElem(elem);
|
|
}
|
|
}
|
|
|
|
void clearArchive()
|
|
{
|
|
clearElemRek(head);
|
|
head = NULL;
|
|
}
|