Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1

    Aiuto esercizio con Liste con 4 puntatori

    Si implementi una funzione che permetta la creazione di una
    scacchiera 6 x 6 utilizzando una struttura lista a puntatori,
    tramite il comando struct.
    Dunque ogni cella può avere quattro successori: su, giù, dx
    e sx, che simulano lo spostamento nelle quattro direzioni.

    Si implementi una funzione che permette di riempire tutte le
    celle della scacchiera (per semplicità anche manualmente)
    nel seguente modo:
    1. 5 celle con valore 1
    2. 5 celle con valore 2
    3. Tutte le altre con valore 0

    Si implementi inoltre una funzione che permetta di
    visualizzare a video la scacchiera 6 x 6 costruita con la
    precedente funzione.

    Ragazzi ho provato a costruire un qlkosa sulla base di qsta struttura:

    struct cella{
    struct cella *prev;
    struct cella *su;
    int inf;
    struct cella *next;
    struct cella *giu};

    nella creazione della lista ho fatto un ciclo for da 1 a 36 e mi creavo gli elementi ma qndo vado a creare il 7 elmento mi da problemi,forse l idea e sbagliata voi ne avete qlkuna????

  2. #2
    Se non posti il tuo programma è difficile aiutarti.
    Ciao

  3. #3
    struct elemento *crea_lista()
    {
    struct elemento *p,*punt,*inizio_riga,*fine_riga;
    int i,n;

    printf("\n Specificare il numero di elementi: ");
    scanf("%d", &n);

    if(n==0)
    p = NULL;
    else
    {
    p=(struct elemento *)malloc(sizeof(struct elemento));
    printf("\nInserisci il primo valore: ");
    scanf("%d", &p->inf);
    inizio_riga=p;
    inizio_riga->prev=NULL;
    inizio_riga->su=NULL;
    punt=inizio_riga;
    for(i=2;i<=n;i++)
    {

    if(i>=2 && i<=5)
    {
    punt->next=(struct elemento*)malloc(sizeof(struct elemento));
    printf("\npunt->inf= %d\n",punt->inf);
    printf("\npunt->next->prev->inf= %d\n",punt->inf);
    punt->next->prev=punt; //punt->next (e il nodo successivo)->prev lo collego al nodo precedente
    printf("\npunt->inf= %d\n",punt->inf);
    //printf("\nStampa il punt->next->prev: %d", punt->next->prev);
    printf("\n Prima del punt=punt->next Stampa il punt: %d\n", punt->inf);
    punt = punt->next;
    printf("\n Dopo il punt=punt->next Stampa il punt: %d\n", punt->inf);
    printf("\nInserisci il %d elemento: ", i);
    scanf("%d", &punt->inf);
    punt->su=NULL;
    printf("\npunt->inf= %d\n",punt->inf);
    printf("\npunt->prev->inf= %d\n",punt->prev->inf);
    //printf("\npunt->next->inf= %d\n",punt->next->inf);
    }
    if(i==6)
    {
    printf("\nSto inserendo il 6 elemento\n");
    fine_riga=punt;
    fine_riga->next=(struct elemento*)malloc(sizeof(struct elemento));
    printf("\n Prima della doppia puntata fine_riga->inf= %d\n",fine_riga->inf);
    fine_riga->next->prev=fine_riga; //punt->next (e il nodo successivo)->prev lo collego al nodo precedente
    printf("\n Dopo della doppia puntata fine_riga->inf= %d\n",fine_riga->inf);
    //punt->giu->su=punt;
    fine_riga = fine_riga->next;
    //printf("\n Dopo il punt=punt->next Stampa il punt: %d", punt);
    printf("\nInserisci il %d elemento: ", i);
    scanf("%d", &fine_riga->inf);
    fine_riga->su=NULL;
    fine_riga->next=NULL;
    //fine_riga=punt;
    printf("\nfine_riga->next->inf= %d\n",fine_riga->next);
    }
    else if(i==7)
    {
    printf("\nSto inserendo il 7 elemento\n");
    inizio_riga=p;
    inizio_riga->giu=(struct elemento*)malloc(sizeof(struct elemento));
    inizio_riga->giu->su=inizio_riga;
    printf("\nmmmm\n");
    inizio_riga = inizio_riga->giu;
    //printf("\n Dopo il punt=punt->next Stampa il punt: %d", punt);
    printf("\nInserisci il %d elemento: ", i);
    scanf("%d", &inizio_riga->inf);
    printf("\ninizio_riga->su->inf= %d\n",inizio_riga->su->inf);
    inizio_riga->prev=NULL;

    }
    else if(i>=8 && i<=11)
    {
    printf("\nSto inserendo l 8 elemento\n");
    punt=inizio_riga;
    printf("\npunt->inf= %d\n",punt->inf);
    punt->next=(struct elemento*)malloc(sizeof(struct elemento));
    printf("\npunt->inf= %d\n",punt->inf);
    printf("\nPrima del punt->next->prev->inf= %d\n",punt->next->prev->inf);
    punt->next->prev=punt;
    printf("\nDopo del punt->next->prev->inf= %d\n",punt->next->prev->inf);
    /* printf("\npunt->su->inf= %d\n",punt->su->inf);
    printf("\nPrima del punt->su->giu->inf= %d\n",punt->su->giu->inf);
    punt->su->giu=punt;
    printf("\nDopo del punt->su->giu->inf= %d\n",punt->su->giu->inf);*/
    punt=punt->next;
    //printf("\n Dopo il punt=punt->next Stampa il punt: %d", punt);
    printf("\nInserisci il %d elemento: ", i);
    scanf("%d", &punt->inf);
    punt->su=punt;
    printf("\npunt->prev->inf= %d\n",punt->prev->inf);
    printf("\npunt->su->inf= %d\n",punt->su->inf);
    }


    il problema e quando devo collegare l 8 elemento con il precedente con quello ke sta sopra ( cioe il 2) e il successivo

  4. #4
    Purtroppo il codice è illeggibile perché mancano delle {} quà e là. Poi, volevo chiederti: la struct elemento è la stessa di cella?
    Ciao

  5. #5
    Si la struct di cella e la stessa di elemento per il codice ora lo riscrivo:

    struct elemento *crea_lista()
    {
    struct elemento *p,*punt,*inizio_riga,*fine_riga;
    int i,n;

    printf("\n Specificare il numero di elementi: ");
    scanf("%d", &n);

    if(n==0)
    p = NULL;
    else
    {
    p=(struct elemento *)malloc(sizeof(struct elemento));
    printf("\nInserisci il primo valore: ");
    scanf("%d", &p->inf);
    p->prev=NULL;
    p->su=NULL;
    inizio_riga=p;
    punt=inizio_riga;
    for(i=2;i<=n;i++)
    {

    if(i>=2 && i<=5)
    {
    punt->next=(struct elemento*)malloc(sizeof(struct elemento));
    printf("\npunt->inf= %d\n",punt->inf);
    printf("\npunt->next->prev->inf= %d\n",punt->inf);
    punt->next->prev=punt; //punt->next (e il nodo successivo)->prev lo collego al nodo precedente
    printf("\npunt->inf= %d\n",punt->inf);
    //printf("\nStampa il punt->next->prev: %d", punt->next->prev);
    printf("\n Prima del punt=punt->next Stampa il punt: %d\n", punt->inf);
    punt = punt->next;
    printf("\n Dopo il punt=punt->next Stampa il punt: %d\n", punt->inf);
    printf("\nInserisci il %d elemento: ", i);
    scanf("%d", &punt->inf);
    punt->su=NULL;
    printf("\npunt->inf= %d\n",punt->inf);
    printf("\npunt->prev->inf= %d\n",punt->prev->inf);
    //printf("\npunt->next->inf= %d\n",punt->next->inf);
    }
    if(i==6)
    {
    printf("\nSto inserendo il 6 elemento\n");
    fine_riga=punt;
    fine_riga->next=(struct elemento*)malloc(sizeof(struct elemento));
    printf("\n Prima della doppia puntata fine_riga->inf= %d\n",fine_riga->inf);
    fine_riga->next->prev=fine_riga; //punt->next (e il nodo successivo)->prev lo collego al nodo precedente
    printf("\n Dopo della doppia puntata fine_riga->inf= %d\n",fine_riga->inf);
    //punt->giu->su=punt;
    fine_riga = fine_riga->next;
    //printf("\n Dopo il punt=punt->next Stampa il punt: %d", punt);
    printf("\nInserisci il %d elemento: ", i);
    scanf("%d", &fine_riga->inf);
    fine_riga->su=NULL;
    fine_riga->next=NULL;
    //fine_riga=punt;
    printf("\nfine_riga->next->inf= %d\n",fine_riga->next);
    }
    else if(i==7)
    {
    printf("\nSto inserendo il 7 elemento\n");
    inizio_riga=p;
    inizio_riga->giu=(struct elemento*)malloc(sizeof(struct elemento));
    inizio_riga->giu->su=inizio_riga;
    printf("\nmmmm\n");
    inizio_riga = inizio_riga->giu;
    //printf("\n Dopo il punt=punt->next Stampa il punt: %d", punt);
    printf("\nInserisci il %d elemento: ", i);
    scanf("%d", &inizio_riga->inf);
    printf("\ninizio_riga->su->inf= %d\n",inizio_riga->su->inf);
    //inizio_riga->prev=NULL;
    punt=inizio_riga;

    }
    else if(i>=8 && i<=11)
    {
    printf("\nSto inserendo l 8 elemento\n");
    printf("\ninizi_riga->inf= %d\n",inizio_riga->inf);
    //punt=inizio_riga;
    printf("\npunt->inf= %d\n",punt->inf);
    punt->next=(struct elemento*)malloc(sizeof(struct elemento));
    printf("\npunt->inf= %d\n",punt->inf);
    printf("\nPrima del punt->next->prev->inf= %d\n",punt->next->prev->inf);
    punt->next->prev=punt;
    printf("\nDopo del punt->next->prev->inf= %d\n",punt->next->prev->inf);
    /* printf("\npunt->su->inf= %d\n",punt->su->inf);
    printf("\nPrima del punt->su->giu->inf= %d\n",punt->su->giu->inf);
    punt->su->giu=punt;
    printf("\nDopo del punt->su->giu->inf= %d\n",punt->su->giu->inf);*/
    punt=punt->next;
    //printf("\n Dopo il punt=punt->next Stampa il punt: %d", punt);
    printf("\nInserisci il %d elemento: ", i);
    scanf("%d", &punt->inf);
    printf("\npunt->inf= %d\n",punt->inf);
    //punt->su=punt;
    printf("\npunt->prev->inf= %d\n",punt->prev->inf);
    //printf("\npunt->su->inf= %d\n",punt->su->inf);
    }



    } // chiudo il for
    punt->next = NULL; // marcatore fine lista
    } // chiudo l'if-else
    return(p);
    }

    ecco fatto ora qndo spingo invia risposta non so se me lo mette tutto daccapo ma mi sa di si,cmq le parentesi sono giuste

  6. #6
    Purtroppo, non credo sia giusto fornirti la soluzione del tuo compito. Però, sono dell'idea che una scintilla può accendere un grande fuoco
    Quindi, io ti consiglio di procedere così:
    1) quando programmi indenta, indenta, indenta;
    2) se una funzione crea qualcosa le domande le fai nel main e non nella funzione
    3) se devi creare una matrice quadrata o rettangolare che sia ti serve un doppio loop:
    codice:
    #include <stdlib.h>
    #include <stdio.h>
    
    struct elemento{
    	struct elemento *prev;
    	struct elemento *su;
    	int inf;
    	struct elemento *next;
    	struct elemento *giu;};
    
    struct elemento* crea_scacchiera(int N){
    	struct elemento* p, precedente,successivo,sotto,sopra;
    	int i,j;
    	if(N==0) p = NULL;
    	else {
    		for (i=0;i<N;i++){
    			for (j=0;j<N;j++){
    				p = (struct elemento*)malloc(sizeof(struct elemento));
    				if (i==0) p->prev = NULL;
    				if (j==0) p->su   = NULL;
    				
    // adesso continua tu. Altrimenti non ti eserciti :)				
    			}
    		}
    	} // chiudo l'if-else
      return p;
    }
    
    int main(){
    int n;
    	struct elemento*  inizio;
    	printf("\n Specificare la dimensione della scacchiera: ");
    	scanf("%d", &n);
    	inizio = crea_scacchiera(n);
    	return 0;
    }
    Fai un'altro tentativo e se ti blocchi provo a darti dell'altro fuoco. CIao

  7. #7
    Inanzitutto grazie tantissimo per le risposte e grazie soprattutto per i consigli e soprattutto per il fatto che non mi stai dando la soluzione finale ma mi stai portanto a piccoli passi cmq io ho continuato in questo modo ma non si trova te la posto:

    for (i=0;i<n;i++)
    {
    for (j=0;j<n;j++)
    {
    p = (struct elemento*)malloc(sizeof(struct elemento));
    if (i==0)
    p->prev = NULL;
    if (j==0)
    p->su = NULL;
    printf("\nInserisci il primo valore: ");
    scanf("%d", &p->inf);
    puntcorr = p;
    while(j<=n)
    {
    puntcorr->next = (struct elemento *)malloc(sizeof(struct elemento));
    puntcorr->next->prev=puntcorr;
    puntcorr = puntcorr->next;
    printf("\nInserisci il %d elemento: ", i);
    scanf("%d", &puntcorr->inf);
    j++;
    } // chiudo il while
    if(i==1)
    sotto=p;
    sotto->prev=NULL;
    sotto->su=p;
    while(j<=n)
    {
    sotto->next = (struct elemento *)malloc(sizeof(struct elemento));
    sotto->next->prev=sotto;
    sotto = sotto->next;
    printf("\nInserisci il %d elemento: ", i);
    scanf("%d", &sotto->inf);
    j++;
    } // chiudo il while
    puntcorr->next = NULL; // marcatore fine riga-lista
    }
    }
    } // chiudo l'if-else
    return(p);
    } // chiudo la funzione[CODE]

    ps ma come devo fare per metterlo sotto forma di codice??

  8. #8
    Scusa se mi ripeto, ti invito ad indentare il codice. Indenta, indenta, indenta.
    Poi la regola per postare il codice e mettere all'inizio CODE tra parentesi quadre e alla fine /CODE sempre tra parentesi quadre.
    http://clessonsonline.blogspot.com

  9. #9
    codice:
    for (i=0;i<n;i++)
     {
          for (j=0;j<n;j++)
         {
               p = (struct elemento*)malloc(sizeof(struct elemento));
               if (i==0) 
                   p->prev = NULL;
               if (j==0) 
                   p->su = NULL;
                printf("\nInserisci il primo valore: ");
                scanf("%d", &p->inf);
               puntcorr = p;
               while(j<=n)
              {
                     puntcorr->next = (struct elemento *)malloc(sizeof(struct elemento));
                     puntcorr->next->prev=puntcorr;
                     puntcorr = puntcorr->next;
                     printf("\nInserisci il %d elemento: ", j);
                     scanf("%d", &puntcorr->inf);
                      j++;
               } // chiudo il while
             if(i==1)
              {
                   sotto=p;         
                   sotto->su=p;
                   while(j<=n)
                   {
                            sotto->next = (struct elemento *)malloc(sizeof(struct elemento));
                            sotto->next->prev=sotto;
                            sotto = sotto->next;
                            printf("\nInserisci il %d elemento: ", j);
                            scanf("%d", &sotto->inf);
                              j++;
                     } // chiudo il while
                puntcorr->next = NULL; // marcatore fine riga-lista
              }
          }
     } // chiudo l'if-else
     return(p);
     } // chiudo la funzione

  10. #10
    Bene. Una indentazione da due caratteri è più che sufficiente. Altrimenti, il codice diventa illeggibile.
    Comunque, facciamo un altro passo. Innanzitutto, scomponiamo il problema in:
    creazione scacchiera;
    inizializzazione scacchiera;
    Due procedure, insomma.
    Per risolvere il primo problema, ovvero della sola creazione della scacchiera vuota, ci dobbiamo porre la domanda: " vogliamo una soluzione efficiente in termini di spazio di memoria occupato o in termini di tempo di esecuzione?
    Se scegliamo la seconda strada, abbiamo bisogno di una memoria degli elementi che abbiamo creato nella riga o colonna precedente.
    Ad esempio, se scegliamo di procedere per righe, abbiamo bisogno di una array di puntatori che punti agli elementi della riga precedente o al di sopra della corrente, tipo questa:
    codice:
    struct elemento *sopra[N];
    Ti dice qualcosa quest'indicazione?
    http://clessonsonline.blogspot.com

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 © 2025 vBulletin Solutions, Inc. All rights reserved.