Nuovo problema lista a puntatore...

di il
16 risposte

Nuovo problema lista a puntatore...

Salve ho corretto il codice per l'inserimento nella lista in vla ma lo stesso non và questa volta veramente non capisco perchè visto che a livello di logica mi sembra impeccabile vi mostro la classe la struttura e poi la procedura grazie a tutti

class vla{
	
	private :
	
	nodo vet[10];
	nodo *nodo1;
	bool pieno;
	int supporto(nodo*);
	void stampa_la_lista(char);

	public :
	
	int controlla(char);
	vla(int);
	void inserisci(char);
	void inserimento_lista(char,char);
	int conta_nodi();
	bool get_pieno();
	void set_resetta(int);
	void stampa();
	~vla();
	
	
};

struct nodo
{
	char info;
	 nodo*next;
};

void vla::inserisci(char x)
{ 
	int i=0;
	while((vet+i)->info!='\0')
		i++;
	(vet+i)->info=x;
	(vet+i+1)->info='\0';
	if(i>=10)
		pieno=true;

}//questo metodo inserisce nel vettore principale e fino  a qui funziona.
è questa procedura che mi fà bloccare tutto il programma:
void vla::inserimento_lista(char nodo,char elemento)
{
	int i=0;
	struct nodo *ap,*nod2;
	ap=new struct nodo;
	ap->info=elemento;
	ap->next=NULL;
	while((vet+i)->info!=nodo)
		i++;
	    nod2=(vet+i)->next;
	  
		while(nod2->next!=NULL)
		nod2=nod2->next;
	nod2->next=ap;
}




grazie a tutti e scusate per il disturbo...purtroppo sono 1 programmatore alle prime armi, visto che sono solamente al secondo anno di programmazione scolastica...

16 Risposte

  • Re: Nuovo problema lista a puntatore...

    Spiega il "non va". Che succede se il tuo "vet" è vuoto in questa riga?
    
     while((vet+i)->info!=nodo)
    
    poi un altra cosa: quale ti sembra + leggibile, il metodo sopra oppure questo:
    
     while(vet[i].info!=nodo)
    
    Per l'ennesima volta: info è un char, nodo è un tipo di dato, + precisamente un struct.
  • Re: Nuovo problema lista a puntatore...

    Nel momento che provo a inserire nella lista adiacente mi esce scritto segmentation fault logout compilo con xcode... se può aiutare anche se credo di no...
  • Re: Nuovo problema lista a puntatore...

    Il paramentro nodo è un char che io ho chiamato nodo sarebbe controlla il carattere x con i caratteri contenuti nel vettore e lo sò anche io ho sempre fatto vet ecc ma da qualche tempo a questa parte il mio prof ha detto che per i puntatori è meglio fare (vet+i)
    nel while quando è vuoto non parte prp e aggancia direttamente no?
  • Re: Nuovo problema lista a puntatore...

    Hai chiamato una variabile con lo stesso nome di un tipo di dati.
    
    char nodo;
    struct nodo
    {
       char info;
        nodo*next;
    };
    
    secondo te è il metodo giusto?
    Di al tuo prof che hai un vettore di struct e non dei puntatori. Poi li chiedi perche nelle classi esiste l'overload del operatore [] ? Per puro piacere, tanto c'è sempre l'aritmetica dei puntatori?

    Io non ho ancora capito cosa fa sta funzione
    
    void vla::inserimento_lista(char elem,char elemento) //ho rinominato da nodo a elem il primo parametro.
    
    Perche li servono due caratteri per poi inserire uno solo?
  • Re: Nuovo problema lista a puntatore...

    In pratica ho questo vettore un campo contiene un char e un campo contiene il puntatore alla lista giusto? io l'ho organizzato così mi faccio dare il nome dell'elemento del vettore e poi li inserisco alla fine.
    esempio il mio vettore contiene:
    c.i=campo informazione
    c.i. campo puntatore
    |q||->puntatore
    |e||->puntatore
    |r||->puntatore
    |g||->puntatore
    |y||->puntatore


    io praticamente dico inserisci l'elemento x nel campo informazione di e per esempio non sò se mi sono spiegato...
  • Re: Nuovo problema lista a puntatore...

    Quindi fai un rimpiazzamento del elemento giusto? Allora la cosa è + facile
    
    void vla::inserimento_lista(char elem,char elemento)
    {
       for(int i = 0; i < 10; i++)
       {
          if(vet[i].info == elem)
          {
              vet[i].info = elemento; 
              break; //elemento rimpiazzato
          }
       }
    }
    
    Il tuo problema è capire le liste. Le liste sono delle entità dove ogni elemento è linkato al successivo. Nel tuo caso tu stai creando un vettore di struct che è una lista se proprio lo voliamo chiamare così. Il modo giusto sarebbe stato dichiarare la lista così;
    
    nodo *vet;
    
    In questo modo tu non hai allocato spazio per 10 elementi ma hai una lista che cresce dinamicamente ogni volta che c'è bisogno di inserire un elemento.
    il rimpiazzamento adesso cambia.
    
    if(vet == NULL)
       return; //niente da rimpiazzare, lista vuota
    nodo *ptr = vet;
    while(ptr->next != NULL && ptr->info != elem)
           ptr = ptr->next;
    if(ptr->info == elem)
        ptr->info = elemento; //rimpiazzamento
    else  //fine lista quindi non fare niente perche non hai trovato l'elemento da rimpiazzare
    {
    }   
    
    Come vedi nessun indice i è coinvolto perche non si può + parlare di indice ma solo di celle di memoria che puntano ad altre celle tramite il puntatore next.
  • Re: Nuovo problema lista a puntatore...

    Scusatemi per il fastidio ma io non devo sostituire il carattere bensì inserire un carattere si scorre la lista adiacente a quella del vettore fino a che non arriva fino a null e poi inserisci l'elemento capito come dico??
    sono io che sono poco chiaro lo sò ma purtroppo questo argomento lo vedo 1 pò complicato e visto che tra poco iniziamo i file non vorrei rimanere indietro anche perchè di informatica ho comunque buoni voti...
  • Re: Nuovo problema lista a puntatore...

    Quindi ricapitoliamo:
    1. Hai un vettore di strutture dove la struttura e definita con
    a. campo info
    b. puntatore ad una lista di adiacenze a questo campo info.
    Se ho capito bene stai creando un grafo. Adesso il discorso cambia.
    http://it.wikipedia.org/wiki/Lista_di_adiacenz
  • Re: Nuovo problema lista a puntatore...

    Si stò creando un grafo....
  • Re: Nuovo problema lista a puntatore...

    Come colleghi gli archi di questo grafo? In teoria parlo. Memorizzi l'indirizzo dell'elemento che deve fare parte alla lista? IN quel caso a te serve un vettore di puntatori a nodo creato dinamicamente. Quindi hai il tuo vettore statico di 10 nodi e a ciascun indice corrisponde un vettore dinamico che contiene gli indirizzi di memoria a cui questo indice si collega tramite un arco giusto?
  • Re: Nuovo problema lista a puntatore...

    E' + complicato a spiegarlo a parole che a farlo, cmq una rappresentazione è questa.
    
    #include <iostream>
    
    #define MAX 10
    
    struct lista_add
    {
    	char * arco_collegamento;
    	lista_add *next;
    };
    
    struct nodo
    {
    	char info;
    	lista_add *listaAddiacenze;
    }nodo_p;
    
    
    
    class vla
    {
    private :
    	int numElementi;
    	nodo vet[MAX];
    	bool pieno;
    	int supporto(nodo*);
    	void stampa_la_lista(char);
    
    public :
    	int controlla(char);
    	vla();
    	void inserisci(char);
    	void inserimento_lista(char,char);
    	int conta_nodi();
    	bool get_pieno();
    	bool controlla_pieno();
    	void set_resetta(int);
    	int cerca_elemento(char elem);
    	void stampa();
    	void stampa_listaAdd(char elem);
    	~vla();
    };
    
    vla::vla()
    : numElementi(0)
    , pieno(false)
    {
    
    }
    
    vla::~vla()
    {
    }
    
    void vla::inserimento_lista(char elem,char elemento)
    {
    	int i = cerca_elemento(elem);
    	if(i != -1)
    	{
    		int j = cerca_elemento(elemento);
    		if(vet[i].listaAddiacenze == NULL)
    		{
    			if(j != -1)
    			{
    				vet[i].listaAddiacenze = new (lista_add);
    				vet[i].listaAddiacenze->arco_collegamento = &(vet[j].info);
    				vet[i].listaAddiacenze->next = NULL;
    			}
    		}
    		else
    		{
    			lista_add *ptr = vet[i].listaAddiacenze;
    			while(ptr->next != NULL)
    				ptr = ptr->next;
    			ptr->next = new (lista_add);
    			ptr->next->arco_collegamento = &(vet[j].info);
    			ptr->next->next = NULL;
    		}
    	}
    }
    
    int vla::cerca_elemento(char elem)
    {
    	for(int i = 0; i < MAX; i++)
    	{
    		if(vet[i].info == elem)
    			return i;
    	}
    	return -1;
    }
    							
    void vla::inserisci(char elemento)
    {
    	if(get_pieno())
    	{
    		std::cout << "Vettore pieno non posso inserire altri elementi";
    		return;
    	}
    	vet[numElementi].info = elemento;
    	vet[numElementi].listaAddiacenze = NULL;
    	numElementi++;
    	pieno = controlla_pieno();
    }
    
    bool vla::get_pieno(void)
    {
    	return pieno;
    }
    
    bool vla::controlla_pieno()
    {
    	return (numElementi > MAX);
    }
    
    void vla::stampa_listaAdd(char elem)
    {
    	int i = cerca_elemento(elem);
    	if(i != -1)
    	{
    		lista_add *ptr = vet[i].listaAddiacenze;
    		std::cout << "lista addiacenze di " << vet[i].info << " e\': \t";
    		while(ptr != NULL)
    		{
    			std::cout << *(ptr->arco_collegamento) << ", ";
    			ptr = ptr->next;
    		}
    	}
    }
    int main(int argc, char *argv[])
    {
    	vla v;
    	v.inserisci('a');
    	v.inserisci('b');
    	v.inserisci('c');
    	v.inserimento_lista('a','b');
    	v.inserimento_lista('a','c');
    	v.stampa_listaAdd('a');
    }
    
    Come output hai:
    lista addiacenze di 'a' è: b, c
  • Re: Nuovo problema lista a puntatore...

    Grazieeeee sei stato utilissimo adesso mi è tutto chiaro!!
  • Re: Nuovo problema lista a puntatore...

    Ahh 1 ultima cosa sei un mito!!
  • Re: Nuovo problema lista a puntatore...

    Si ma micca è finita quà. Hai ancora un casino da fare. Nel destructor devi eliminare la memoria allocata con new. Devi implementare le funzioni non implementate da me ecc. Si lascia per esercizio allo studente
Devi accedere o registrarti per scrivere nel forum
16 risposte