#include "header.h"
void readFromKeyboard(Element_t *item)
{
if (!item)
{
fprintf(stderr, "Nullpointer in readFromKeyboard()\n");
return;
}
fprintf(stdout, "Enter song title: ");
fgets(item->songtitle,255,stdin);
*strrchr(item->songtitle,'\n')=0;
while (getchar() != '\n') {}
fgets(item->interpreter,255,stdin);
*strrchr(item->interpreter,'\n')=0;
while (getchar() != '\n') {}
}
Element_t *allocateElement()
{
Element_t *new = 0;
if (!(new = malloc(sizeof(Element_t))))
{
fprintf(stderr, "Memory allocation error in allocateElement()");
exit(-1);
}
readFromKeyboard(new);
new->next = 0;
return new;
}
Element_t *insertLast(Element_t *list)
{
Element_t *new = allocateElement();
if (!list)
{
return new;
}
Element_t *last = list;
while(last->next)
last = last->next;
last->next = new;
return list;
}
void freeList(Element_t **list)
{
if (!list)
{
fprintf(stderr, "Nullpointer in freeList()");
exit(-1);
}
Element_t *next;
while(*list)
{
next = list[0]->next;
free(list[0]);
list[0] = next;
}
list[0] = 0;
}
void print_singleElement(Element_t *element)
{
if (element)
{
fprintf(stdout, "begin-elem--------------------\n");
fprintf(stdout, "%s\t%s\n", element->songtitle, element->interpreter);
fprintf(stdout, "end-elem----------------------\n");
}
else
{
fprintf(stdout, "Nullpointer!\n");
}
}
void print_entireList(Element_t *list)
{
while(list)
{
fprintf(stdout, "%s\t%s\n", list->songtitle, list->interpreter);
list = list->next;
}
}
void print_list_reverse(Element_t *list)
{
if (list->next)
print_list_reverse(list->next);
fprintf(stdout, "%s\t%s\n", list->songtitle, list->interpreter);
}
Element_t *elementAt(Element_t *list, long index)
{
if (index == 0) return list;
long counter = 0;
while(list->next)
{
list = list->next;
if (++counter == index) return list;
}
return 0;
}
long elementsCount(Element_t *list)
{
if (!list) return 0;
long counter = 1;
while(list->next)
{
list = list->next;
counter++;
}
return counter;
}
Element_t *removeFirst(Element_t *list)
{
Element_t *temp = list->next;
free(list);
return temp;
}
void insertAt(Element_t *list, long insertAfter)
{
Element_t *new = insertLast(0);
Element_t *at = elementAt(list, insertAfter);
new->next = at->next;
at->next = new;
}
void print_list_random(Element_t *list)
{
if (list->next)
{
if (rand() < 16383)
{
print_list_random(list->next);
fprintf(stdout, "%s\t%s\n", list->songtitle, list->interpreter);
}
else
{
fprintf(stdout, "%s\t%s\n", list->songtitle, list->interpreter);
print_list_random(list->next);
}
}
else
{
fprintf(stdout, "%s\t%s\n", list->songtitle, list->interpreter);
}
}
void sort_list(Element_t **list)
{
Element_t *temp = *list;
Element_t *prev;
long i, j;
for (j = elementsCount(*list) - 1; j > 0; j--)
{
i = 0;
prev = 0;
temp = *list;
while (i < j)
{
//printf("\n%ld %ld\t%s\t%s", j, i, temp->songtitle, (temp->next)->songtitle);
if (strcmp(temp->songtitle, (temp->next)->songtitle) > 0)
{
//printf("\tswap");
Element_t *swap = temp->next;
temp->next = swap->next;
swap->next = temp;
if (prev)
prev->next = swap;
else
*list = swap;
prev = swap;
}
else
{
prev = temp;
temp = temp->next;
}
i++;
}
//printf("\n");
//print_entireList(*list);
}
}
int main()
{
srand(time(0));
Element_t *list = malloc(sizeof(Element_t));
strcpy(list->songtitle, "I am First!");
strcpy(list->interpreter, "Hello there.");
list->next = 0;
Element_t *last = list;
long i;
for (i = 0; i < 11; i++)
{
Element_t *new;
new = malloc(sizeof(Element_t));
new->songtitle[0] = i + 'A';
new->interpreter[0] = i+ 'a';
new->next = 0;
last->next = new;
last = new;
}
print_entireList(list);
printf("\n");
printf("Reverse Print\n");
print_list_reverse(list);
printf("\n");
printf("Single Element at NOElems - 4\n");
print_singleElement(elementAt(list, elementsCount(list)-4));
printf("\n");
printf("Remove First\n");
list = removeFirst(list);
print_entireList(list);
printf("\n");
printf("Insert At 4\n");
insertAt(list, 4);
print_entireList(list);
printf("\n");
printf("Random Print\n");
print_list_random(list);
printf("\n");
printf("Sort\n");
sort_list(&list);
print_entireList(list);
printf("\n");
freeList(&list);
return 0;
}