180 lines
3.2 KiB
C
180 lines
3.2 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 *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;
|
|
} |