eliminazione ultimo elemento lista

Pubblicità

davide84

Utente Attivo
Messaggi
45
Reazioni
0
Ciao a tutti, ho bisogno di chiedervi una cosa in cui non riesco a trovare l'errore(molto probabilmente perchè sono agli inizi del C):

questa qua sotto è una funzione che mi dovrebbe eliminare l'ultimo elemento in lista ma ogni volta che l'eseguo mi dà errore nella riga tratteggiata e nonostante i svariati tentativi non sono riuscito a trovare la corretta soluzione


void eliminaultimo(struct cella **lis)
{
struct cella *temp,*prec;

if(*lis==NULL)
{
printf("lista vuota");
//return 1;
}

temp=*lis;
prec=NULL;

while(temp!=NULL)
{
if(temp->next==NULL)
{
prec->next=NULL;------------------
temp=NULL;
free(temp);
break;
}
prec=temp;
temp=temp->next;

}
}

Questa invece è la funzione dove mi serve che la funzione precedente....l'ho messa perchè casomai avessi sbagliato questa.....ma non penso...


void esegui(struct cella *testa)
{
while(testa!=NULL)
{

eliminaultimo(&testa);
inverso(testa);
system("pause");

}

}


Grazie a tutti...ciao....
 
mmm, vado a memoria, è una vita che non vedo 'ste cose , cmq prova così :

void eliminaultimo(struct cella **lis)
{
struct cella *curr, *prox;

if(*lis==NULL)
{
printf("lista vuota");
//return 1;
}

curr=*lis;
prox=lis->next;

while(prox != NULL)
{
curr = prox;
prox = prox->next;
}
free(curr);
curr = NULL;
}
 
mi da errore dove c'è scritto prox=lis->next;
e mi da il seguente errore:

error C2223: left of '->next' must point to struct/union

ho provato a fare alcune modifiche ma senza successo(io avevo provato ad aggiungere * prima di lis ma mi da sempre lo stesso errore)...
per caso sai cosa potrebbe essere....
 
grazie mille k.i. e arcovoltaico...adesso mi funziona ma ho un ultimo piccolo problema....come potete vedere dal primo messaggio che ho postato nella funzione esegui prima svolgo "eliminaultimo" e poi devo svolgere "esegui" ma questa inizia con "while(curr!=NULL)" e nella funzione eliminaultimo alla fine curr lo pongo uguale a NULL.....secondo me questo dovrebbe essere il motivo per cui non mi parte.....
sapete come potrei risolverlo....
se non lo sapete vi ringrazio comunque per l'aiuto che mi avete dato fino ad ora....mi è servito davvero tanto e pian piano mi stà piacendo sempre di più questo linguaggio C...anche se secondo me non è proprio facilissimo...
 
Ma la funzione "esegui" non inizia con "while(curr!=NULL)"

dove è scritto? :)


Ciao ;)
 
la funzione te lho messa tutta ma la riga while(temp!=NULL) è quasi all'inizio dove ho messo tutta quella serie di + e proprio lì mi dà errore....


void esegui(struct cella *testa)
{

int numeroattuale,numerodaspostare,numerodaspostaredue,rigadaspostare;
int numeriinseriti=0;
int flag=0,flagfatto=0;
int righespostate=0;
int i,j,h,k,t,u,g,f;
int indiceHnumerodaspostare,indiceKnumerodaspostare;
//int matrice_numero[100][100];
int matriceutilizzata[100][100];
int matriceordine[100][100];
int ordine=0;
int a=0,b=0;

struct cella *temp;

temp=testa;

if(temp==NULL)
{
printf("Non e' stata inserita nessuna permutazione.\n");
return;
}

valori=10;
//printf("Inserisci il numero di valori della permutazione: ");
//scanf("%d",&valori);


for(i=0;i<valori;i++)
{
for(j=0;j<valori;j++)
{
matrice[j]=0;
}
}

for(i=0;i<valori;i++)
{
for(j=0;j<valori;j++)
{
matriceutilizzata[j]=0;
}
}

for(i=0;i<valori;i++)
{
for(j=0;j<valori;j++)
{
matriceordine[j]=0;
}
}






while(temp!=NULL)//scorro tutti i numeri!
{

+++++++++++++++++++numeroattuale=temp->valore;
flag=0;
flagfatto=0;
if(numeriinseriti==0)//if relativo solo al primo caso
{
matrice[0][0]=numeroattuale;
matriceutilizzata[0][0]=1;
matriceordine[0][0]=++ordine;
numeriinseriti++;
temp=temp->next;
continue;
}

for(i=0;i<valori;i++)
{
for(j=0;j<valori;j++)
{
/*con questo if, considero il caso piu semplice, ovvero che il numero da inserire
sia il piu grande della riga, e quindi ovviamente va inserito alla destra
di tutti i numeri presenti sulla riga!*/
if(matriceutilizzata[j+1]==0 && numeroattuale>matrice[j])
{
matrice[j+1]=numeroattuale;
matriceutilizzata[j+1]=1;
matriceordine[j+1]=++ordine;
numeriinseriti++;
//testa=testa->next;
flag=1;
break;
}//fine primo if



else
{
if(matriceutilizzata[j+1]==1 && numeroattuale>matrice[j])
{

continue;
}
for(h=0;h<valori;h++)
{
for(k=0;k<valori;k++)
{
if(matrice[h][k]>numeroattuale)
{
indiceHnumerodaspostare=h;
indiceKnumerodaspostare=k;
numerodaspostare=matrice[h][k];
matrice[h][k]=numeroattuale;


for(t=h+1;t<valori;t++)
{
for(u=0;u<valori;u++)
{
if(matriceutilizzata[t]==0)
{
matrice[t]=numerodaspostare;
matriceutilizzata[t]=1;
matriceordine[t]=++ordine;
numeriinseriti++;
flagfatto=1;
break;
}
if(matriceutilizzata[t]==1)
{
if(numerodaspostare>=matrice[t])
continue;

if(numerodaspostare<=matrice[t])
{
numerodaspostaredue=matrice[t];
matrice[t]=numerodaspostare;

rigadaspostare=matrice[t+1];
matrice[t+1]=numerodaspostaredue;
matrice[t+2]=rigadaspostare;
righespostate++;





matriceutilizzata[t+1]=1;
matriceordine[t+1]=++ordine;
flagfatto=1;


for(g=0;g<valori;g++)
{
for(f=0;f<valori;f++)
{
if(matrice[g][f]!=0)
matriceutilizzata[g][f]=1;
}
}
break;
}
}


}
if(flagfatto==1)
break;
}
//testa=testa->next;

}

if(flagfatto==1)
break;
}

if(flagfatto==1)
break;
}

if(flagfatto==1)
break;
}
if(flagfatto==1)
break;

}
if(flag==1 || flagfatto==1)
break;
}

if(flag==1 || flagfatto==1)
{
temp=temp->next;
continue;
}


//testa=testa->next;

}//chiusura while----------------------


for(i=0;i<valori;i++){
for(j=0;j<valori;j++){
if(matrice[j]>matrice[j+1] && matrice[j+1]!=0)
{
matrice[i+1][j]=matrice[j];
matrice[j]=matrice[j+1];
matrice[j+1]=0;
matriceordine[i+1][j]=--ordine;
}
}
}




printf("\n\n\nTABELLA P: \n\n\n");
for(i=0;i<valori;i++)
{
for(j=0;j<valori;j++)
{
if(matrice[j]!=0)
printf("%d ",matrice[j]);
else
printf(" ");
}
printf("\n");
}


printf("\n\n");




}
 
Mamma che casino :)

Nulla da dirti, ma si vede che hai cominciato da poco :)

Piano piano migliorerai ;)

Ma l'errore te lo da dopo un pò che il programma gira?

Ciao!
 
si me lo dà dopo un po che il programma gira....cioè il programma parte e appena deve entrare in quella funzione mi segnala l'errore.....
 
Se usi il Visual Studio, ti conviene mettere dei break point all'entrata della funzione e poi la debuggi riga per riga, inserendo le variabili nella finestra di watch cosicchè puoi vedere i valori, gli indirizzi di memoria e capire dove muore ;)

Al momento sono al lavoro e non posso debuggarlo io :)

Ciao!

K.I.
 
grazie mille k.i. sei veramente troppo gentile....adesso ci provo subito....e vediamo cosa riesco a tirare fuori...
grazie ancora dei vari aiuti e scusa per il disturbo....
ciao..
 
Pubblicità
Pubblicità

Discussioni Simili

Indietro
Top