Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Forum - C/C++
- problemi con la Cancellazione di un elemento da una lista
()
Newbie
Messaggi: Iscritto:
Postato alle 1:00
Giovedì, 01/01/1970
salve a tutti sto studiando le liste e non ho capito come faccio a canellare un elemento da una lista, ho provato a scrivere qualcosa ed il massimo che sono riuscito a fare è questo,
Codice sorgente - presumibilmente C++
#include <stdlib.h>
#include <stdio.h>
struct list_t {
char parola[10];
int numero;
struct list_t *next;
};
typedefstruct list_t list_t;
int main (int argc, char**argv){
int i =0;
list_t *nuova_lista, *head, *delete;
nuova_lista =(list_t *)malloc(sizeof(list_t));
head = nuova_lista;
delete= head;
for(i=0; i<4; i++){
printf("Inserisci char e int\n");
scanf("%s", nuova_lista -> parola);
scanf("%d", &nuova_lista -> numero);
nuova_lista -> next =(list_t *)malloc(sizeof(list_t));
nuova_lista = nuova_lista ->next;
}
nuova_lista -> next =NULL;
while(delete!=NULL){
if(strcmp(delete-> parola, "giovanni")==0 &&delete-> numero == 20){
if(strcmp(delete -> parola, "giovanni")==0 && delete -> numero == 20){
free(delete -> next);
delete -> next = delete -> next -> next;
}
delete = delete -> next;
}
il codice incriminato è questo, se è una single linked list (ovvero a scorrimento forward only), devi scorrere gli elementi controllando se il successivo dell'elemento corrente è l'elemento da cancellare. Se lo è, prima di chiamare la free, ti salvi il next di quello da eliminare e lo assegni come next dell'elemento corrente, poi chiami la free.
Ultima modifica effettuata da HeDo il 11/06/2010 alle 18:21
Inoltre, secondo me, ci sono altri piccoli errori, infatti così come l'hai strutturato nel ciclo for allochi l'ultimo elemento senza utilizzarlo...
Inoltre nella cancellazione dovresti considerare come caso a parte il caso in cui l'elemento da eliminare si trova in testa...
()
Newbie
Messaggi: Iscritto:
Postato alle 11:09
Sabato, 12/06/2010
Sisi infatti ancora sono poco esperiente con queste liste, e tra qualche settimana ho l'esame all'università... speriamo in bene!.. Comunque ragazzi grazie per il vostro aiuto userò i vostri suggerimenti per modificare il mio codice se ho altri prblemi vi disturberò nuovamente
()
Newbie
Messaggi: Iscritto:
Postato alle 12:12
Sabato, 12/06/2010
Ecco qui il codice per a cancellazione adesso funzionante, voi cosa ne pensate?? va bene??
Codice sorgente - presumibilmente C/C++
if(strcmp(delete -> parola, "giovanni")==0 && delete -> numero == 20){
head = delete -> next;
free(delete);
}else {
delete = delete -> next;
while(delete != NULL){
if(strcmp(delete -> parola, "giovanni")==0 && delete -> numero == 20){
e se un utente inserisse per due volte giovanni 20?
inoltre, se posso, vorrei darti un altro consiglio, evita di scrivere tutto nel main piuttosto crea una funzione per l'inserimento e una per la cancellazione...
Ultima modifica effettuata da Premoli il 12/06/2010 alle 15:34
()
Newbie
Messaggi: Iscritto:
Postato alle 11:23
Sabato, 19/06/2010
Ecco qui tutto il codice sistemato in funzioni, compilandolo funziona però lo voglio pubblicare per sapere da voi se è un buon codice cosi scritto!..
Codice sorgente - presumibilmente C++
#include <stdlib.h>
#include <stdio.h>
struct list_t {
char parola[10];
int numero;
struct list_t *next;
};
typedefstruct list_t list_t;
list_t *
create_list_n (list_t *head, int n);
void
print_list(list_t *head_list);
list_t*
delete_list(list_t *head);
int main (int argc, char**argv){
list_t *head;
int num;
if(argc == 2){
num =atoi(argv[1]);
head = create_list_n(head, num);
print_list(head);
head = delete_list(head);
print_list(head);
}
else{
printf("inserisci il numero nella riga di comando\n");
}
}
list_t *
create_list_n (list_t *head, int n){
int i;
list_t *tail;
if(head){
head =(list_t *)malloc(sizeof(list_t));
tail = head;
printf("char int\n");
scanf("%s", head -> parola);
scanf("%d", &head -> numero);
for(i=0; i<n-1; i++){
tail -> next =(list_t *)malloc(sizeof(list_t));
tail = tail -> next;
printf("char int\n");
scanf("%s", tail -> parola);
scanf("%d", &tail -> numero);
}
tail -> next =NULL;
}
return head;
}
void
print_list(list_t *head){
while(head){
printf("char: %s, int: %d,\n", head -> parola, head -> numero);