/*
* list.c - ShellCoder_
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
#include <stdio.h>
#include <string.h>
#define FIRST 0
typedef struct {
char** items;
int counter;
} LIST;
void Menu(void);
void Init_List(LIST* list);
int Push_to_list(LIST* list, char* item);
char* Read_to_list(LIST* list, int pos);
int Item_Exists(LIST* list, char* item);
char* Pop_to_list(LIST* list, int pos);
void Destroy_List(LIST* list);
LIST prova;
int main(void)
{
Init_List(&prova);
int scelta;
char* elemento = (char*)malloc(99*sizeof(char));
int posizione;
while(1==1)
{
Menu();
scanf("%d",&scelta);
if(scelta==1)
{
printf("Elemento da aggiungere: ");
scanf("%s",elemento);
printf("\nNumero totale di elementi: %d\n\n",Push_to_list
(&prova
,elemento
));
}
else if(scelta==2)
{
printf("Posizione elemento da leggere: ");
scanf("%d",&posizione);
printf("\nElemento letto: %s\n\n",Read_to_list
(&prova
,posizione
));
}
else if(scelta==3)
{
printf("Inserire stringa di ricerca: ");
scanf("%s",elemento);
int pos = Item_Exists(&prova,elemento);
if(pos == -1)
{
printf("\nL'elemento non esiste.\n\n");
}
else
{
printf("\nL'elemento esiste alla posizione %d\n\n",pos
);
}
}
else if(scelta==4)
{
printf("Cancellare (e)elemento o (p)posizione?\n");
char a;
scanf("\n%c",&a);
if((a=='e')||(a=='p'))
{
if(a=='e')
{
printf("Inserire elemento da cancellare: ");
scanf("%s",elemento);
int pos = Item_Exists(&prova,elemento);
if(pos!= -1)
{
Pop_to_list(&prova,pos);
printf("\nL'elemento %s è stato cancellato dalla posizione %d\n\n",elemento
,pos
);
}
else
{
printf("\nL'elemento non esiste!\n\n");
}
}
else
{
printf("Inserire la posizione su cui cancellare: ");
scanf("%d",&posizione);
char* success = Pop_to_list(&prova,posizione);
if(success == NULL)
{
printf("\nLa posizione indicata e' inesistente o non valida!\n\n");
}
else
{
printf("\nL'elemento %s è stato cancellato dalla posizione %d\n\n",success
,posizione
);
}
}
}
else
{
printf("\nScelta sbagliata. scegli 'p' o 'e'.\n\n");
}
}
else if(scelta==5)
{
printf("Lettura elementi in corso...\n");
if(prova.counter == -1)
{
printf("\nNessun elemento esistente.\n\n");
}
else
{
int i = 0;
while(i<=prova.counter)
{
printf("%s ",Read_to_list
(&prova
,FIRST
+i
));
i++;
}
}
}
else if(scelta==6)
{
printf("\nGli elementi salvati sono: %d\n\n",prova.
counter);
}
else if(scelta==7)
{
char scelta;
printf("Sei sicuro di voler deallocare e cancellare la lista? [y/n]\n");
scanf("\n%c",&scelta);
if(scelta=='y')
{
Destroy_List(&prova);
printf("Lista deallocata e cancellata con successo. Uscita in corso tra 5 secondi:");
sleep(1);
sleep(4);
exit(0);
}
}
else if(scelta==8)
{
exit(0);
}
else
{
printf("\nScelta non valida\n\n");
}
}
return 0;
}
void Menu(void)
{
printf("1) Aggiungere elemento\n");
printf("2) Leggere elemento\n");
printf("3) Verificare l'esistenza di un elemento\n");
printf("4) Cancellare un elemento\n");
printf("5) Leggere tutti gli elementi in ordine\n");
printf("6) Contare gli elementi\n");
printf("7) Dealloca la lista\n");
}
/* -------- DA QUI INIZIA IL CODICE DELLE FUNZIONI PER LA GESTIONE DELLE LISTE ---------- */
void Init_List(LIST* list){ /* Funzionante */
list->items = (char**)malloc(1*sizeof(char*));
list->counter = -1;
}
int Push_to_list(LIST* list, char* item){ /* Funzionante */
list->counter++;
list->items[list->counter] = (char*) malloc((strlen(item)+1)*sizeof(char));
int a = 0;
while(*item!='\0')
{
list->items[list->counter][a]=*item;
item++;
a++;
}
list->items[list->counter][a] = '\0';
list->items = realloc(list->items, (list->counter+2) * sizeof(char*));
return list->counter;
}
char* Read_to_list(LIST* list, int pos) /* Funzionante */
{
if((pos < 0) || (pos > list->counter))
{
return NULL;
}
else
{
return list->items[pos];
}
}
int Item_Exists(LIST* list, char* item) /* Funzionante */
{
int i = 0;
while(i<=list->counter)
{
if(strcmp(list->items[i],item)==0)
{
break;
}
else
{
i++;
}
}
if(i > list->counter)
{
return -1;
}
else
{
return i;
}
}
char* Pop_to_list(LIST* list, int pos) /* Funzionante */
{
if((pos < 0) || (pos > list->counter))
{
return NULL;
}
else
{
char* ptr = (char*)malloc(strlen(list->items[pos])+1*sizeof(char));
int p = 0;
while(list->items[pos][p]!='\0')
{
ptr[p] = list->items[pos][p];
p++;
}
ptr[p] = '\0';
free(list->items[pos]);
if(pos == FIRST)
{
p = 1;
while(p <= list->counter)
{
list->items[p-1] = list->items[p];
p++;
}
}
else if(pos == list->counter)
{
int i = list->counter - 1;
p = 0;
while(p<=i)
{
list->items[p] = list->items[p];
p++;
}
}
else
{
p = 0;
int e = pos;
while(p<e)
{
list->items[p] = list->items[p];
p++;
}
p++;
list->items[e] = list->items[p];
p = 1;
while(pos+p < list->counter)
{
list->items[pos+p] = list->items[pos+p+1];
p++;
}
}
list->counter = list->counter - 1;
list->items = (char**)realloc(list->items,(list->counter+3-1)*sizeof(char*));
return ptr;
}
}
void Destroy_List(LIST* list) /* Funzionante */
{
int i = FIRST;
while(i <= list->counter)
{
free(list->items[i]);
i++;
}
free(list->items);
list->counter = -1;
}