Oppure

Loading
22/09/10 11:07
fionda08
Salve a tutti io ho un problema con la cancellazione del primo elemento di una lista qst e il codice:
****************************
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct info{
	char nome[10];
	int numero;
	struct info *next;
};

typedef struct info info;

void inserisci(info *p);

void stampa(info *p);

void cancella(info *p);

int main (int argc,char **argv){
	
	info *p ,*head;
	p=(info*)malloc(sizeof(info));
	head=p;

	inserisci (p);
	stampa(head);
	cancella (head);
	stampa(head);
	
}


void inserisci(info *p){

	int i;

	printf("inserisci nome\n");
	for(i=0;i<3;i++){

		scanf("%s %d",p->nome,&p->numero);
		
		if(i<2){
			p->next=(info*)malloc(sizeof(info));
			p=p->next;
		}
	}
}

void stampa(info *p){
	
	printf("*******\n");
	while(p!=NULL){
		printf("%s %d\n",p->nome,p->numero);
		p=p->next;
	}
}

void cancella(info *p){
	
	char temp[10];
	info *t;
	printf("inserisci nome da cancellare \n");
	scanf("%s",temp);
	
	if(strcmp(temp,p->nome)==0){
		t=p;
		p=p->next;
		free(t);
	}		
}

*******************************
e se per esempio inserisco
marco 1
giovanni 2
luca 3
e voglio eliminare naturalmente solo il primo
qst e il risutato
1
giovanni 2
luca 3

HELP!! ps sono sotto Linux potrebbe esservi d'aiuto
grazie in aticipo:k:
Ultima modifica effettuata da Il Totem 23/09/10 11:06
aaa
22/09/10 18:07
giuseppe93
ciao! prova a fare una funzione di tipo info che restitiusca la nuova base, qualcosa del tipo
info * nuova_testa(info *testa){
return testa->next;}

e poi nella funzione cancella se verifichi che devi cancellare la base fai
p=nuova_testa(p);
aaa
23/09/10 6:43
gigisoft
Postato originariamente da fionda08:

Salve a tutti io ho un problema con la cancellazione del primo elemento di una lista qst e il codice:

[...]

void cancella(info *p){
    
    char temp[10];
    info *t;
    printf("inserisci nome da cancellare \n";);
    scanf("%s",temp);
    
    if(strcmp(temp,p->nome)==0){
        t=p;
        p=p->next;
        free(t);
    }        
}
[...]


Salve, l'errore sta nella definizione della funzione cancella, il modo in cui il puntatore viene passato fa si che la modifica non venga esportata al di fuori di essa. la definizione deve essere:

void cancella(info **p)

Ciao.

P.S.
in futuro sarebbe opportuno che tu usassi i tag Code per includere del codice sorgente.
Ciao.
aaa
23/09/10 8:36
fionda08
ciao gigisoft ho fatto come hai detto tu
[...]

void cancella(info **p){
    
    char temp[10];
    info *t;
    printf("inserisci nome da cancellare \n");
    scanf("%s",temp);
    
    if(strcmp(temp,p->nome)==0){
        t=p;
        p=p->next;
        free(t);
    }        
}
[...] 


ma mi da il seguente errore quando compilo
test.c: In function ‘main’:
test.c:27: warning: passing argument 1 of ‘cancella’ from incompatible pointer type
test.c:17: note: expected ‘struct info **’ but argument is of type ‘struct info *’
test.c: In function ‘cancella’:
test.c:65: error: request for member ‘nome’ in something not a structure or union
test.c:66: warning: assignment from incompatible pointer type
test.c:67: error: request for member ‘next’ in something not a structure or union
make: *** [test] Errore 1



come mai e aggiungo se puoi anche se puoi darmi una breve spiegazione su questo **info cke sinceramente non l'ho capito molto... grazie della tua disponibilita
aaa
23/09/10 11:13
Il Totem
Tu elimini l'elemento, ma la testa rimane sempre la stessa. Quindi è logico che visualizzi un elemento vuoto.
Le soluzioni sono due. O dichiari la funzione in modo che restituisca la nuova testa:
info* cancella(info *p)

e in questo caso devi aggiungere una return:
if(strcmp(temp,p->nome)==0){ 
        t=p; 
        p=p->next; 
        free(t);
        return p;
}

oppure fai come ha detto gigisof e usi un puntatore doppio:
void cancella(info **p)

Se usi quest'ultimo metodo, devi modificare la chiamata a funzione:
cancella(&head);

e di conseguenza anche il codice di cancella
if(strcmp(temp,p->nome)==0){ 
        t=p; 
        *p=(*p)->next; 
        free(t); 
}
aaa
23/09/10 12:49
fionda08
qst funziona alla grande...

void cancella(info *p,bau **h){
bau *temp;
temp=p;
char nomdel[20];
printf("Inserire nome da eliminare: ");
scanf("%s", nomdel);
if(strcmp(nomdel,p->nome)==0){
temp=p->next;
free(p);
*h=temp;
}


while (p->next!=NULL){
temp=p->next;

if(strcmp(nomdel, temp->nome)==0){

p->next=temp->next;
}
p=p->next;}}


qst codice me l'ha dato un mio amico... sapete spiegarmi pero all'interno del while come funziona?!?
aaa
24/09/10 8:16
Il Totem
Penso che quel while salti tutti gli elementi uguali (con nome uguale). Però non vengono liberati, manca la free. A questo punto sarebbe meglio riscrivere tutto in modo migliore: il tuo codice controllava solo il primo elemento, e pensavo fosse fatto apposta per comportarsi così, ma vedendo questo non ne sono più tanto convinto.
aaa