diff --git a/09_bst/namesarchive.c b/09_bst/namesarchive.c index 564b9ab..c7eda6b 100644 --- a/09_bst/namesarchive.c +++ b/09_bst/namesarchive.c @@ -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; }