eliminazione ultimo elemento lista

davide84

Utente Attivo
45
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....
 

Arcovoltaico77

Utente Èlite
1,558
10
CPU
Core 2 Duo E2200 + Thermaltake silent tower 112cu (1,3 Kg)
Scheda Madre
Asus P5B
HDD
160Gb Maxtor SATA2 + WD Caviar 250GB SATA2
RAM
2 * 1Gb Corsair CL4 (Pc4300, Value Select)
GPU
Point of View 6600GT 256Mb (500-1000 @ 571-1183)
Audio
integrato 5.1
Monitor
LCD 17 samsung
PSU
Enermax Pro82+ 525 Watt
Case
ColorsIT
OS
Windows XP & Ubuntu
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;
}
 

davide84

Utente Attivo
45
0
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....
 

K.I.

Utente Èlite
1,644
7
CPU
Intel Prescott 530J con Zalman 7700CU
Scheda Madre
Asus P5GD2
HDD
Maxtor Sata 160Gb e Floppy
RAM
Micron 1024Mb
GPU
Asus 6600GT PCI-E
Audio
Onboard con Creative GD580
Monitor
HP F2105 e Scheda TV Terratec Cinergy 600TV
PSU
Enermax Noisetaker 485W
OS
Windowd XP e Kubuntu 7.04
Prova così

prox = (*lis)->next;


Ciao!
 

davide84

Utente Attivo
45
0
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...
 

K.I.

Utente Èlite
1,644
7
CPU
Intel Prescott 530J con Zalman 7700CU
Scheda Madre
Asus P5GD2
HDD
Maxtor Sata 160Gb e Floppy
RAM
Micron 1024Mb
GPU
Asus 6600GT PCI-E
Audio
Onboard con Creative GD580
Monitor
HP F2105 e Scheda TV Terratec Cinergy 600TV
PSU
Enermax Noisetaker 485W
OS
Windowd XP e Kubuntu 7.04
Ma la funzione "esegui" non inizia con "while(curr!=NULL)"

dove è scritto? :)


Ciao ;)
 

davide84

Utente Attivo
45
0
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");




}
 

K.I.

Utente Èlite
1,644
7
CPU
Intel Prescott 530J con Zalman 7700CU
Scheda Madre
Asus P5GD2
HDD
Maxtor Sata 160Gb e Floppy
RAM
Micron 1024Mb
GPU
Asus 6600GT PCI-E
Audio
Onboard con Creative GD580
Monitor
HP F2105 e Scheda TV Terratec Cinergy 600TV
PSU
Enermax Noisetaker 485W
OS
Windowd XP e Kubuntu 7.04
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!
 

davide84

Utente Attivo
45
0
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.....
 

K.I.

Utente Èlite
1,644
7
CPU
Intel Prescott 530J con Zalman 7700CU
Scheda Madre
Asus P5GD2
HDD
Maxtor Sata 160Gb e Floppy
RAM
Micron 1024Mb
GPU
Asus 6600GT PCI-E
Audio
Onboard con Creative GD580
Monitor
HP F2105 e Scheda TV Terratec Cinergy 600TV
PSU
Enermax Noisetaker 485W
OS
Windowd XP e Kubuntu 7.04
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.
 

davide84

Utente Attivo
45
0
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..
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili