|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2003
Città: Milano
Messaggi: 4623
|
[C] puntatori liste e via dicendo.....sono ottuso
devo fare un progettino in C per l'uni, nello studio dopo le strutture sono fermo alle liste semplici...non mi persuado sulla loro implementazione....forse perchè non mi entra in testa luso dei puntatori (li ho capiti, ma forse non digeriti) please! se non capisco le liste non capirò le liste di adiacenze (che sono la base del mio progettino, visto che devo usare una matrice NxN e un array bidimensionale sarebbe poco furbo)
__________________
Ho trattato con : lahiri, czame, RC, allXXX, dfruggeri, JMM, Paperone, xej, Pappez, iperfly, Red81, Playmake, ryan78, Rob66, XP2200, Peach1200, faberjack, Stewie82, supermario_bros, hft500, Axelscorpio, pipes lee, Piccolospazio, RohanKish, miki66, kabira85 |
|
|
|
|
|
#2 | |||
|
Senior Member
Iscritto dal: Dec 2002
Città: Loano (SV)
Messaggi: 1172
|
Re: [C] puntatori liste e via dicendo.....sono ottuso
Quote:
Metti di avere due strutture così fatte: Quote:
Quote:
Alla fine ti ritrovi ad avere proprio una lista: tutti i nodi sono collegati tra loro, da head a tail. Infatti ai nodi si può accedere così: Lista->itshead (sarebbe K), Lista->itshead->next(sarebbe S), Lista->itshead->next->next (sarebbe G). Per esempio Lista->itshead->next->next->x (stessa cosa: Lista->tail->x) ci darebbe il contenuto del campo x dell'oggetto G. Spero sia stato chiaro. |
|||
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Sep 2003
Città: Milano
Messaggi: 4623
|
allora, io non conosco il C, ma una cosa del tipo
Node x = new Node mi sembra più una dichiarazione java che C, sei sicuro? io devo programmare rigorosamente in C con lo standard ANSI ed il compilatore gcc. come hai implementato il codice è diverso dal mio libro di testo, lui implementa tutto usando un unica struttura "list" e non 2....
__________________
Ho trattato con : lahiri, czame, RC, allXXX, dfruggeri, JMM, Paperone, xej, Pappez, iperfly, Red81, Playmake, ryan78, Rob66, XP2200, Peach1200, faberjack, Stewie82, supermario_bros, hft500, Axelscorpio, pipes lee, Piccolospazio, RohanKish, miki66, kabira85 |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Dec 2002
Città: Bologna
Messaggi: 483
|
Vediamo se posso aiutarti io visto che ci ho sbattuto la testa a lungo anch'io....
Proviamo a fare una lista semplice, in cui ogni nodo contiene un intero e un puntatore naturalmente ad un altro nodo... Dichiariamo la struttura struct nodo{ int valore; struct nodo *next; } typedef struct nodo nodo; In queste due righe credo non ci siano problemi. Ora dovresti precisarmi qual'è il tuo problema per andare avanti..potri scrivere molte righe di codice che sono però totalmente inutili....
__________________
Acer TravelMate 8103Wlmi |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Devi mettere la porola struct davanti ogni volta che usi il nome di una struct... Per evitare questo devi usare typedef come spiegto sopra Per l'allocazione non si usa la new, ma malloc...una funzione definita in stdlib.h... La malloc si usa così: pippo *p; p = (pippo *) malloc(sizeof(pippo)); p->membro per accedere ai membri della struct puntata da p... Per liberare la memoria allocata: free(p); Ultima modifica di cionci : 15-09-2004 alle 17:58. |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Dec 2002
Città: Loano (SV)
Messaggi: 1172
|
scusate, ma sn abituato al c++. E cmq l'obbiettivo era capire le liste, no?
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Sep 2003
Città: Milano
Messaggi: 4623
|
Quote:
__________________
Ho trattato con : lahiri, czame, RC, allXXX, dfruggeri, JMM, Paperone, xej, Pappez, iperfly, Red81, Playmake, ryan78, Rob66, XP2200, Peach1200, faberjack, Stewie82, supermario_bros, hft500, Axelscorpio, pipes lee, Piccolospazio, RohanKish, miki66, kabira85 |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ad esempio:
Inserimento in testa (con la struttura sopra)... Codice:
nodo *inserisci_in_testa(nodo *testa, in valore)
{
nodo *tmp = (nodo *) malloc (sizeof(nodo));
tmp->valore = valore; /*equivale a (*tmp).valore = valore;*/
tmp->next = testa;
return tmp;
}
...
nodo *lista = NULL; /*lista vuota*/
....
....
lista = inserisci_in_testa(lista, 10);
lista = inserisci_in_testa(lista, 8);
lista = inserisci_in_testa(lista, 80);
....
Ultima modifica di cionci : 15-09-2004 alle 21:53. |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Sep 2003
Città: Milano
Messaggi: 4623
|
ok, in questo caso creo la lista vuota e la riempio, quali altre proprietà\operazioni? ad esempio se voglio cercare il dato + piccolo?
__________________
Ho trattato con : lahiri, czame, RC, allXXX, dfruggeri, JMM, Paperone, xej, Pappez, iperfly, Red81, Playmake, ryan78, Rob66, XP2200, Peach1200, faberjack, Stewie82, supermario_bros, hft500, Axelscorpio, pipes lee, Piccolospazio, RohanKish, miki66, kabira85 |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Sep 2003
Città: Milano
Messaggi: 4623
|
Codice:
#include<stdio.h>
#include<stdlib.h>
int main(void){
struct nodo{
int valore;
struct nodo *next;
}
struct nodo *inserisciInTesta(struct nodo *testa, int valore){
struct nodo *tmp = (nodo *) malloc (sizeof(testa));
tmp->valore = valore; /*equivale a (*tmp).valore = valore;*/
tmp->next = testa;
return tmp;
}
struct nodo *lista = NULL; /*lista vuota*/
lista = inserisciInTesta(lista, 10);
lista = inserisciInTesta(lista, 8);
lista = inserisciInTesta(lista, 80);
return 0;
}
__________________
Ho trattato con : lahiri, czame, RC, allXXX, dfruggeri, JMM, Paperone, xej, Pappez, iperfly, Red81, Playmake, ryan78, Rob66, XP2200, Peach1200, faberjack, Stewie82, supermario_bros, hft500, Axelscorpio, pipes lee, Piccolospazio, RohanKish, miki66, kabira85 |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Avevo sbagliato a scrivere la malloc...
Se non usi il typedef devi scrivere così: struct nodo *tmp = (struct nodo *) malloc (sizeof(struct nodo)); |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Sep 2003
Città: Milano
Messaggi: 4623
|
15 C:\Documents and Settings\Giamma\Desktop\liste.c two or more data types in declaration of `inserisciInTesta'
ho messo la riga della malloc, ma non funziona ancora
__________________
Ho trattato con : lahiri, czame, RC, allXXX, dfruggeri, JMM, Paperone, xej, Pappez, iperfly, Red81, Playmake, ryan78, Rob66, XP2200, Peach1200, faberjack, Stewie82, supermario_bros, hft500, Axelscorpio, pipes lee, Piccolospazio, RohanKish, miki66, kabira85 |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Codice:
struct nodo{
int valore;
struct nodo *next;
}
struct nodo *inserisciInTesta(struct nodo *testa, int valore){
struct nodo *tmp = (struct nodo *) malloc (sizeof(struct nodo));
tmp->valore = valore; /*equivale a (*tmp).valore = valore;*/
tmp->next = testa;
return tmp;
}
int main(void){
struct nodo *lista = NULL; /*lista vuota*/
lista = inserisciInTesta(lista, 10);
lista = inserisciInTesta(lista, 8);
lista = inserisciInTesta(lista, 80);
return 0;
}
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Sep 2003
Città: Milano
Messaggi: 4623
|
13 C:\Documents and Settings\Giamma\Desktop\liste.c
: two or more data types in declaration of `inserisciInTesta' ancora un errore
__________________
Ho trattato con : lahiri, czame, RC, allXXX, dfruggeri, JMM, Paperone, xej, Pappez, iperfly, Red81, Playmake, ryan78, Rob66, XP2200, Peach1200, faberjack, Stewie82, supermario_bros, hft500, Axelscorpio, pipes lee, Piccolospazio, RohanKish, miki66, kabira85 |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Dec 2002
Città: Bologna
Messaggi: 483
|
Quote:
comunque visto che state pubblicando le operazioni da fare sulla lista, questa ad esempio la stampa void stampa_lista(struct nodo* start){ if (start!=NULL){ do printf("%d", start->valore); while((start=start->next)!=NULL); } }
__________________
Acer TravelMate 8103Wlmi |
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Sep 2003
Città: Milano
Messaggi: 4623
|
dunque, come mai mi da quel mex di errore? chi mi aiuta?
__________________
Ho trattato con : lahiri, czame, RC, allXXX, dfruggeri, JMM, Paperone, xej, Pappez, iperfly, Red81, Playmake, ryan78, Rob66, XP2200, Peach1200, faberjack, Stewie82, supermario_bros, hft500, Axelscorpio, pipes lee, Piccolospazio, RohanKish, miki66, kabira85 |
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Dec 2002
Città: Bologna
Messaggi: 483
|
a volte non si sa..comunque prova a scrivere
(struct nodo *) inse.... ovvero metti tra () il tipo di ritorno della funzione
__________________
Acer TravelMate 8103Wlmi |
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Sep 2003
Città: Milano
Messaggi: 4623
|
provato... praticamente non prende "struct nodo" come dichiarazione della funzione....
__________________
Ho trattato con : lahiri, czame, RC, allXXX, dfruggeri, JMM, Paperone, xej, Pappez, iperfly, Red81, Playmake, ryan78, Rob66, XP2200, Peach1200, faberjack, Stewie82, supermario_bros, hft500, Axelscorpio, pipes lee, Piccolospazio, RohanKish, miki66, kabira85 |
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Dec 2002
Città: Bologna
Messaggi: 483
|
Quote:
__________________
Acer TravelMate 8103Wlmi |
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Manca il ; dopo la dichiarazione della struct...
Ora non è che possiamo dirti quali sono le possibili operazioni su una lista...perchè bene o male ci puoi fare tutto... Sulle liste puoi operare su un singolo elemento (anche non in testa, ricercando ad esempio il valore) in maniera iterativa...oppure in maniera ricorsiva... Ti faccio vedere come si opera in entrambi i modi... Codice:
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
struct nodo{
int valore;
struct nodo *next;
};
struct nodo *inserisci_in_testa(struct nodo *testa, int valore)
{
struct nodo *tmp = (struct nodo *) malloc (sizeof(struct nodo));
tmp->valore = valore; /*equivale a (*tmp).valore = valore;*/
tmp->next = testa;
return tmp;
}
void stampa_lista(struct nodo* start)
{
if (start!=NULL)
{
do
printf("%d\n", start->valore);
while((start=start->next)!=NULL);
}
}
struct nodo *elimina_elemento(struct nodo *elem)
{
struct nodo *tmp;
if(elem) /*equivale a if(elem != NULL)*/
{
tmp = elem;
elem = elem->next;
free(tmp);
}
return elem;
}
void svuota_lista(struct nodo *testa)
{
while(testa)
testa = elimina_elemento(testa);
}
void svuota_lista2(struct nodo *elem)
{
if(elem)
svuota_lista2(elimina_elemento(elem));
}
int main(void)
{
struct nodo *lista = NULL; /*lista vuota*/
lista = inserisci_in_testa(lista, 10);
lista = inserisci_in_testa(lista, 8);
lista = inserisci_in_testa(lista, 10);
lista = inserisci_in_testa(lista, 80);
lista = inserisci_in_testa(lista, 8);
lista = inserisci_in_testa(lista, 80);
lista = inserisci_in_testa(lista, 8);
lista = inserisci_in_testa(lista, 80);
lista = inserisci_in_testa(lista, 10);
lista = inserisci_in_testa(lista, 8);
lista = inserisci_in_testa(lista, 10);
lista = inserisci_in_testa(lista, 80);
lista = elimina_elemento(lista); /*elimino l'elemento in testa: 80*/
stampa_lista(lista);
svuota_lista(lista);
return 0;
}
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:53.



















