Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Cancellazione elementi di una lista

    Salve, ho un problema con la cancellazione di elementi all’interno di una lista. Quello che volevo fare era, scorrere l’intera lista, se si verifica la condizione, cancellare l’elemento puntato, sia che l’elemento si trova in testa, coda o nel mezzo, e poi riusare la lista per poter aggiungere altri elementi. Il problema è che se libero la memoria FREE(temp) –vedi parte commentata- mi da errore perché il puntatore al ciclo successivo punta ad una allocazione della memoria inesistente. Quello che mi chiedo è giusto così come ho fatto? Come faccio a deallocare la memoria occupata visto che dopo un minuto supero i 2,5Gb di memoria?

    codice:
    typedef struct elemento
    {
    	int val;
    	struct elemento *next;
    	struct elemento *prev;
    }; 
    struct elemento *cancellaElemento(struct elemento *pCanc){
    
    struct elemento *temp;
    while(pCanc!=NULL){	
    	if(condizione){
    		//caso in cui è l’unico elemento nella lista ad essere cancellato
    		if(pCanc->next==NULL && pCanc->prev==NULL){
    			//free(pCanc);
    			
    		}else if(pCanc->prev==NULL && pCanc->){
    			temp=pCanc;
    			pCanc->next->prev=NULL;
    			//free(temp);
    			//continue;
    		}else if(pCanc->next==NULL){
    			temp=pCanc;
    			pCanc->prev->next=NULL;
    			//free(temp);
    			//continue;
    		}else if(pCanc->next!=NULL && pCanc->prev!=NULL){
    			temp=pCanc;								
    			pCanc->next->prev=pCanc->prev;
    			pCanc->prev->next=pCanc->next;				
    			//free(temp);
    		}	
    	}
    	pCanc=pCanc->next;
    }
    return pCanc;
    }

  2. #2
    Help me!!!
    voglio qualche consiglio vi prego, sto sclerando

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    ho letto il link che mi hai dato e sintatticamente mi sembra giusto
    il problema è che se tento di liberare la memoria con free mi va in crash

    ciao

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    No ... non hai letto bene il contenuto della pagina del link ...

    Non e' solamente la sintassi che devi rispettare (altrimenti non compilerebbe) ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304

    Moderazione

    Il linguaggio va espressamente indicato nel titolo, come richiesto dal regolamento.

    Correggo io.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Grazie per aver modificato il titolo, la prox volta starò + attento.

  8. #8
    ciao,
    ti ringrazio dell'aiuto che mi hai dato, ma nn sono riuscita ancora a capire l'errore.
    Comunque vediamo di procedere passo passo.
    Considerando il link che mi hai dato, le liste doppiamente concatenate o doubly-linked sono rappresentate così

    [NULL|dato|next]<=>[prev|dato|next]<=>[prev|dato|next]<=>...<=>[prev|dato|NULL]

    io ho aggiungo elementi alla lista nel seguente modo:
    codice:
    struct elemento *aggiungiElemento(struct elemento *p, int valore)
    {       
    	//aggiunge in testa
    	
    	
    	
    	struct elemento *punt;
    
    	if(p != NULL)
    	{ 
    		// creazione Nodi successivi 
    		punt = (struct elemento *)malloc(sizeof(struct elemento));
    		punt->val = valore;
    		// Metto il puntatore in testa alla lista
    		punt->next = p;
    		punt->prev = NULL;
    		p->prev = punt;
    
    	} else { 		
    		
    		p = (struct elemento *)malloc(sizeof(struct elemento)); 
    		p->val = valore;
    		p->next = NULL;
    		p->prev = NULL;
    		punt = p;
    	} 
    	return(punt);
    
    }
    Non ci dovrebbero essere errori, ma se ci sono segnalameli, oppure dimmi il perchè ho fatto in quel modo ed io proverò a rispondere.

    per quanto riguarda la cancellazione io volevo fare in questo modo, ma nn so se è fattibile: scorro l'intera lista, se dati è maggiore di un certo valore, cancellare il nodo con dati maggiore di valore; come ho scritto all'inizio la funzione cancellaElemento diciamo che l'elemento nn c'è ma nn possso liberare la memoria.

    P.S. Aiutami a trovare la retta via

  9. #9
    Forse ho capito, bisogna mettere un puntatore alla testa della lista ed una alla coda?...ma nn so come fare!!!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.