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

    [C] Implementazione lista di liste

    Salve a tutti,
    per una consegna universitaria mi trovo a dover consegnare un programma che lavora su una struttura dati che in realtà è una lista di lista, come rappresentato in questa immagine:



    Creando questa lista di liste in poche parole si vuole creare una "matrice dinamica", ovvero, ci sarà una lista principale composta da due puntatori e di questi due puntatori:

    Uno punterà all'elemento successivo della lista;
    Uno punterà ad un'altra lista che in realtà rappresenterà un intera colonna della matrice;

    Per farla breve una lista servirà per scorrere per le colonne, arrivata alla colonna desiderata si punterà alla seconda lista che a sua volta conterrà gli elementi veri e propri della colonna in questione.

    Il problema è che questo esame non è di Algoritmi e strutture dati, che ancora non ho fatto essendo solo al primo anno, ma è un esame di laboratorio di informatica in cui ci è stato appena accennato come funziona una lista, e non riesco bene a definire come far funzionare una lista di liste.

    Mi sono bloccato già solo alla creazione di una funzione che inizializzi la lista. Ovvero che allochi lo spazio, passandogli semplicemente un puntatore ed il numero di righe e di colonne.
    Stavo pensando ad allocare, con un primo ciclo tutti gli elementi della prima lista, e man mano che si alloca il singolo elemento della prima lista, con un'altro ciclo anniato, gli si alloca la seconda lista ad esso collegata.

    Ho però tante idee e ben confuse, quindi se potreste aiutarmi a creare e a gestire questa struttura dati ve ne sarei ben grato. Magari non sono il primo a voler creare una lista di liste.

    Vi ringrazio in anticipo,
    Neptune.
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  2. #2
    Sto provando alemno a sviluppare una lista normale, seguendo un esempio trovato proprio su html.it ma semplificandolo (nel manuale del C parla delle liste ma fa un esempio molto complesso) però lo compila e crasha inspiegabilmente.

    Ho tre file, il main.c, funzioni.c (contenente le funzioni di inserimento), funzioni.h (contenendo le definizioni delle strutture), e sono le seguenti:

    main.c
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include "funzioni.h"
    
    int main(int argc, char *argv[])
    {
            struct elemento *lista = NULL;
            lista = aggiungiContatto(lista);
    		system("PAUSE");
            return 0;	
    	}
    funzioni.h
    codice:
    /*Elementi pubblici della libreria funzioni*/
    
    //Struttura dati
    struct elemento
    {
      float inf;
      struct elemento *pun;
    };
    //Prototipi funzioni
    struct elemento *aggiungiContatto(struct elemento *p);
    funzioni.c
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include "funzioni.h"
    
    struct elemento *aggiungiContatto(struct elemento *p)
    { // aggiungiContatto() - OPEN
    
    
      // Dichiaro le variabili
      float daInserire;
      struct elemento *punt;
    
      // Popolo la variabile daInserire
      printf (" Float > ");
      scanf ("%f", daInserire);
      
    
      if(p != NULL)
      { // IF - OPEN
    
        /* creazione elementi successivi */
        // Alloco la memoria necessaria
        punt = (struct elemento *)malloc(sizeof(struct elemento));
        // Metto daInserire nell'informazione del puntatore
        punt->inf = daInserire;
        // Metto il puntatore in testa alla lista
        punt->pun = p;
    
      } else { // ELSE
    
        /* creazione primo elemento */
        // Alloco la memoria necessaria
        p = (struct elemento *)malloc(sizeof(struct elemento));
        // Metto daInserire nell'informazione del puntatore
        p->inf = daInserire;
        // p punta a NULL, ovvero il marcatore di fine lista
        p->pun = NULL;
        // Assegno p a punt
        punt = p;
    
      } // IF - CLOSE
    
      // Esce dalla funzione e restituisce la lista
      return(punt);
    
    }
    Il programma arriva a leggere il float e poi crasha inspiegabilmente.
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  3. #3
    Ho trovato anche questo codice per le liste, molto piu stringato ma con il problema di non avere nemmeno un commento a disposizione:

    codice:
    #include<stdlib.h>
    #include<stdio.h>
    #include<string.h>
    
    typedef struct node_s {
    	void *data;
    	struct node_s *next;	
    } NODE;
    
    NODE *list_create(void *data)
    {
    	NODE *node;
    	if(!(node=malloc(sizeof(NODE)))) return NULL;
    	node->data=data;
    	node->next=NULL;
    	return node;
    }
    
    NODE *list_insert_after(NODE *node, void *data)
    {
    	NODE *newnode;
            newnode=list_create(data);
            newnode->next = node->next;
            node->next = newnode;
    	return newnode;
    }
    
    NODE *list_insert_beginning(NODE *list, void *data)
    {
    	NODE *newnode;
            newnode=list_create(data);
            newnode->next = list;
    	return newnode;
    }
    
    int list_remove(NODE *list, NODE *node)
    {
    	while(list->next && list->next!=node) list=list->next;
    	if(list->next) {
    		list->next=node->next;
    		free(node);
    		return 0;		
    	} else return -1;
    }
    
    int list_foreach(NODE *node, int(*func)(void*))
    {
    	while(node) {
    		if(func(node->data)!=0) return -1;
    		node=node->next;
    	}
    	return 0;
    }
    
    NODE *list_find(NODE *node, int(*func)(void*,void*), void *data)
    {
    	while(node) {
    		if(func(node->data, data)>0) return node;
    		node=node->next;
    	}
    	return NULL;
    }
    
    int printstring(void *s)
    {
    	printf("%s\n", (char *)s);
    	return 0;
    }
    
    int findstring(void *listdata, void *searchdata)
    {
    	return strcmp((char*)listdata, (char*)searchdata)?0:1;
    }
    
    int main()
    {
    	NODE *list, *second, *inserted;
    	NODE *match;
    
    	/* Create initial elements of list */
    	list=list_create((void*)"First");
    	second=list_insert_after(list, (void*)"Second");
    	list_insert_after(second, (void*)"Third");
    
    	printf("Initial list:\n");
    	list_foreach(list, printstring);
    	putchar('\n');
    
    	/* Insert 1 extra element in front */
    	list=list_insert_beginning(list, "BeforeFirst");
    	printf("After list_insert_beginning():\n");
    	list_foreach(list, printstring);
    	putchar('\n');
    
    	/* Insert 1 extra element after second */
    	inserted=list_insert_after(second, "AfterSecond");
    	printf("After list_insert_after():\n");
    	list_foreach(list, printstring);
    	putchar('\n');
    
    	/* Remove the element */
    	list_remove(list, inserted);
    	printf("After list_remove():\n");
    	list_foreach(list, printstring);
    	putchar('\n');
    
    	/* Search */
    	if((match=list_find(list, findstring, "Third")))
    		printf("Found \"Third\"\n");
    	else printf("Did not find \"Third\"\n");
    
    	system("PAUSE");
            return 0;
    }
    Non mi è chiara inanzitutto la funzione list_insert_after che vi riporto di seguito:
    codice:
    NODE *list_insert_after(NODE *node, void *data)
    {
    	NODE *newnode;
            newnode=list_create(data);
            newnode->next = node->next;
            node->next = newnode;
    	return newnode;
    }
    Praticameente questa prima crea il nuovo nodo, poi però dice "newnode->next = node->next;" che significa? cioè il sucessivo di newnode è se stesso? non mi torna.

    Anche perchè ho provato a fare "newnode->next = NULL;" e non va più l'ultima funzione di ricerca di un elemento.
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

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.