PDA

View Full Version : [C++]-Liste->sto impazzendo


-Yara-
12-10-2005, 21:12
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:

struct nodo
{
int dato;
nodo *next;
}

Bene, da quel poco che ho capito, devo creare un puntatore di Testa e metterlo a NULL

nodo *testa=NULL;

Ma a cosa mi serve? Come faccio a creare un altro elemento della mia lista?
Come faccio a fare un inserimento in testa ed in coda?
Non ho capito proprio nulla :(, grazie a chi mi aiuta

Akira83
12-10-2005, 22:04
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

nodo *new;
new = malloc (sizeof(nodo));


Per l'inserimento il procedimento è il seguente. Se la lista è vuota, quindi la testa è NULL lo inserisci direttamente. Altrimenti sposti il primo elemento e inserisci quello nuovo. Per l'inserimento in coda bisogna leggere tutta la lista e poi inserire.


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");
}


Considera che questo è quello che ricordo di C, che è un linguaggio che non uso molto, anzi direi mai, quindi potrebbero esserci delle imprecisioni. Spero di essere stato utile e di aver sbagliato il meno possibile :stordita:

/\/\@®¢Ø
12-10-2005, 22:59
Salve a tutti ragazzi...
Come faccio a fare un inserimento in testa ed in coda?
Non ho capito proprio nulla :(, grazie a chi mi aiuta
L'idea e' di avere una struttura contenente un campo con "l'elemento corrente" (la testa della lista) e uno che punto "al resto della lista" (la coda della lista).
Ad esempio, se vuoi una lista con i tre elementi 24, 7, 2, sara' rappresentata piu' o meno nel seguente modo:

+---+ +---+ +---+
|24 | | 7 | | 2 |
+---+ /->+---+ /->+---+
| ----/ | ----/ | ------>(NULL)
+---+ +---+ +---+

Come si fa ad inserire elementi ?
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 :D)

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 )


L'inserimento in coda e' solo un po' piu' complicato visto che il caso lista vuota va trattato con un attimo di cautela.
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:


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;
}

...

Spero di essere stato chiaro, anche se forse mi son dilungato fin troppo :P

-Yara-
17-10-2005, 18:32
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:

#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;
}

Grazias

-Yara-
18-10-2005, 06:54
up

-Yara-
18-10-2005, 14:04
up, plz mi serve qualcuno che me lo corregga :(

Grazie :)

-Yara-
18-10-2005, 22:33
up

cj++
18-10-2005, 23:03
posmax=i;

un errore è qui
posmax = j;

inoltre la testa della lista passala per indirizzo e lavoraci con doppio puntatore...

jonnykaraoke
06-09-2011, 12:26
ho sbagliato a scrivere

-Yara-
06-09-2011, 14:16
Stica, dopo 6 anni :D
Nel frattempo ho risolto comunque, ho finito la scuola, trovato lavoro e preso casa :Prrr: :Prrr: :D

crack001
09-09-2011, 13:02
Stica, dopo 6 anni :D
Nel frattempo ho risolto comunque, ho finito la scuola, trovato lavoro e preso casa :Prrr: :Prrr: :D


:Prrr: :Prrr: questa è mitica xD