Implement as recursive list.
This commit is contained in:
parent
d99200f020
commit
0e461863b6
@ -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;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user