Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2006
    Messaggi
    7

    C puntatori a liste per passaggio di parametri

    Salve ho dei problemi con i puntatori per realizzare la procedura

    # include<stdio.h>
    # include<stdlib.h>
    # include<time.h>
    # include<string.h>

    /*
    STRUTTURA DATI CHE IMPLEMENTA I TRENI MERCI
    */
    struct listaTreniMerci2 {
    char nome[40];
    char sequenza[40];
    struct listaTreniMerci2 *next;
    };

    /*
    PUNTATORE ALLA LISTA CONTENTE I TRENI
    */
    struct listaTreniMerci2 *treniMerci2;

    /*
    Funzione inserisci
    Questa funzione inserisce nella lista dei treni un nuovo treno, il cui nome e
    la cui struttura sono definiti dalla stringa passata in input, restituendo il
    puntatore alla lista dei treni.
    Nel caso sia già presente un treno dello stesso nome di quello passato dalla
    stringa di input non viene compiuta alcuna operazione.
    */
    struct listaTreniMerci2 *inserisci(char *alfa, char *w, struct listaTreniMerci2 *tmp){
    struct listaTreniMerci2 *p1, *p2, *t;
    t=(struct listaTreniMerci2 *)malloc(sizeof(struct listaTreniMerci2));
    strcpy(t->nome, alfa);
    strcpy(t->sequenza, w);
    /*ordina_seq(w, t->sequenza);*/
    t->next=NULL;
    if (tmp == NULL)
    return(t);
    p1=tmp;
    p2=tmp;
    while (p1 != NULL && (strcmp(p1->nome, alfa) != 0)) {
    if (strcmp(p1->sequenza, w) > 0) {
    if (p1 == tmp) {
    t->next=p1;
    tmp=t;
    return(tmp);
    }
    else {
    while (p2->next != p1)
    p2=p2->next;
    t->next=p1;
    p2->next=t;
    return(tmp);
    }
    }
    else
    p1 = p1->next;
    }
    if (p1 == NULL){
    while(p2->next != NULL)
    p2=p2->next;
    p2->next=t;
    }
    return(tmp);
    }

    /*
    Procedura stampatreni
    Stampa tutti i treni inseriti in ordine lessicografico secondo la sequenza dei
    vagoni.
    */

    void stampatreni() {
    struct listaTreniMerci2 *tmp;
    if (treniMerci2 == NULL) {
    printf(">Non sono presenti treni! \n");
    return;
    }

    tmp = treniMerci2;
    printf("> (\n");
    while (tmp != NULL ) {
    printf("> %s", tmp->nome);
    printf(": %s\n", tmp->sequenza);
    tmp = tmp-> next;
    }
    printf("> )\n");
    }

    /*
    Funzione somiglianza
    Stampa il grado di somiglianza dei treni di nome alfa e beta.
    */
    int somiglianza(char * alfa, char *beta){
    struct listaTreniMerci2 *tmp1/*, *tmp2*/;
    int result=0;
    int i;
    char alfatmp[40], betatmp[40];
    char *p1= alfatmp;
    char *p2= betatmp;

    if (treniMerci2 == NULL) {
    printf(">Non sono presenti treni! \n");
    return;
    }
    tmp1=treniMerci2;
    /*tmp2=treniMerci2;*/

    while(tmp1 != NULL &&(strcmp(tmp1->nome,alfa) !=0)){
    tmp1=tmp1->next;
    }
    for(i=0;i<strlen(tmp1->sequenza);i++) {
    *p1++ = tmp1->sequenza[i];
    }

    while(tmp1 != NULL &&(strcmp(tmp1->nome, beta)!=0)){
    tmp1=tmp1->next;
    }
    for(i=0;i<strlen(tmp1->sequenza);i++) {
    *p2++ = tmp1->sequenza[i];
    }

    *p1 = '\0';
    *p2 = '\0';
    int max;
    int a = strlen(alfatmp);
    int b = strlen(alfatmp);
    if (a==b)
    max = a;
    else if (a>b)
    max=b;
    else max=a;


    for (i=0;i<max;i++) {
    if ((alfatmp[i]==betatmp[i])){
    result++;
    }}
    return result;
    /*printf("> %d\n", result);*/
    }

    /*
    Procedura stampasomiglianza
    Stampa in ordine lessicografico secondo le sequenze di vagoni tutti i treni
    che hanno grado di somiglianza n con alfa, come nome del treno.
    */
    void stampasomiglianza(char *alfa, int n){
    struct listaTreniMerci2 *tmp1;

    if (treniMerci2 == NULL) {
    printf(">Non sono presenti treni! \n");
    return;
    }

    tmp1=treniMerci2;

    while(tmp1 != NULL)
    tmp1->next;

    if((strcmp(tmp1->nome, alfa)!=0)&&(n!=somiglianza(tmp1->nome, alfa))) {

    printf("Nessun treno ha somiglianza %d", n);
    printf(" con %s\n", alfa);*/
    }
    else {
    printf("> %s", tmp1->nome);
    printf(" %s\n", tmp1->sequenza);
    }


    void scegliFunzione(){

    char alfa[40], beta[40], w[40];
    int n, valore_somiglianza;
    char tastoScelto;
    char c;
    scanf("%c", &c);
    while (c != 'f') {
    switch(c){
    case 'i': scanf("%s", &alfa);
    scanf("%s", &w);
    treniMerci2=inserisci(alfa, w, treniMerci2);
    scanf("%c", &tastoScelto);
    break;

    case 's': stampatreni();
    scanf("%c", &tastoScelto);
    break;
    case 'S': scanf("%s", &alfa);
    scanf("%d", &n);
    stampasomiglianza(alfa, n);
    scanf("%c", &tastoScelto);
    break;
    case 'm': scanf("%s", &alfa);
    scanf("%s", &beta);
    valore_somiglianza=somiglianza(alfa, beta);
    printf("> %d\n", valore_somiglianza);
    scanf("%c", &tastoScelto);
    break;

    }
    scanf("%c", &c);
    }
    return;
    }

    /*
    Funzione main
    La funzione principale del programma che inizializza i puntatori alle liste e
    invoca la procedura scegliFunzione.
    */
    int main(){
    treniMerci2 = (struct listaTreniMerci2 *)malloc(sizeof(struct listaTreniMerci2));
    treniMerci2 = NULL;
    scegliFunzione();
    return 0;
    }
    dalla procedura stampa stampasomiglianza dovrei ottenere se la condizione
    n!=somiglianza(tmp1->nome, alfa) fosse vera, scandendo l'elenco di tutti i treni della lista, che in output siano stampati tutti i treni con somiglianza uguale all'intero n con il treno di nome alfa.
    cioè dato in input
    i alfa AAPP
    i beta AAS
    i gamma AAP
    S alfa 2
    dovrei ottenere
    > beta AAS
    i>gamma AAP
    ma il mio input mi da
    >alfa AAPP
    quindi capisco che nn riesco a far puntare giusto il puntatore

    oltretutto la funzione somiglianza, dati in input due nomi torna correttamente il numero della somiglianza tra le sequenze di 2 treni alla volta,quindi il problema sta nel come passo i parametri a questa funzione e di come far sì che siano ad essa passati ad uno ad uno tutti i treni, e se almeno uno ha somiglianza con alfa = n allora devo stampare il nome e la sequenza di quest'ultimo.
    qualcuno può aiutarmi.
    grazie

  2. #2
    Nessun programmatore guarderà mai il tuo codice ...
    Usa l'indentazione e top-down quanto più possibile
    Experience is what you get when you don’t get what you want

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    E poi ti avevo gia' risposto ... perche' hai riproposto lo stesso quesito ?

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296

    Moderazione

    Se ne sta già parlando qui.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

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.