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