Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13

Discussione: [C] Lista vuota

  1. #1

    [C] Lista vuota

    allora io definisco una lista semplice

    struct mp3 {
    int id;
    struct mp3 *pun;
    };


    poi in questa lista devo inserire 5 informazioni
    allora uso un ciclo che itera 5 volte

    ora arriva il prolema, nella prima occorrenza devo usare un procedimento differente
    ora ho 2 puntatotati alla lista
    struct mp3 *p, *paus;

    vorrei fare un if che veda se p ancora nn ha nessun elemento
    come faccio?
    if (p == NULL) ??
    if (p == 0) ??
    o devo usare metodi diversi??
    live free or die

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Devi controllare che p sia stato allocato (non sia 0) e, quindi, controllare se esiste l'elemento id
    codice:
    if (p) {
    
       /* p è stato allocato, controllo se esiste id */
       /* Suppongo che id debba essere diverso da 0 perchè esista un elemento */
    
       if (p->id) {
    
          /* C'è un elemento */
    
       } else {
    
          /* Non c'è nessun elemento */
    
       }
    } else {
    
       /* p non è stato allocato */
    
    }
    Se, invece, un ID 0 non significa assenza di elemento, devi gestire la cosa in altro modo, ma qui lo sai solo tu.


    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
    si si hai ragione, ora ho capito.

    posso rompertoi su icq se c'è qualcosa che nn va?
    live free or die

  4. #4
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    struct mp3 {
    	int id;
    	struct mp3 *pun;
    };
    
    struct mp3 *crealista();
    
    main()
    {
    	struct mp3 *puntLista;
    
    	int n, i, id;
    	n = 5;
    	
    	for (i=1; i<=n; i++) {
    		printf("Inserisci il %d elemento: ", i);
    		scanf("%d", id);
    		puntLista = crealista(id);
    		
    	}
    	
    	
    }
    
    struct mp3 *crealista(id)
    {
    	struct mp3 *p, *paus;
    	
    	if (!p) {
    		p = (struct mp3 *)malloc(sizeof(struct mp3));
    		p->id = id;
    		paus = p;
    	}
    }
    ora ho provato a mettere il primo elemento nella lista...ma mi dà un segmentation fault...cosa c'è che nn va?
    sbaglio a usare le funzioni?
    la malloc?
    live free or die

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    A me non dà nessun segmentation fault... però ho notato che la funzione crealista() ha qualche discordanza... ora, io non sono un esperto di C, però il prototipo lo hai dichiarato senza argomenti. Al momento della chiamata (e nell'implementazione) passi un argomento (senza tipo??) e, in ogni caso, manca l'istruzione di return per tornare il puntatore alla struttura... :master:

    Per ICQ... a me non disturba affatto, ma non sono un esperto di C... me la cavo decisamente meglio con Java


    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

  6. #6
    Questa è una versione funzionante della tua lista, che come commento ha dove sbagli:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    struct mp3 {
            int id;
            struct mp3 *punt;
    };
    
    struct mp3 *crealista (int, struct mp3*);
    void visualizza (struct mp3*);
    
    int main() {
            struct mp3 *puntLista = NULL;
            int n, i, id;
            n = 5;
            for (i = 0; i < n; i++) {
                    printf ("Inserisci il %d numero: ", i + 1);
                    fflush (stdin);
                    scanf ("%d", &id); /* indirizzo della variabile */
                    puntLista = crealista (id, puntLista); /* punto alla nuova struttura */
            }
            visualizza (puntLista);
            return (0);
    }
    
    struct mp3 *crealista (int number, struct mp3 *testa) {
            struct mp3 *p;
            p = (struct mp3 *) malloc (sizeof (struct mp3));
            p -> id = number; /* metto il numero */
            p -> punt = testa; /* metto il vecchio indirizzo della struct */
            return (p); /* ritorno il nuovo indirizzo della struttura */
    }                       
    
    void visualizza (struct mp3* list) { /* visualizzo, passando il punt per indirizzo, tanto nn devo ritornare nada :) */
            while (list) {
                    printf ("%d \n", list -> id);
                    list = list -> punt; 
            }
    }
    Ciao!

  7. #7
    grazie 1000

    2 domande

    1. cos'è la funzione fflush (stdin)?

    2. non capisco bene questo punto
    p -> punt = testa; /* metto il vecchio indirizzo della struct */
    ma la testa nn sarebbe il primo elemento iserito? qui invece mi sembra l'ultimo, no?

    live free or die

  8. #8
    fflush (stdin); è vietato dallo standard ANSI/ISO C99/C98 poiche ha un comportamento indefinito.
    Potrebbe mandartelo giu come crashare il pgm.
    fflush è solo x l'output.

    La stupidità umana e l'universo sono infinite.
    Della seconda non sono certo(Einstein)

    Gnu/Linux User

  9. #9
    Originariamente inviato da Kandalf
    grazie 1000

    2 domande

    1. cos'è la funzione fflush (stdin)?

    2. non capisco bene questo punto
    p -> punt = testa; /* metto il vecchio indirizzo della struct */
    ma la testa nn sarebbe il primo elemento iserito? qui invece mi sembra l'ultimo, no?

    1. La funzione fflshu serve a svuotarti il buffer di input, poichè dopo una scanf può sporcarsi.

    2. Si.
    La lista è un concetto astratto, può essere implementata in tanti modi.
    Il questo caso, la testa della lista punta al ultimo elemento inserito. (Una specie di stack)
    Naturalmente puoi anche farla come vuoi tu.
    Dipende da cosa ci devi fare, è pur sempre una lista , se vuoi fai un puntatore che punta sempre alla testa del primo elemento creato.
    Sono concetti astratti le liste.

    Ciao

  10. #10
    Originariamente inviato da Luc@s
    fflush (stdin); è vietato dallo standard ANSI/ISO C99/C98 poiche ha un comportamento indefinito.
    Potrebbe mandartelo giu come crashare il pgm.
    fflush è solo x l'output.

    Non penso che con i compilatori attuali può creare problemi.

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.