-

[DOMANDA] [C] eliminazione in coda in una lista

gazel

Nuovo Utente
9
0
Hardware Utente
CPU
amd 9 9420
RAM
8
#1
ciao a tutti volevo chiedervi aiuto con il seguente codice, tutte le volte che cerco di eliminare gli elementi della lista in coda ricevo un messaggio "core dumped" ma non riesco a capire dove sta il problema sbaglio a eliminare i coda?
C:
#include <stdio.h>
#include <malloc.h>
struct piano{
unsigned short int livello;
struct piano *ponte;
};
void stampa_inverso(struct piano *l);
int main() {
struct piano *scorri,*tail, *head;
unsigned short int n,d;
//creao l'ultimo della
printf("inserisci il numero di torri\n");
scanf("%hd", &n );
scorri=(struct piano*)malloc(sizeof(struct piano));
scorri->livello=1;
scorri->ponte=NULL;
tail=scorri;
head=scorri;//puntatore che rimane fermo al primo della lista
scorri=NULL;
for (int i=0;  i< n-1; i++) {
  scorri=(struct piano*)malloc(sizeof(struct piano));
  scorri->livello=2+i;
  scorri->ponte=NULL;
  tail->ponte=scorri;
  tail=scorri;
  scorri=NULL;
}
//stampa in ordine
/*while ((*head).ponte!=NULL) {
  printf("livello=%hd\n", (*head).livello);
  head=head->ponte; //faccio avanzare scorri di 1 fino farlo a raggiungere al'ultima coda
}*/
//stampo al contrario
     printf("                    _______\n");
for (int i=0; i<n ;i++) {
      scorri=head;
      if (head==tail) {//la testa scritta com ultima
        printf("                    |     |   \n");
        printf("                    |  %hd  |   \n",tail->livello);
        printf("                    |_____|   \n");
    } else {
      while (scorri->ponte!=tail) {
        scorri=scorri->ponte;
    }
    printf("                    |     |   \n");
    printf("                    |  %hd  |   \n",tail->livello);
    printf("                    |_____|   \n");
    tail=scorri;
      }
  }
printf("inserisci il numero di torri da eliminare\n");
scanf("%hd", &d);
for (int z = 0; z < d; z++) {//eliminazione in coda
  if (head==tail) {
                  free(head);
                  }
                  while (scorri->ponte!=tail) {
                  scorri=scorri->ponte;
                  }
                  free(scorri->ponte);
                  scorri->ponte=NULL;
                  tail=scorri;
}
  return 0;
}
 

Andretti60

Utente Attivo
2,829
1,848
Hardware Utente
#2
Si, la parte dove elimini gli elementi ha problemi, nel primo ciclo while la variabile scorri non è inizializzata. Quello è il primo errore che vedo, ce ne possono essere altri e non ho controllato la strategia: perché hai due cicli innestati?
 

gazel

Nuovo Utente
9
0
Hardware Utente
CPU
amd 9 9420
RAM
8
#3
Si, la parte dove elimini gli elementi ha problemi, nel primo ciclo while la variabile scorri non è inizializzata. Quello è il primo errore che vedo, ce ne possono essere altri e non ho controllato la strategia: perché hai due cicli innestati?
il mio intentoo è quello di eliminare un nodo della lista alla volta per quante volte chiesto dall'utente
 

Andretti60

Utente Attivo
2,829
1,848
Hardware Utente
#4
il mio intentoo è quello di eliminare un nodo della lista alla volta per quante volte chiesto dall'utente
Ah, vedo il problema, la tua lista non e' double linked quindi per eliminare dalla coda devi ogni volta trovare la coda (che spreco). Ad ogni modo, devi inizializzare la variabile scorri, come ti ho gia' detto la usi senza inizializzarla. Devi inoltre essere sicuro che la variabile tail sia aggiornata, ma non ti serve a nulla in quanto per trovare la fine basta che guardi quando il membro 'ponte' e' nullo.
 
Mi Piace: gazel

gazel

Nuovo Utente
9
0
Hardware Utente
CPU
amd 9 9420
RAM
8
#5
Ah, vedo il problema, la tua lista non e' double linked quindi per eliminare dalla coda devi ogni volta trovare la coda (che spreco). Ad ogni modo, devi inizializzare la variabile scorri, come ti ho gia' detto la usi senza inizializzarla. Devi inoltre essere sicuro che la variabile tail sia aggiornata, ma non ti serve a nulla in quanto per trovare la fine basta che guardi quando il membro 'ponte' e' nullo.
grazie mille dell'aiuto
 

Discussioni Simili


Entra