#include #include #include #include struct myNode { int val; char cara; struct myNode *next; }; // Primo nodo "testa" struct myNode *head = NULL; /* Nodo "corrente", indispensabile al funzionamento della lista */ struct myNode *tail = NULL; using namespace std; struct myNode* create_list(int val,char caro) { printf("Crea la testa della lista con [%d] [%c]\n",val,caro); /* Alloca un'area pari alla dimensione della struct */ struct myNode *ptr = (struct myNode*)malloc(sizeof(struct myNode)); // Allocazione fallita if(ptr==NULL) { printf("Creazione nodo fallita\n"); return NULL; } // Assegna al nuovo nodo i valori ptr->val = val; ptr->cara=caro; // Pone NULL come puntatore del primo nodo ptr->next = NULL; /* Equivalenti: *prt.val=val; *prt.next=NULL; */ // Il primo elemento è // anche il corrente, avendone // solo uno "puntatori uguali" head = tail = ptr; return ptr; } struct myNode* add_to_list(int val,char caro, bool add_to_end) { if(NULL == head) //se il primo è null, crea la lista { return (create_list(val,caro)); } if(add_to_end) printf("Aggiunge in coda [%d] [%c]\n",val,caro); else printf("Aggiunge in testa [%d] [%c]\n",val,caro); struct myNode *ptr = (struct myNode*)malloc(sizeof(struct myNode)); if(NULL == ptr) { printf("Creazione del nodo fallita!\n"); return NULL; } ptr->val = val; ptr->cara = caro; ptr->next = NULL; if(add_to_end) { // il "corrente" ora punta al nuovo aggiunto tail->next=ptr; // il "corrente" ora è il nuovo aggiunto tail=ptr; } else { // il"corrente" ora punta al primo ptr->next = head; // il "corrente" ora è il primo head = ptr; } return ptr; } struct myNode* search_in_list(int val, struct myNode **prev) { struct myNode *ptr = head; struct myNode *tmp = NULL; bool found = false; printf("Ricerca del valore [%d]\n",val); while(ptr != NULL) { if(ptr->val == val) { found = true; break; } else { //la ricerca continua tmp = ptr; ptr = ptr->next; //ptr ora punta al successivo indicato, se nullo,esce dal ciclo. } } if(true == found) { if(prev) *prev = tmp; return ptr; } else { return NULL; } } int delete_from_list(int val) { struct myNode *prev = NULL; struct myNode *del = NULL; printf("Cancella elemento [%d] dalla lista\n",val); del=search_in_list(val,&prev); if(del==NULL) { return -1; } else { if(prev!=NULL) prev->next=del->next; if(del==tail) tail=prev; else if(del==head) head=del->next; } free(del); del = NULL; return 0; } void print_list(void) { struct myNode *ptr = head; printf("------- Elementi della Lista\n"); if(ptr==NULL) printf("Vuota...\n"); else while(ptr != NULL) //ripete finchè non è null, assegnando ogni volta il successivo { printf("Elemento [%d] [%c]\n",ptr->val,ptr->cara); ptr = ptr->next; } printf("------- Fine Lista -------\n"); return; } int main(void) { int i = 0, ret = 0; struct myNode *ptr = NULL; print_list(); // Test di cancellazione di una lista vuota printf("Test di cancellazione con lista vuota\n"); ret = delete_from_list(8); if(ret != 0) printf("Elemento inesistente\n"); else printf("Elemento cancellato\n"); for(i = 1; i<10; i++) { add_to_list(i,(char)('Z'-i+1),false); } printf("Indirizzo puntato da head %d\n",&head); cout<< "(In esadecimale) "<<&head<<"\n"; print_list(); for(i = 1; i<10; i += 4) { printf("Cerco [%d]\n ",i); ptr = search_in_list(i, NULL); if(ptr==NULL) { printf("Ricerca fallita\n"); } else { printf("Trovato, carattere: [%c]",ptr->cara); } print_list(); } // Test di cancellazione dell'ultimo // elemento printf("Test di cancellazione dell'ultimo elemento\n"); ret = delete_from_list(9); if(ret != 0) printf("Elemento inesistente\n"); else printf("Elemento cancellato\n"); print_list(); // Test di cancellazione del primo // elemento printf("Test di cancellazione del primo elemento\n"); ret = delete_from_list(1); if(ret != 0) printf("Elemento inesistente\n"); else printf("Elemento cancellato\n"); print_list(); // Test di cancellazione di un elemento // mediano printf("Test di cancellazione elemento mediano\n"); ret = delete_from_list(5); if(ret != 0) printf("Elemento inesistente\n"); else printf("Elemento cancellato\n"); print_list(); // Cerca di cancellare un elemento inesistente printf("Test di cancellazione elemento non presente\n"); ret = delete_from_list(99); if(ret != 0) printf("Elemento non presente\n"); else printf("Elemento cancellato\n"); return 0; }