|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Nov 2003
Città: Pordenone - Tarvisio
Messaggi: 2449
|
[C++]-Liste->sto impazzendo
Salve a tutti ragazzi...
Oggi a scuola abbiamo fatto le liste e ci ho capito veramente poco, sul libro nn capisco una mazza. Io ho capito che per creare una lista serve una struttra, che contiene 2 o più campi informazione (per memorizzare il dato) e uno o più campi puntatore, che poi punterà all'elemento successivo della lista (?), quindi: Codice:
struct nodo { int dato; nodo *next; } Codice:
nodo *testa=NULL; Come faccio a fare un inserimento in testa ed in coda? Non ho capito proprio nulla ![]()
__________________
Me? The Chosen One? They chose me, and i didn't even graduate from fuckin' high school Wind FTTE Vula 100/20 - Stats Retelit / Valcanale 20Mbit/2Mbit // Wind 100/20+Wind4G con EdgerouterX |
![]() |
![]() |
![]() |
#2 |
Member
Iscritto dal: Mar 2004
Messaggi: 283
|
Per crearti il nuovo elemento devi allocare la memoria necessaria che questo elemento andrà ad occupare. Devi utilizzare la funzione malloc al quale passi la dimensione di memoria da richiedere
Codice:
nodo *new; new = malloc (sizeof(nodo)); Codice:
In testa if (new != NULL) { new -> next = testa -> next; testa -> next = new; } } else { printf ("Memoria non disponibile"); } In coda nodo *cur; if (new != NULL) { cur = testa; while (cur -> next != NULL) cur = cur -> next; cur -> next = new; } else { printf ("Memoria non disponibile"); } ![]() |
![]() |
![]() |
![]() |
#3 | |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Quote:
Ad esempio, se vuoi una lista con i tre elementi 24, 7, 2, sara' rappresentata piu' o meno nel seguente modo: Codice:
+---+ +---+ +---+ |24 | | 7 | | 2 | +---+ /->+---+ /->+---+ | ----/ | ----/ | ------>(NULL) +---+ +---+ +---+ Con l'inserimento in testa e' facile: crei una nuova instanza della struttura, metti nel campo 'dato' il nuovo valore e nel campo 'next' il puntatore alla lista che hai. Nell'esempio sopra, siamo partiti dalla lista vuota (il puntatore a null), abbiamo creato una nuova istanza, abbiamo messo 2 su dato e NULL su next. Per aggiungere 7 abbiamo creato un'altra istanza, scritto 7 su 'dato' e su 'next' il puntatore alla lista di un elemento che avevamo appena creato, ovvero alla struttura contenente il 2, e cosi' via. Lo puoi scrivere ed usare nel seguente modo (modulo errori ![]() Codice:
nodo *lista_vuota = 0; nodo* inserisci_in_testa( nodo* testa, dato ) { nuova_testa = new nodo(); nuova_testa->dato = dato; nuova_testa->next = testa; return nuova_testa; } nodo* tmp = lista_vuota; tmp = inserisci_in_testa( tmp , 2 ) tmp = inserisci_in_testa( tmp , 7 ) tmp = inserisci_in_testa( tmp , 24 ) Devi creare una nuova istanza di nodo, imposti 'dato' col valore che ti interessa e next su NULL (perche' diventera' l'ultimo elemento). Dopo di che' scorri la tua lista fino all'ultimo elemento, e su di questo imposti il campo next sull'istanza di nodo che avevi creato prima. Ovviamente se la lista e' vuota, non scorri proprio niente e l'elemento appena creato diventa la nuova testa della lista: Codice:
nodo *lista_vuota = 0; nodo* inserisci_in_coda( nodo* testa, dato ) { nodo* ultimo = new nodo(); ultimo->next = 0; ultimo->dato = dato; if (testa == 0 ) return ultimo; nodo* cur = testa; while( cur->next != 0 ) cur = cur->next; cur->next = ultimo; return testa; } ... |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Nov 2003
Città: Pordenone - Tarvisio
Messaggi: 2449
|
Intanto grazie ad entrambi per avermi risposto.
Per domani devo fare un esercizio che consiste nel trovare i divisori di un numero e memorizzarli in una lista. Io ho risolto cosi, compila ma nn fa nulla: Codice:
#include "stdafx.h" #include <iostream> #include <cstdio> #define DIM 100 using namespace std; struct nodo { int dato; nodo *next; }; void Visualizza(nodo*); void Inserisci_Testa(nodo*,int[DIM],int); void Trova_divisore(int,int[DIM],int&); int main(int argc,char *argv[]) { nodo *testa=NULL; int posmax,num,arraydiv[DIM]; cout<<"Inserisci un numero.."; cin>>num; Trova_divisore(num,arraydiv,posmax); Inserisci_Testa(testa,arraydiv,posmax); Visualizza(testa); getchar(); return 0; } void Visualizza(nodo*T) { nodo *scorri; scorri=T; while(scorri!=NULL) { cout<<"\nElemento: "<<scorri->dato; scorri=scorri->next; } } void Inserisci_Testa(nodo*T,int array[DIM],int posmax) { int i; nodo *nuovo=new nodo; for(i=0;i<posmax;i++) { nodo *nuovo=new nodo; nuovo->dato=array[i]; nuovo->next=T; T=nuovo; } } void Trova_divisore(int num,int div[DIM],int &posmax) { int i=1,j=0; while(i<=num) { if(num%i==0) { div[j]=i; j++; } i++; } posmax=i; }
__________________
Me? The Chosen One? They chose me, and i didn't even graduate from fuckin' high school Wind FTTE Vula 100/20 - Stats Retelit / Valcanale 20Mbit/2Mbit // Wind 100/20+Wind4G con EdgerouterX Ultima modifica di -Yara- : 18-10-2005 alle 21:34. |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Nov 2003
Città: Pordenone - Tarvisio
Messaggi: 2449
|
up
__________________
Me? The Chosen One? They chose me, and i didn't even graduate from fuckin' high school Wind FTTE Vula 100/20 - Stats Retelit / Valcanale 20Mbit/2Mbit // Wind 100/20+Wind4G con EdgerouterX |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Nov 2003
Città: Pordenone - Tarvisio
Messaggi: 2449
|
up, plz mi serve qualcuno che me lo corregga
![]() Grazie ![]()
__________________
Me? The Chosen One? They chose me, and i didn't even graduate from fuckin' high school Wind FTTE Vula 100/20 - Stats Retelit / Valcanale 20Mbit/2Mbit // Wind 100/20+Wind4G con EdgerouterX |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Nov 2003
Città: Pordenone - Tarvisio
Messaggi: 2449
|
up
__________________
Me? The Chosen One? They chose me, and i didn't even graduate from fuckin' high school Wind FTTE Vula 100/20 - Stats Retelit / Valcanale 20Mbit/2Mbit // Wind 100/20+Wind4G con EdgerouterX |
![]() |
![]() |
![]() |
#8 | |
Member
Iscritto dal: Sep 2005
Città: Barcelona
Messaggi: 200
|
Quote:
posmax = j; inoltre la testa della lista passala per indirizzo e lavoraci con doppio puntatore...
__________________
Code without tests is broken by design. |
|
![]() |
![]() |
![]() |
#9 |
Junior Member
Iscritto dal: Sep 2009
Messaggi: 18
|
ho sbagliato a scrivere
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Nov 2003
Città: Pordenone - Tarvisio
Messaggi: 2449
|
Stica, dopo 6 anni
![]() Nel frattempo ho risolto comunque, ho finito la scuola, trovato lavoro e preso casa ![]() ![]() ![]()
__________________
Me? The Chosen One? They chose me, and i didn't even graduate from fuckin' high school Wind FTTE Vula 100/20 - Stats Retelit / Valcanale 20Mbit/2Mbit // Wind 100/20+Wind4G con EdgerouterX |
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: May 2008
Città: Mondragone
Messaggi: 316
|
Quote:
![]() ![]()
__________________
Ho concluso trattative con Dariosicilia(x2) - Vipera3000(x3) - Superezzonico - 8310 - Jonny32 - totore86 - Spale0 - Dubmehard - keimat - fabioss87 - frax289 - LkNuke - Crashland - alix79 - Valos - Pirlano - nonnopollo - Antgri27 - emnlmn - domthewizard Trattative concluse NEGATIVAMENTE/PACCO NON ARRIVATO/OGGETTO NON CORRISPONDENTE A DESCRIZIONE con Sassisassi |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:21.