Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2003
    Messaggi
    150

    [C] Array di strutture a puntatore

    Salve avrei bisogno di un aiuto ......nel mio programma scritto in devc ho le seguenti dichiarazioni di struttura:

    codice:
    typedef struct nodo {       
                          int Number;
                          char String[255];
                          struct nodo *Next;
                        } NODO;
    
    typedef struct index {       
                          NODO *Head;
                          NODO *Tail;
                        } INDEX;
    Dove INDEX rappresenta una struttura che mi mantiene il punatore alla testa e alla coda di una struttura "coda" (scusate il gioco di parole). Adesso vorrei realizzare un array di strutture di tipo INDEX quindi nel main ho dichiarato semplicemente :

    INDEX Prova[NUMEROELEMENTI];

    Ma il mio dubbio è ...se voglio accedere ai campi Head e Tail di una generica posizione dell'array come faccio ?? Ho provato con

    Prova.Head = valore;

    e sembra funzionare ma poi invece nn funziona nulla.
    Inoltre ho delle funzioni che effettuano l'accodamento e l'estrazione dei valori dalla struttura queste funzioni accettano i segunti parametri

    void Enqueue ( NODO** , NODO** , int , char* );
    int Dequeue ( NODO** , NODO** , int* , char* );

    i primi due sono i puntatori alla etsta e alla coda i restanti valori i parametri da inserire in ogni nodo ...
    Come dovreiu passare dal main i valori alla funzione affinchè tutot funzioni bene ?

    Grazie a tutti e scusate se mi sono dilungato....
    Carlo Carbone

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Allora...
    Innanzitutto, data la struttura che hai a disposizione, la creazione di un array di strutture INDICE si realizza in questo modo:
    codice:
    INDEX indice[10];   /* Qui ho l'array di strutture */
    
    indice[0].Head = (NODO *) malloc(sizeof(NODO));
    indice[0].Head->Number = 10;
    strcpy(indice[0].Head->String, "Nodo testa");
    indice[0].Tail = (NODO *) malloc(sizeof(NODO));
    indice[0].Tail->Number = 20;
    strcpy(indice[0].Tail->String, "Nodo coda");
    Le ultime sei righe di codice servono a valorizzare il primo elemento dell'array: viene creato un NODO testa e un NODO coda e questi due vengono valorizzati con un intero e una stringa per ciascuno.

    Ovviamente la cosa ha un senso se esiste una serie di code (realizzata tramite una serie di valorizzazioni di NODO) e ciascun elemento dell'array indice punta alla head e alla tail di una particolare coda.

    Sinceramente, però, non ho capito il prototipo delle due funzioni: se la funzione Enqueue serve per aggiungere un elemento alla coda dovrebbe prendere solamente un puntatore alla testa di una coda, un intero e la stringa da assegnare. Il parametro relativo alla tail sarebbe un po' inutile. Inoltre vedo che entrambe le funzioni prendono come parametri dei puntatori a puntatori: praticamente ciascuna delle funzioni prende in ingresso un array di code (anzi due array, il secondo ricordo che è inutile), un intero e una stringa... Un po' contorta come cosa... a meno che non si debbano aggiornare tutte le code con lo stesso valore (sia incremento che decremento...).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Errata corrige: ho dimenticato una cosa essenziale nella valorizzazione dei nodi testa e coda.
    codice:
    indice[0].Head = (NODO *) malloc(sizeof(NODO));
    indice[0].Head->Number = 10;
    indice[0].Head->Next = NULL;
    strcpy(indice[0].Head->String, "Nodo testa");
    indice[0].Tail = (NODO *) malloc(sizeof(NODO));
    indice[0].Tail->Number = 20;
    indice[0].Tail->Next = NULL;
    strcpy(indice[0].Tail->String, "Nodo coda");
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2003
    Messaggi
    150
    codice:
    for ( i = 0 ; i < NUM_AUTO ; i++ )
      {
        rvalue = rand() % NUM_INCROCI;  
        if ( Incroci[rvalue].Head == NULL && Incroci[rvalue].Tail == NULL )
        {
          Enqueue(Incroci[rvalue].Head,Incroci[rvalue].Tail,priority,"nulla");       
          priority++;     
        }
        else
          Enqueue( Incroci[rvalue].Head,Incroci[rvalue].Tail,0,"nulla");
      }
    E come passo adesso head e tail alla funzione enqueue ?
    codice:
    void Enqueue ( NODO **Head , NODO **Tail , int Number , char String[])
    {
      NODO *Tmp;                                               /* NODO TEMPORANEO */
      
      Tmp  = (NODO*) malloc (sizeof(NODO));     /* CREAZIONE DEL NODO DA INSERIRE */
      Tmp->Number = Number;
      strcpy( Tmp->String , String);
      Tmp->Next = NULL;
    
      if ( *Tail == NULL )                          /* ACCODAMENTO DEL NUOVO NODO */   
      {
        *Tail = Tmp;
        *Head = Tmp;
      }
      else
      {
        (*Tail)->Next = Tmp;
        *Tail =Tmp;
      }
    }
    Carlo Carbone

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