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

    [C] Problema inserimento in una lista

    ciao a tutti, è il mio primo post su questo forum, vi voglio porre un problema che ho con questo programma :/ ci sto sbattendo da un po' .
    Non riesco a capire perchè non funziona la funzione di inserimento nella lista, inoltre nel do while del main ho messo la condizione di uscita con un && che però non viene considerata perchè esce dal ciclo anke se questa condizione viene rispettata (forse || risolverebbe il problema???)!!
    vi inserisco il testo del programma, così se avete voglia e tempo potrete aiutarmi
    grazie...

    codice:
    /* Scrivere un semplice editor di linea. Conservare l'intero testo in una lista concatenata, una */
    /* linea per ciascun nodo. Iniziare il programma con il comando EDIT file, dopo di che appare */
    /* un prompt insieme al numero di riga. Se viene inserita la lettera I seguita da un numero n, */
    /* allora il testo che segue va inserito prima della riga n. Se I non è seguita da un numero, */
    /* allora il testo va inserito prima della riga attuale. Se viene inserita D con due numero n ed m, */
    /* un solo numero n oppure nessun numero, allora bisogna eliminare rispettivamente le righe da */
    /* n ad m, le riga n oppure la riga attuale. Fare lo stesso con il comando L, che richiede la */
    /* visualizzazione di righe. Se viene inserita A, allora il testo va aggiunto alle righe esistenti. */
    /* Inserendo E il programma termina, salvando il testo in un file. */
    
    /* Inclusione librerie */
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <conio.h>
    
    /* Definizione costanti */
    #define MAX_FRASE_SIZE 100 /* Massimo numero di caratteri per la frase da inserire in ogni nodo */
    
    /* Struttura della lista */
    typedef struct list_node *list_pointer;
    typedef struct list_node {
    char frase[MAX_FRASE_SIZE];
    list_pointer link;
    }lista;
    
    /* Puntatore al file */
    FILE *fp;
    
    /* Prototipi funzioni */
    void inserisci(list_pointer *, int , char *);
    void cancella(list_pointer *, int , int );
    void visualizza(list_pointer , int , int );
    void leggi_file(list_pointer *, int );
    void salva_file(list_pointer );
    void insert_nodo(list_pointer *, list_pointer , int *);
    
    
    
    main()
    {
    
        int linea=1,n=0,m=0;
        char word[MAX_FRASE_SIZE];
        list_pointer testa=NULL; /* Testa della lista NULL poichè non ancora allocato spazio in memoria */
    
        printf("\n\t\t\t\tEDITOR DI LINEA\n");
    
        /* Visualizzazione file */
        leggi_file(&testa,linea);
    
        do
        {
    
    
            printf("%d>", linea);
            fflush(stdin);
            scanf("%[^\n]s", &word);
    
            switch(word[0])
            {
    
                case 'E':
                    if(word[1]!='\0')
                    {
                        inserisci(&testa,n,word);
                        linea++;
                        salva_file(testa);
                    }
    
                    if(word[1]=='\0')
                    {
                        salva_file(testa);
                        exit(1);
                    }
                break;
    
                case 'I':
                    if(word[1]=='\0')
                    {
                        inserisci(&testa,n,word);
                        linea++;
                    }
    
                    if(word[1]==' ' && word[3]=='\0')
                    {
                        n=word[2]-'0';
                        inserisci(&testa,n,word);
                        linea++;
                    }
                    else
                    {
                        inserisci(&testa,n,word);
                        linea++;
                    }
                    salva_file(testa);
                break;
    
                case 'D':
                    if(word[1]=='\0')
                    {
                        cancella(&testa,n,m);
                        linea--;
                    }
    
                    if(word[1]==' ' && word[3]=='\0')
                    {
                        n=word[2]-'0';
                        cancella(&testa,n,m);
                        linea=linea-n;
                    }
    
                    if(word[1]==' ' && word[3]==' ' && word[5]==' ')
                    {
                        n=word[2]-'0';
                        m=word[4]-'0';
                        cancella(&testa,n,m);
                        linea=linea-(n+m);
                    }
                    salva_file(testa);
                break;
    
                case 'L':
                    if(word[1]=='\0')
                        visualizza(testa,n,m);
    
                    if(word[1]==' ' && word[3]=='\0')
                    {
                        n=word[2]-'0';
                        visualizza(testa,n,m);
                    }
    
                    if(word[1]==' ' && word[3]==' ' && word[5]==' ')
                    {
                        n=word[2]-'0';
                        m=word[4]-'0';
                        visualizza(testa,n,m);
                    }
                break;
    
                default:
                    inserisci(&testa,n,word);
                    linea++;
                    salva_file(testa);
                break;
    
    
                }
            n=0;m=0;
        }
        while((word[0]!='E') && (word[1]!='\0'));
    
        fflush(stdin);
        getchar();
    }
    
    
    /* Funzione di inserimento nuova frase nella lista */
    void inserisci(list_pointer *testa, int n, char word[])
    {
        list_pointer temp,aux=*testa;
        int line=1;
    
    
        /* Se si inserisce I seguita da un numero */
        if(word[0]=='I' && word[1]==' ' && word[2]-'0'==n)
        {
            temp=(list_pointer)malloc(sizeof(lista));
            printf("%d>", n);
            fflush(stdin);
            scanf("%[^\n]s", &temp->frase);
    
            while(line<=n && aux)
            {
                aux=aux->link;
                line++;
            }
            if(aux)
            {
                temp->link=aux->link;
                aux->link=temp;
            }
        }
    
    
        /* Se si inserisce I seguita da nessun numero */
        if(word[0]=='I' && word[1]=='\0')
        {
            if(aux)
            {
                while(aux->link)
                {
                    line++;
                    aux=aux->link;
                }
                temp=(list_pointer)malloc(sizeof(lista));
                printf("%d>", line);
                fflush(stdin);
                scanf("%[^\n]s", &temp->frase);
                temp->link=aux->link;
                aux->link=temp;
            }
        }
    
    
        /* Se si inserisce qualsiasi frase */
        if(((word[0]=='I' && n!=word[2]-'0' && word[1]!='\0') || (word[0]=='A' && word[1]!='\0') || (word[0]!='I') || (word[0]!='A')))
        {
            temp=(list_pointer)malloc(sizeof(lista));
            strcpy(temp->frase,word);
            if(aux)
            {
                while(aux->link)
                    aux=aux->link;
                temp->link=NULL;
                aux->link=temp;
            }
            else
            {
                temp->link=NULL;
                aux=temp;
            }
        }
    
    /* O(n) */
    }
    
    
    /* Funzione di cancellazione nodi dalla lista */
    void cancella(list_pointer *testa, int n, int m)
    {
    
    }
    
    
    /* Funzione che copia il file nella lista */
    void leggi_file(list_pointer *testa, int linea)
    {
        list_pointer temp;
    
        fp = fopen("editor.txt","r");
    
        if(fp)
        {
            rewind(fp);
            while(!feof(fp))
            {
                temp=(list_pointer)malloc(sizeof(lista));
                fscanf(fp,"%s\n", temp->frase);
                insert_nodo(testa,temp,&linea);
            }
            fclose(fp);
        }
    } /* O(n) */
    
    
    /* Funzione di inserimento della frase nel nodo della lista */
    void insert_nodo(list_pointer *testa, list_pointer temp, int *linea)
    {
        list_pointer aux;
    
        if(*testa)
        {
            (*testa)->link=temp;
            temp->link=NULL;
        }
        else
        {
            temp->link=NULL;
            (*testa)=temp;
            return;
        }
    
        aux=*testa;
    
        while(aux)
        {
            *linea++;
            aux=aux->link;
        } /* O(n^2) */
    }
    
    
    /* Funzione di salvataggio della lista nel file */
    void salva_file(list_pointer testa)
    {
        if(testa)
        {
            fp = fopen ("editor.txt","w");
            rewind(fp);
    
            while(testa)
            {
                fprintf(fp,"%s\n",testa->frase);
                testa=testa->link;
            }
        }
    } /* O(n) */
    
    
    /* Funzione di visualizzazione della lista */
    void visualizza(list_pointer testa,int n, int m)
    {
        int linea=1,i;
        list_pointer aux=testa;
    
        if(n==-1) /* se n=-1 visualizza solo la linea attuale */
        {
            while(aux)
            {
                linea++;
                aux=aux->link;
            }
            printf("\n%d> %s", linea, aux->frase);
        }
    
        else if(n!=-1 && m==-1) /* se è inserito solo n allora visualizza solo la linea n */
        {
            while(linea!=n && aux)
            {
                linea++;
                aux=aux->link;
            }
            printf("\n%d> %s", linea, aux->frase);
        }
    
        else if(n!=-1 && m!=-1) /* se n ed m sono diversi da 0 allora visualizza le linee da n ad m */
        {
            while(linea!=n && aux)
            {
                linea++;
                aux=aux->link;
            }
            for(i=n;i<=m && aux;i++)
            {
                printf("\n%d> %s", linea, aux->frase);
                aux=aux->link;
            }
        }
    }

  2. #2
    Io, fossi in te, mi rivederei le precedenze tra gli operatori in C e poi inserirei manciate di parentesi qua e la per addomesticare le espressioni logiche.
    Poi, fai tu
    http://clessonsonline.blogspot.com

  3. #3
    con l'or al posto dell'and sembra funzionare, sicuramente ho fatto confusione, ma rimane il problema dell'inserimento a cosa servirebbe inserire più parentesi? io credo che il problema sia nella funzione di inserimento

  4. #4
    le parentesi servono a sottomettere le precedenze tra gli operatori alla nostra volontà. Ciao
    http://clessonsonline.blogspot.com

  5. #5
    fin lì ci arrivavo non capisco l'utilità di aggiungerne altre in questo pezzo di codice ciao

  6. #6
    Alcuni commenti in ordine sparso:
    1)Questa riga di codice, come altre sparse nel tuo programma:
    codice:
    if(((word[0]=='I' && n!=word[2]-'0' && word[1]!='\0') || (word[0]=='A' && word[1]!='\0') || (word[0]!='I') || (word[0]!='A')))
    merita qualche parentesi in più per evitare che le precedenze tra gli operatori prendano il sopravvento sulla tua volontà.

    2)Non capisco cosa volevi fare in questa funzione:
    codice:
    void insert_nodo(list_pointer *testa, list_pointer temp, int *linea)
    {
        list_pointer aux;
    
        if(*testa)
        {
            (*testa)->link=temp;
            temp->link=NULL;
        }
        else
        {
            temp->link=NULL;
            (*testa)=temp;
            return;
        }
    
        aux=*testa;
    
        while(aux)
        {
            *linea++;
            aux=aux->link;
        } /* O(n^2) */
    }
    soprattutto qui:
    codice:
        aux=*testa;
    
        while(aux)
        {
            *linea++;
            aux=aux->link;
        }
    3)Infine mi riguarderei tutti gli if. Ad esempio:

    codice:
                case 'I':
                    if(word[1]=='\0')
                    {
                        inserisci(&testa,n,word);
                        linea++;
                    }
    
                    if(word[1]==' ' && word[3]=='\0')
                    {
                        n=word[2]-'0';
                        inserisci(&testa,n,word);
                        linea++;
                    }
                    else
                    {
                        inserisci(&testa,n,word);
                        linea++;
                    }
                    salva_file(testa);
    Poiché se word[1] è uguale a '\0' il blocco
    codice:
                    {
                        inserisci(&testa,n,word);
                        linea++;
                    }
    può, facilmente, essere eseguito due volte: una volta quando è vero il primo if e un'altra volta quando fallisce il secondo if. Questo tipo di insufficiente valutazione dei possibili casi di input rende il tuo programma non corretto e/o poco robusto. Essendo la robustezza, nel caso del software, la capacità di avere un comportamento predicibile anche in presenza di valori di ingresso diversi da quelli attesi.

    Prova ad adottare la tecnica degli antichi romani: "Divide et impera". Ovvero scomponi il problema in sotto problemi e risolvili uno per uno e poi rimonta tutto insieme. Parti la gestione delle liste. Creati delle funzioni di inserimento e cancellazione che funzionino a "prova di bomba". Poi, sviluppa la leggifile e poi vai avanti. Vedrai che verrà un bel programmino
    http://clessonsonline.blogspot.com

  7. #7
    Grazie per le dritte secondo te è meglio se lo riprogrammo da capo? perchè ora che mi hai fatto notare gli errori mi rendo conto che la struttura è poco solida e abbastanza confusa...un'altra cosa ti voglio chiedere, alla funzione di inserimento gli passo il puntatore dell'inizio della lista, se il nodo che devo inserire è per esempio a metà della lista come faccio a inserirmi tra i due nodi? Perchè sto notando che questo programma non lo fa!!!

  8. #8
    Scusa se sono ripetitivo, d'altra parte è un sintomo tipico dell'età avanzata insieme alla sordità e la vista corta , ma secondo me devi farti prima un po le ossa sulle liste.
    Progetta e realizza le funzioni di base per gestire una lista semplice collegata (va bene anche se le copi da internet. Devi studiarle bene e capire quello che fanno). Quando hai capito come funzionano le liste e, soprattutto i puntatori e i passaggi di puntatori by reference e by value, il tuo esercizio si risolverà quasi magicamente.
    Insomma, googla "liste collegate semplici C" e verrai sommersa da link in italiano oppure googla "simple linked list c" e annegherai in tonnellate di tutorial, programmi già fatti, animazioni ed altro sull'argomento. Ci sono anche diverse voci di Wikipedia sull'argomento.
    Come vedi ho non risposto alla tua domanda. Se però provi a scrivere la tua libreria di gestione liste collegate ti prometto il mio aiuto per la correzione e anche qualcosa in più, però mettici del tuo.
    http://clessonsonline.blogspot.com

  9. #9
    okkkk per ora grazieee

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