Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 04-06-2010, 19:12   #1
guylmaster
Senior Member
 
L'Avatar di guylmaster
 
Iscritto dal: Aug 2002
Messaggi: 2518
[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,
guylmaster.
guylmaster è offline   Rispondi citando il messaggio o parte di esso
Old 04-06-2010, 20:16   #2
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Fermati a pensare un attimo sulla struttura di questa sorta di "matrice" che stai creando.

Come noti tu stesso, è una lista di liste. Se riesci a rappresentare una lista come un puntatore al nodo in testa, allora il resto è molto semplice: visto che ogni nodo contiene un valore di qualche tipo, puoi fare per prima cosa una lista di colonne. I nodi di questa lista potranno contenere, come valore, il puntatore alla testa di una lista con le celle da memorizzare in quella colonna.

Il fatto che tu lo stia facendo in C ti complicherà leggermente la vita, ma se farai le scelte giuste non sarà difficile.

ciao
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 04-06-2010, 20:53   #3
guylmaster
Senior Member
 
L'Avatar di guylmaster
 
Iscritto dal: Aug 2002
Messaggi: 2518
Sto provando ad iniziare per gradi ovvero di provare inanzi tutto a realizzare una semplice lista.

Ho trovato su internet un codice piu complicato che ho provato a semplificare.

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 problema è che il programma arriva a leggere il valore float e poi crasha inspiegabilmente. Da cosa può dipendere?

Ma anche non avresti qualche guida che spiega in linguaggio C, magari in maniera dettaggliata (e codice copiabile direttamente) come sviluppare una semplice lista senza fronzoli? Perchè secondo me mi mancano proprio le basi.

Ho una dispensa del professore i cui stessi esempi non funzionano e non sto riuscendo a trovare in internet programmi in C di liste ridotte all'osso.

Se potresti aiutarmi anche in tal senso te ne sarei grato.
guylmaster è offline   Rispondi citando il messaggio o parte di esso
Old 04-06-2010, 21:08   #4
guylmaster
Senior Member
 
L'Avatar di guylmaster
 
Iscritto dal: Aug 2002
Messaggi: 2518
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.
guylmaster è offline   Rispondi citando il messaggio o parte di esso
Old 04-06-2010, 21:45   #5
TRF83
Senior Member
 
L'Avatar di TRF83
 
Iscritto dal: Dec 2007
Città: Palestro
Messaggi: 1960
Quote:
Originariamente inviato da guylmaster Guarda i messaggi
...
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.
...
Quella funzione fa l'inserimento DOPO il nodo che gli passi come parametro, che può essere l'ultimo, come il primo.
Per semplicità, immaginiamo che tu voglia inserire dopo il primo elemento (quindi in seconda posizione). Quale sarà il successore del nuovo nodo, cioè quello che ORA dovrà essere in terza posizione? Quello che PRIMA era in seconda posizione, quindi nodo_dopo_il_quale_inserire->next. Per questo fai newnode->next=node->next;
L'istruzione node->next=newnode, invece serve per indicare che il successore del nodo è il nuovo nodo creato. Spero di essere stato chiaro..

A->C->D;
devi inserire B dopo la A, quindi chiami insert_after(&A,&B).
A questo punto crei il nodo con i dati di B (lo chiamo B per semplicità). Chi sarà il successore di B? C, quindi A->next. E il successore di A? B. Con l'esempietto dovrebbe essere decisamente più semplice da capire di quanto ho scritto sopra!
TRF83 è offline   Rispondi citando il messaggio o parte di esso
Old 04-06-2010, 22:19   #6
guylmaster
Senior Member
 
L'Avatar di guylmaster
 
Iscritto dal: Aug 2002
Messaggi: 2518
Quote:
Originariamente inviato da TRF83 Guarda i messaggi
Quella funzione fa l'inserimento DOPO il nodo che gli passi come parametro, che può essere l'ultimo, come il primo.
Per semplicità, immaginiamo che tu voglia inserire dopo il primo elemento (quindi in seconda posizione). Quale sarà il successore del nuovo nodo, cioè quello che ORA dovrà essere in terza posizione? Quello che PRIMA era in seconda posizione, quindi nodo_dopo_il_quale_inserire->next. Per questo fai newnode->next=node->next;
L'istruzione node->next=newnode, invece serve per indicare che il successore del nodo è il nuovo nodo creato. Spero di essere stato chiaro..

A->C->D;
devi inserire B dopo la A, quindi chiami insert_after(&A,&B).
A questo punto crei il nodo con i dati di B (lo chiamo B per semplicità). Chi sarà il successore di B? C, quindi A->next. E il successore di A? B. Con l'esempietto dovrebbe essere decisamente più semplice da capire di quanto ho scritto sopra!
Ho capito, quindi con quell'insert_after ho la possibilità di aggiungere nodi anche a metà della lista.

Ma come mai data lo da come puntatore di tipo void?

Se volessi modificare questo esempio per far si che questa lista abbia come elementi l'inizio di un'altra lista, come da post originario, come potrei fare?
guylmaster è offline   Rispondi citando il messaggio o parte di esso
Old 04-06-2010, 22:38   #7
guylmaster
Senior Member
 
L'Avatar di guylmaster
 
Iscritto dal: Aug 2002
Messaggi: 2518
Quote:
Originariamente inviato da TRF83 Guarda i messaggi
Quella funzione fa l'inserimento DOPO il nodo che gli passi come parametro, che può essere l'ultimo, come il primo.
Per semplicità, immaginiamo che tu voglia inserire dopo il primo elemento (quindi in seconda posizione). Quale sarà il successore del nuovo nodo, cioè quello che ORA dovrà essere in terza posizione? Quello che PRIMA era in seconda posizione, quindi nodo_dopo_il_quale_inserire->next. Per questo fai newnode->next=node->next;
L'istruzione node->next=newnode, invece serve per indicare che il successore del nodo è il nuovo nodo creato. Spero di essere stato chiaro..

A->C->D;
devi inserire B dopo la A, quindi chiami insert_after(&A,&B).
A questo punto crei il nodo con i dati di B (lo chiamo B per semplicità). Chi sarà il successore di B? C, quindi A->next. E il successore di A? B. Con l'esempietto dovrebbe essere decisamente più semplice da capire di quanto ho scritto sopra!
Ho capito, quindi con quell'insert_after ho la possibilità di aggiungere nodi anche a metà della lista.

Ma come mai data lo da come puntatore di tipo void?

Se volessi modificare questo esempio per far si che questa lista abbia come elementi l'inizio di un'altra lista, come da post originario, come potrei fare?

Ho provato anche solo a modificare i tipi in float in questo modo ma mi va in loop:

Codice:
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
//Struttura dati
typedef struct node_s {
	//void *data;
	float data;
    struct node_s *next;	
} NODE;

//Prototipi funzioni
NODE *list_create(float data);
NODE *list_insert_after(NODE *node, float data);
NODE *list_insert_beginning(NODE *list, void *data);
int list_remove(NODE *list, NODE *node);
int list_foreach(NODE *node, int(*func)(float));
NODE *list_find(NODE *node, int(*func)(void*,void*), void *data);
int printstring(void *s);
int findstring(void *listdata, void *searchdata);

//funzioni

NODE *list_create(float data)
{
	NODE *node;
	if(!(node=malloc(sizeof(NODE)))) return NULL;
	node->data=data;
	node->next=NULL;
	return node;
}

NODE *list_insert_after(NODE *node, float data)
{
	NODE *newnode;
        newnode=list_create(data);
        newnode->next = node->next;
        //newnode->next = NULL;
        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)(float))
{
	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;
}
*/


//main
int main()
{
	NODE *list, *second, *inserted;
	NODE *match;

	/* Create initial elements of list */
	list=list_create(1);
	second=list_insert_after(list, 2);
	//list_insert_after(second, 3);

	printf("Initial list:\n");
	list_foreach(list, printstring);
	putchar('\n');

	system("PAUSE");
    return 0;
}
Poi in questo prototipo:
Codice:
int list_foreach(NODE *node, int(*func)(void*))
Non riesco a capire cosa significhi "int(*func)(void*)", com in generale non riesco a capire perchè nella struttura definisca il dato di tipo void in questo modo "void *data;"
guylmaster è offline   Rispondi citando il messaggio o parte di esso
Old 04-06-2010, 23:37   #8
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da guylmaster Guarda i messaggi
Non riesco a capire cosa significhi "int(*func)(void*)", com in generale non riesco a capire perchè nella struttura definisca il dato di tipo void in questo modo "void *data;"
Quella dichiarazione è un puntatore ad una generica funzione che restituisce un intero e accetta un puntatore a void come argomento.
Il dato nella lista è di tipo void* per dare una certa "universalità" all'implementazione (ci puoi virtualmente infilare ciò vuoi, quindi quella singola implementazione della lista è adattabile ad ogni contenuto).
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 04-06-2010, 23:44   #9
guylmaster
Senior Member
 
L'Avatar di guylmaster
 
Iscritto dal: Aug 2002
Messaggi: 2518
Per altro con la insert_after riesco ad inserire un nodo solo in mezzo a due nodi.
Se volessi invece inserire un nodo a fine lista come potrei fare?
guylmaster è offline   Rispondi citando il messaggio o parte di esso
Old 04-06-2010, 23:54   #10
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Ti basta inserirlo... dopo l'ultimo nodo della lista.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 04-06-2010, 23:56   #11
guylmaster
Senior Member
 
L'Avatar di guylmaster
 
Iscritto dal: Aug 2002
Messaggi: 2518
Per fare l'inserimentro a fine lista ho provato ad implementare la seguente funzione:

Codice:
NODE *Inserisci_alla_fine(NODE *node, float data)
{
     NODE2 *newnode;
     while(node)
    {  
       if(node->next != NULL)
       {
          node =  node->next;        
       }      
       else
       {
           newnode = list_create2(data);
           node->next = newnode;
           newnode->next = NULL;
       }
    } 
	return newnode;
}
Tenendo conto che la struttura è la seguente:
Codice:
typedef struct node_s2 {
	float data;
    struct node_s2 *next;	
} NODE2;
e che la list_create2 è questa:

Codice:
NODE2 *list_create2(float data)
{
	NODE2 *node;
	if(!(node=malloc(sizeof(NODE2)))) return NULL;
	node->data=data;
	node->next=NULL;
	return node;
}
Il programma compila, si esegue ma mi da la schermata nera.
guylmaster è offline   Rispondi citando il messaggio o parte di esso
Old 04-06-2010, 23:57   #12
guylmaster
Senior Member
 
L'Avatar di guylmaster
 
Iscritto dal: Aug 2002
Messaggi: 2518
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Ti basta inserirlo... dopo l'ultimo nodo della lista.
Ok, ma in quella struttura come lo trovo l'ultimo nodo della lista? ho provato a fare il ciclo while sopra ripotato ma non va..
guylmaster è offline   Rispondi citando il messaggio o parte di esso
Old 05-06-2010, 00:08   #13
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Non va perché l'aggiunta la fai dentro il while, dal quale non uscirai mai perché appena trovi la fine della lista inserisci un nuovo blocco e non aggiorni più il puntatore node, per cui non smetterai mai di ripetere l'aggiunta dell'ultimo blocco.

Fai prima un ciclo while dove imponi come condizione che siano validi sia il blocco attuale che il blocco successivo. Appena fallirà la condizione, uscirai dal ciclo while stando sull'ultimo blocco.

Avrai due casi: o ti fermerai su NULL (nel qual caso la lista è vuota), o ti fermerai su un qualche nodo, sul quale potrai usare la list_insert_after().

Se sai che dovrai fare un gran numero di inserimenti in coda o in testa, prendi in considerazione l'idea di usare liste circolari.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 05-06-2010, 00:10   #14
guylmaster
Senior Member
 
L'Avatar di guylmaster
 
Iscritto dal: Aug 2002
Messaggi: 2518
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Non va perché l'aggiunta la fai dentro il while, dal quale non uscirai mai perché appena trovi la fine della lista inserisci un nuovo blocco e non aggiorni più il puntatore node, per cui non smetterai mai di ripetere l'aggiunta dell'ultimo blocco.

Fai prima un ciclo while dove imponi come condizione che siano validi sia il blocco attuale che il blocco successivo. Appena fallirà la condizione, uscirai dal ciclo while stando sull'ultimo blocco.

Avrai due casi: o ti fermerai su NULL (nel qual caso la lista è vuota), o ti fermerai su un qualche nodo, sul quale potrai usare la list_insert_after().

Se sai che dovrai fare un gran numero di inserimenti in coda o in testa, prendi in considerazione l'idea di usare liste circolari.
Mi puoi fare un esempio pratico del while che sono totalmente fuso?
guylmaster è offline   Rispondi citando il messaggio o parte di esso
Old 05-06-2010, 00:18   #15
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Abbozzo uno pseudocodice:

Codice:
nodo_t x = lista->testa;

finché (x non è nullo) e (x->next non è nullo) {
    x = x->next;
}

aggiungi_dopo(x, nuovoValore);
A te la gestione del caso in cui ottieni un x nullo...
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 05-06-2010, 00:22   #16
guylmaster
Senior Member
 
L'Avatar di guylmaster
 
Iscritto dal: Aug 2002
Messaggi: 2518
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Abbozzo uno pseudocodice:

Codice:
nodo_t x = lista->testa;

finché (x non è nullo) e (x->next non è nullo) {
    x = x->next;
}

aggiungi_dopo(x, nuovoValore);
A te la gestione del caso in cui ottieni un x nullo...
L'ho riscritta così:
Codice:
NODE *Inserisci_alla_fine(NODE *node, float data)
{
     NODE2 *newnode;
     while(node && node->next)
    {  
          node =  node->next;         
    } 
     list_insert_after2(node, data);
	return newnode;
}
Ma mi concatena un valore 0.000000
guylmaster è offline   Rispondi citando il messaggio o parte di esso
Old 05-06-2010, 00:25   #17
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
No, non ti concatena uno zero, è che... newnode chi lo inizializza?

E ricordati di gestire il caso in cui node è nullo!
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 05-06-2010, 00:32   #18
guylmaster
Senior Member
 
L'Avatar di guylmaster
 
Iscritto dal: Aug 2002
Messaggi: 2518
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
No, non ti concatena uno zero, è che... newnode chi lo inizializza?

E ricordati di gestire il caso in cui node è nullo!
Emm come lo devo inizializzare?

Ho visto che se sostituito " newnode=list_create(data);" con " newnode=list_create(333.333);" funziona. Ovvero se invece di passargli la variabile data metto direttamente il numero float.

Possibile?
guylmaster è offline   Rispondi citando il messaggio o parte di esso
Old 05-06-2010, 00:34   #19
guylmaster
Senior Member
 
L'Avatar di guylmaster
 
Iscritto dal: Aug 2002
Messaggi: 2518
Che poi l'inizializzazione non la fa esattamente la riga di codice:

Codice:
newnode=list_create(data);
no?
guylmaster è offline   Rispondi citando il messaggio o parte di esso
Old 05-06-2010, 00:39   #20
guylmaster
Senior Member
 
L'Avatar di guylmaster
 
Iscritto dal: Aug 2002
Messaggi: 2518
Cioè attualmente il codice della mia funzione è questo:

Codice:
NODE *Inserisci_alla_fine(NODE *node, float data)
{
     NODE2 *newnode;
     while(node->next != NULL)
    {  
          node =  node->next;         
    } 
     newnode=list_create(data);
     node->next = newnode;
	return newnode;
}
Se la riga "newnode=list_create(data);" la sostituisco con "newnode=list_create(666);" va, altrimenti continua a concatenare 0.000000... non me lo so proprio spiegare.
guylmaster è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
Toyota usa giochi e premi per spingere i...
HarmonyOS ha raggiunto la soglia di sopr...
Le offerte Amazon più convenienti...
Un gruppo di ladri ha usato Google Maps ...
Apple non si fida di Samsung per la real...
Windows 11: un nuovo driver nativo mette...
Vi hanno regalato buoni Amazon? Intanto ...
Via acari, polvere e sporco da materassi...
Cuffie Beats in super offerta su Amazon,...
Xbox Cloud Gaming arriva su Amazon Fire ...
Un blackout a San Francisco manda in til...
Windows 11 è diventato più...
Apple cambia strategia a causa della cri...
007 First Light: uscita rimandata di due...
Samsung Galaxy A37 e A57: il comparto fo...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 16:19.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v