Implement as recursive list.

This commit is contained in:
paulusja 2025-12-04 13:25:52 +01:00
parent d99200f020
commit 0e461863b6

View File

@ -41,56 +41,33 @@ static QueueElem *createNameElem(const char *name)
return newElem; 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) void addName(const char *name)
{ {
if(head == NULL) head = addNameRec(head, name);
head = createEmptyElem(); }
if(head != NULL) static void printNamesRec(QueueElem *elem)
{
if(elem != NULL)
{ {
QueueElem *newElem = createNameElem(name); printf("%s\n", elem->name);
printNamesRec(elem->next);
if(newElem != NULL)
{
QueueElem *currentElem = head;
while(currentElem->next != NULL)
{
currentElem = currentElem->next;
}
currentElem->next = newElem;
}
} }
} }
void printNames() void printNames()
{ {
if(head != NULL) printNamesRec(head);
{
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) static void disposeElem(QueueElem *elem)
@ -100,24 +77,38 @@ static void disposeElem(QueueElem *elem)
free(elem); 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) void removeName(const char *name)
{ {
QueueElem *prevElem = getPreviousNode(name); head = removeElemRek(head, name);
}
if(prevElem != NULL) static void clearElemRek(QueueElem *elem)
{
if(elem != NULL)
{ {
QueueElem *elemToRemove = prevElem->next; clearElemRek(elem->next);
prevElem->next = prevElem->next->next; disposeElem(elem);
disposeElem(elemToRemove);
} }
} }
void clearArchive() void clearArchive()
{ {
while(head != NULL) clearElemRek(head);
{ head = NULL;
QueueElem *oldHead = head;
head = head->next;
disposeElem(oldHead);
}
} }