Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Problema su semplice uso liste in C

    Ragazzi vorrei rivolgere la vostra attenzione su questo programma C ke utilizza le liste...

    //Si definisca la struttura dati CharElem per realizzare 1 lista doppiamente concatenata i cui elementi sono caratteri. Si scriva poi una funzione che, presi due puntatori C e D a CharElem, rappresentanti due liste di caratteri aventi la stessa lunghezza, restituisca la stringa ottenuta concatenando in maniera alternata un carattere preso da C e uno da D. In particolare, C deve essere scandita dal primo elemento all'ultimo mentre D dall'ultimo elemento al primo.

    X esempio, se
    C a--b--c--d
    D e--f--g--h
    la stringa risultante deve essere ahbgcfde

    Io lo realizzato cosi'

    Typedef struct dat
    {
    char a;
    struct dati *p,*d;
    } charelem;

    char *primoc=null, *ultimod=null;

    char *funzione (charelem *c, charelem *d)
    {

    char *stringa; unsigned i;
    i=0;
    for(c=primoc;c;c=c-)d)
    {
    *(stringa+i)=c-)a;
    i+=2;
    }
    i=1;
    for(d=ultimod;d;d=d-)p)
    {
    *(stringa+i)=d-)a;
    i+=2;
    }
    return stringa;
    }
    }

    scusate la poca leggibilita'....mi piacerebbe discutere in maniera principale della logica con cui dovrebbe essere realizzato un programma simile...

  2. #2
    Sinceramente da quello che ho capito il problema è questo:

    NULL <--> A <--> B <--> C <--> D <--> E <--> F <--> G <--> H <--> NULL

    Questa è la lista.

    Io devo prendere due puntatori agli elementi di questa lista.

    P1 e P2 che puntano rispettivamente a "B" e a "F", in più un numero che mi dica quanti elementi sucessivi devono avere.
    Quindi il prototipo della funzione può essere tranquillamente:

    codice:
    char *f (CharElem *p1, CharElem *p2, int n);
    Adesso basta che fai due controlli per vedere se per ogni puntatore, si possano acquisire gli n elementi sucessivi, cioè se n non superi il limite di elementi.
    Poi scorri da una parte, scorri dall'altra..e concateni ogni carattere con la sua stringa rispettiva, cosi da crearne 2 diverse.
    Poi rifai il procedimento per queste due, e ritorni la stringa.

    Non mi ricordo se esiste una funzione per convertire da char a char *, ma mi pare di nò.
    Comunque in questo modo dovrebbe funzionare lostesso:

    codice:
    sprintf (s, "%c", p1 -> elemento);
    Dove s è una stringa (char *), mentre "p -> elemento" è un carattere (char) che naturalmente è il tipo di elemento contenuto nella tua lista.

  3. #3
    In pratica ci sono 2 liste C e D doppiamente concatenate dove gli elemento sono lettere (penso gia' presenti nelle 2 liste)

    devo realizzare 1 funzione ke ritorna 1 stringa ke restituisca in alternanza 1 lettera di C e 1 di D con D ke parte dall'ultimo elemento e C dal primo.

    Dai, ragà!!!!

    ps grazie della risp precedente la studiero'

  4. #4
    Originariamente inviato da Michele Facchin
    Sinceramente da quello che ho capito il problema è questo:

    NULL <--> A <--> B <--> C <--> D <--> E <--> F <--> G <--> H <--> NULL

    Questa è la lista.

    Io devo prendere due puntatori agli elementi di questa lista.

    P1 e P2 che puntano rispettivamente a "B" e a "F", in più un numero che mi dica quanti elementi sucessivi devono avere.
    Quindi il prototipo della funzione può essere tranquillamente:

    codice:
    char *f (CharElem *p1, CharElem *p2, int n);
    Adesso basta che fai due controlli per vedere se per ogni puntatore, si possano acquisire gli n elementi sucessivi, cioè se n non superi il limite di elementi.
    Poi scorri da una parte, scorri dall'altra..e concateni ogni carattere con la sua stringa rispettiva, cosi da crearne 2 diverse.
    Poi rifai il procedimento per queste due, e ritorni la stringa.

    Non mi ricordo se esiste una funzione per convertire da char a char *, ma mi pare di nò.
    Comunque in questo modo dovrebbe funzionare lostesso:

    codice:
    sprintf (s, "%c", p1 -> elemento);
    Dove s è una stringa (char *), mentre "p -> elemento" è un carattere (char) che naturalmente è il tipo di elemento contenuto nella tua lista.
    1. In 1 lista il puntatore al primo elemento e' sempre necessario vero?

    2. Scandendo dal primo all'ultimo basta controllare quando il valore dell'elemento e' NULL ma se controllo dall'ultimo al primo come faccio a terminare il ciclo dopo ke e' arrivato ha scandire il primo elemento?

  5. #5

    liste in C

    domande....

    1. In 1 lista il puntatore al primo elemento e' sempre necessario vero?

    2. Scandendo dal primo all'ultimo basta controllare quando il valore dell'elemento e' NULL ma se controllo dall'ultimo al primo come faccio a terminare il ciclo dopo ke e' arrivato ha scandire il primo elemento?

    grazie dei futuri aiuti

  6. #6
    1: Si, sennò come fai a sapere in che area di memoria è la lista?

    2: Essendo una lista a doppi puntatori, se punt -> succ equivale a NULL significa che hai raggiunto l'ultimo elemento della lista, se invece punt -> prec uguale a NULL allora sei nel primo elemento della lista.

  7. #7
    Originariamente inviato da Michele Facchin
    1: Si, sennò come fai a sapere in che area di memoria è la lista?

    2: Essendo una lista a doppi puntatori, se punt -> succ equivale a NULL significa che hai raggiunto l'ultimo elemento della lista, se invece punt -> prec uguale a NULL allora sei nel primo elemento della lista.
    Perfetto! quindi se io devo realizzare 1 funzione sulla lista non e' compito mio prevedere i puntatore alla lista vero?

    grazie mille dell'aiuto

  8. #8
    No, ma se il problema dice che vengono presi due puntatori a caso in questa lista allora il tuo compito è prevedere questi due puntatori,e inserirli come parametri della funzione.

    Il programma originale avrebbe un puntatore che di solito punta alla testa della lista.

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.