Add dynamic namesarchive solution as template for queue exercise.
This commit is contained in:
1 parent
273f622601
commit
9ee68f1bc4
4 files changed
+235
No files matched your search
@@ -0,0 +1,118 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "namesarchive.h"
|
||||
|
||||
static char **names = NULL;
|
||||
static unsigned int numberOfNames = 0;
|
||||
|
||||
static int findNameIdx(const char *name);
|
||||
static void removeNameByIdx(unsigned int idx);
|
||||
static int compareNames(const void *arg1, const void *arg2);
|
||||
|
||||
// Fügt einen Namen hinzu. Im Fehlerfall (Archiv ist voll) soll 0, ansonsten 1 zurückgegeben werden.
|
||||
// Ist der angegebene Name länger als die zulässige Namenslänge, wird der Name abgeschnitten hinzugefügt. Rückgabe ist dann 1.
|
||||
int addName(const char *name)
|
||||
{
|
||||
if(name != NULL)
|
||||
{
|
||||
char **oldMemory = names;
|
||||
names = realloc(names, sizeof(*names) * (numberOfNames + 1));
|
||||
|
||||
if(names == NULL)
|
||||
names = oldMemory;
|
||||
else
|
||||
{
|
||||
names[numberOfNames] = malloc(sizeof(*name) * (strlen(name) + 1));
|
||||
|
||||
if(names[numberOfNames] == NULL)
|
||||
{
|
||||
names = realloc(names, sizeof(*names) * numberOfNames);
|
||||
}
|
||||
else
|
||||
{
|
||||
strncpy(names[numberOfNames], name, strlen(name)+1);
|
||||
numberOfNames++;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Wie addName. Fügt Namen aber direkt sortiert hinzu. Voraussetzung ist ein bereits sortiertes Archiv.
|
||||
int addNameSorted(const char *name)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Entfernt den angegebenen Namen. Gibt bei Erfolg 1 zurück, ansonsten 0 (Name konnte nicht gefunden werden).
|
||||
int removeName(const char *name)
|
||||
{
|
||||
int nameIdx = findNameIdx(name);
|
||||
|
||||
if(nameIdx >= 0)
|
||||
{
|
||||
removeNameByIdx(nameIdx);
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
int findNameIdx(const char *name)
|
||||
{
|
||||
for(int i = 0; i < numberOfNames; i++)
|
||||
{
|
||||
if(strcmp(names[i], name) == 0)
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void removeNameByIdx(unsigned int idx)
|
||||
{
|
||||
free(names[idx]);
|
||||
for(unsigned i = idx+1; i < numberOfNames; i++)
|
||||
{
|
||||
names[i-1] = names[i];
|
||||
}
|
||||
numberOfNames--;
|
||||
names = realloc(names, sizeof(*names) * numberOfNames);
|
||||
}
|
||||
|
||||
int compareNames(const void *arg1, const void *arg2)
|
||||
{
|
||||
const char *name1 = *((const char **)arg1);
|
||||
const char *name2 = *((const char **)arg2);
|
||||
|
||||
return strcmp(name1, name2);
|
||||
}
|
||||
|
||||
// Sortiert die Namen im Archiv aufsteigend.
|
||||
void sortNames()
|
||||
{
|
||||
qsort(names, numberOfNames, sizeof(names[0]), compareNames);
|
||||
}
|
||||
|
||||
// Gibt die Namen zeilenweise aus.
|
||||
void printNames()
|
||||
{
|
||||
for(int i = 0; i < numberOfNames; i++)
|
||||
{
|
||||
printf("%s\n", names[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void clearArchive()
|
||||
{
|
||||
for(int i = 0; i < numberOfNames; i++)
|
||||
{
|
||||
free(names[i]);
|
||||
}
|
||||
free(names);
|
||||
names = NULL;
|
||||
numberOfNames = 0;
|
||||
}
|
||||
Reference in new issue
Block a user