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

    [C] liste tramite array collegati

    Ciao! Mi trovo ad implementare (a scopo puramente accademico) una lista tramite array collegati. Ho trovato in giro il seguente codice:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #define MAXLS 30
    
    typedef struct elem 
    {
        int elem;
        int next;
    } ArrLs;
    
    //VARIABILI GLOBALI
    
    ArrLs key[MAXLS];       //Array dati!
    int head=0;             //Indice che "punta" al primo elemento della lista!
    int freeHead=0;         //Indice che "punta" al primo el. della lista libera!
    
    void insEl(void) 
    {
        int elem=0;
        int freeHeadbck=0;
        
        printf("Inserisci un integer > ");
        scanf("%d", &elem);
        
        if(freeHead==-1) {
           printf("Spazio in memoria insufficiente\n");
           return;
        }  
      
        freeHeadbck=freeHead;                        
        freeHead=key[freeHead].next; 
        key[freeHeadbck].elem=elem;   
        key[freeHeadbck].next=head;  
        head=freeHeadbck;
    }
    Ad ogni inserimento la funzione mi sovrascrive il primo elemento.
    Sospetto che l'errore stia da queste parti:
    codice:
     freeHead=key[freeHead].next;
    Ma non riesco ad uscire fuori dal tunnel! Qualcuno ha qualche idea (oltre al suggerimento di usare lista concatenate) ?

    Plz!


  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    724
    questa costruisce una lista linkata e la ordina in maniera particolare


    codice:
    #include <stdio.h>
    #include <math.h>
    #include <malloc.h>
    #include <stdlib.h>
    
    /* Implementazione della lista Linkata */
    struct Lista {
       int dato;                 /* Dato contenuto in questo nodo */
       struct Lista* prossimo;   /* Link al prossimo elemento */
    };
    
    /* Questa procedura si occupa di inserire un elemento in un nodo
     * e di creare il nodo successivo, senza doverlo fare a manina
     * per tutti e 10 gli elementi
     */
    void creaElemento(struct Lista *lst, int d) {
       lst->dato = d;
       lst->prossimo = (struct Lista*) malloc(sizeof(struct Lista));
       lst->prossimo->dato = -1;   /* Così so che quifinisce la lista */
    }
    
    void ordinaLista(struct Lista *lst);                /* Implementata dopo */
    void scambia(struct Lista *l1, struct Lista *l2);   /* Implementata dopo */
    
    int main() {
      int i;
       int z;
    do{
       struct Lista *lst;
       struct Lista *ptr;
    
    
       srand(time(NULL));   /* Inizializzo il seme del generatore di numeri casuali */
       lst = (struct Lista*) malloc(sizeof(struct Lista));   /* Alloco la lista (1° elemento) */
       ptr = lst;   /* Memorizzo il puntatore */
    
       printf("quanti elementi vuoi inserire?");
       scanf("%d",&z);
    
       /* Popolo la lista con elementi casuali */
    
       for(i=0; i<z; i++) {
          creaElemento(lst, rand());
          lst = lst->prossimo;
       }
    
       lst = ptr;   /* Riposiziono il puntatore */
    
       /* Stampo la lista non ordinata */
       printf("Lista disordinata:\n");
       for (i=0; i<z; i++) {
          printf("Elemento di posizione %d nella lista: %d\n", i, lst->dato);
          lst = lst->prossimo;
       }
    
       lst = ptr;   /* Riposiziono il puntatore */
    
       ordinaLista(lst);   /* Ordino la lista */
    
       /* Stampo la lista che ora è ordinata */
       printf("\n\nLista ordinata:\n");
       for (i=0; i<z; i++) {
          printf("Elemento di posizione %d nella lista: %d\n", i, lst->dato);
          lst = lst->prossimo;
       }
                     }while(z!=0);
       return 0;
    
    }
    
    void scambia(struct Lista *l1, struct Lista *l2) {
       int datoTmp;   /* Dato temporaneo */
       datoTmp = l1->dato;
       l1->dato = l2->dato;
       l2->dato = datoTmp;
    }
    
    void ordinaLista(struct Lista *lst) {
       struct Lista *ptr = lst;    /* Memorizzo l'indirizzo */
       struct Lista *prec = lst;   /* Devo memorizzare il puntatore al valore precedente */
    
       while(lst->prossimo->dato > 0) {   /* Fino alla fine della lista */
          while (lst->prossimo->dato > 0) {   /* Fino alla fine della lista */
             if (ptr->dato%2==0) {
                scambia(ptr, lst->prossimo);   /* Scambio i due elementi */
             }
             lst = lst->prossimo;
          }
          ptr = ptr->prossimo;
          lst = ptr;
       }
    }

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Il codice di perzem mi sembra di conoscerlo
    C'è pure un'istruzione inutile che avevo dimenticato di togliere: la dichiarazione del puntatore a Lista prec, all'interno della procedura di ordinamento.


    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
    Feb 2004
    Messaggi
    724
    è gia è proprio la tua lista!!! ho fatto male??

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    No, non hai fatto male... solo non so se lo aiuta!


    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
    Più che una lista allocata dinamicamente il problema consisteva nel crearne una tramite un array.
    In pratica il medesimo array contiene due liste una delle quali (la lista libera) contiene gli elementi che possono essere sovrascritti (che quindi non fanno parte della prima). L'eliminazione di un elemento comporta l'aggiunta di quest'ultimo alla lista libera.
    Cmq credo di aver risolto (finalmente!) il problema! Vi ringrazio per le risposte!

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.