|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: May 2003
Città: Milano
Messaggi: 2894
|
[C] liste, non ci capisco proprio
sto studiando per l'esame di informatica sul C, ma le liste proprio nn riesco a capirle, proprio il concetto!
qualche anima pia potrebbe spiegarmi brevemente come si usano, passaggio per passaggio? almeno come aggiungere e togliere elementi. grazie mille
__________________
P4 2.8 NorthwoodC - 2x256 vitesta ddr500 + 1GB Kingston ddr400 - P4C800-Deluxe - SAPPHIRE Radeon X1950pro 512MB AGP - Samsung 931BW Macbook Alu |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: May 2003
Messaggi: 1113
|
Che concetto non capisci sulle liste? Il perchè della loro esistenza?
Se hai studiato le liste significa che hai fatto anche le code (queue), bene puoi vedere le liste come delle code evolute in quanto tipicamente le code, dato anche il loro nome, sono di una lunghezza prestabilita e di conseguenza ti possono servire ad memorizzare un determinato numero di informazioni; mentre le liste sono una struttura dinamica che data la loro natura possono essere ampliate, in quanto a numero di elementi, e sono quindi teoricamente "infinite" nel senso che potrai aggiungere o eliminare elementi a piacere. Per ottenere questo risultato le liste sono una struttura astratta formata da due elementi: 1) un elemento conterrà il dato da memorizzare 2) il secondo elemento sarà un puntatore ad una struttura dello stesso tipo. La chiave delle liste è l'elemento puntatore che non fa altro che puntare ad una nuova zona di memoria dove verrà creata un'altra struttura di tipo lista: Codice:
struct TipoLista
{
char elemento;
struct TipoLista *next;
};
Nel main per utilizzare questa struttura avrai una dichiarazione di variabile di questo tipo: Codice:
int main()
{
struct TipoLista *lista
...
...
}
Codice:
lista=(struct TipoLista *)malloc(sizeof(struct TipoLista)); 1) il valore (nel nostro caso un CHAR) magari lo riempiamo col nostro dato 2) il puntatore lo poniamo a NULL in modo da sapere che non ci sono nuovi elementi: Codice:
lista->elemento=... lista->next=NULL Codice:
#include <stdio.h>
struct TipoLista
{
char elemento;
struct TipoLista *next;
};
int main()
{
struct TipoLista *lista;
//alloco memoria per il primo elemento
lista=(struct TipoLista *)malloc(sizeof(struct TipoLista));
//riempio il primo elemento
lista->elemento='a';
lista->next=NULL;
//alloco memoria per il secondo elemento
lista->next=(struct TipoLista *)malloc(sizeof(struct TipoLista));
//riempio il secondo elemento
lista->next->elemento='b';
lista->next->next=NULL;
//stampo i primi due elementi
printf("primo: %c\n", lista->elemento);
printf("secondo: %c\n", lista->next->elemento);
system("PAUSE");
return 0;
}
Ovviamente per aggiungere un elemento lo si può fare in due modi: 1) aggiungere i nuovi elementi sempre in testa alla lista (più semplice) 2) aggiungere i nuovi elementi sempre in coda alla lista (più "complicato" in quanto per poterlo aggiungere in coda devi scorrere tutta la lista sino all'ultimo elemento in modo da poter fare l'assegnazione lista->next=...) Per eliminare un elemento dalla lista invece bisogna: 1) liberare la cella di memoria utilizzare (es: free(lista)) 2) porre a NULL il puntatore a next dell'elemento precedente a quello eliminato Codice:
//elimino il secondo elemento dalla lista
free(lista->next);
lista->next=NULL;
if (lista->next!=NULL)
printf("secondo: %c\n", lista->next->elemento);
__________________
| Athlon XP Barton 3000+ | CoolerMaster HAC-V81 | ASUS A7N8X DELUXE v2.0 | 2*256 PC3200 + 1*512 PC3200 = 1GB DDR400| ATI Radeon 9250 | HD 80Gb Maxtor SATA | Ali Q-TEC 550W Dual Fan GOLD PFC Ultima modifica di leadergl : 23-01-2006 alle 10:12. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: May 2003
Città: Milano
Messaggi: 2894
|
grazie mille mi hai chiarito un bel po' di dubbi.
un'altra domanda, quando uso il malloc a cosa serve la parte (struct tipolista *) prima di malloc? nel mio libro nn la usa usa direttamente malloc, cosa cambia? da quel che ho capito fa in modo che il puntatore che riceve il risultato di malloc sia un puntatore alla struttura, ma allora perchè nel mio libro nn lo usa?
__________________
P4 2.8 NorthwoodC - 2x256 vitesta ddr500 + 1GB Kingston ddr400 - P4C800-Deluxe - SAPPHIRE Radeon X1950pro 512MB AGP - Samsung 931BW Macbook Alu |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1455
|
Quote:
__________________
Ciao ~ZeRO sTrEsS~ |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: May 2003
Città: Milano
Messaggi: 2894
|
ok, come inserire i dati dovrei averlo capito, ma ora nn capisco come farglieli stampare, a me pare di far giusto ma nn viene.
date un'occhiata pls grazie Codice:
#include <stdio.h>
#include <stdlib.h>
struct elenco{ int elem;
struct elenco *prox;};
typedef struct elenco lista;
void inizializza(lista *pointer);
void inserisci(lista *pointer,int elemento);
void stampa(lista *pointer);
main()
{
int a,b,i;
lista *lista1;
inizializza(lista1);
printf("quanti elementi vuoi inserire?" ); scanf("%d",&a);
for (i=0;i<a;i++)
{
printf("inserire elemento ");
scanf("%d",&b);
inserisci(lista1,b);
}
for (i=0;i<a;i++)
{
stampa(lista1);
}
getch();
return 0;
}
void inizializza(lista *pointer)
{pointer=NULL;}
void inserisci(lista *pointer,int elemento)
{
lista *punt;
punt=malloc(sizeof(lista));
punt->elem=elemento;
punt->prox=pointer;
pointer=punt;
}
void stampa(lista *pointer)
{
lista *punt;
punt=pointer;
printf("%d\n",punt->elem);
punt=punt->prox;
}
__________________
P4 2.8 NorthwoodC - 2x256 vitesta ddr500 + 1GB Kingston ddr400 - P4C800-Deluxe - SAPPHIRE Radeon X1950pro 512MB AGP - Samsung 931BW Macbook Alu |
|
|
|
|
|
#6 |
|
Junior Member
Iscritto dal: Jan 2006
Messaggi: 7
|
Funzione di stampa
La funzione di stampa da tè implementata è sostanzialmente giusta, manca l'inserimento di un ciclo while che controlli quando finisca la lista.
Per cui la funzione di stampa è la seguente : void stampa(lista *pointer) { lista *punt; punt=pointer; while (punt!=NULL) { printf("%d\n",punt->elem); punt=punt->prox; } } Se hai altri problemi fammi sapere! Consiglio: commenta il codice in quanto puoi avere delle difficoltà future per codici + complicati. |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: May 2003
Città: Milano
Messaggi: 2894
|
quindi mi crashava perchè nn mettendo il while alla fine punt andava a puntare una zona di memoria che nn poteva puntare?
grazie dell'aiuto
__________________
P4 2.8 NorthwoodC - 2x256 vitesta ddr500 + 1GB Kingston ddr400 - P4C800-Deluxe - SAPPHIRE Radeon X1950pro 512MB AGP - Samsung 931BW Macbook Alu |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: May 2003
Città: Milano
Messaggi: 2894
|
ho messo la funzione con dentro il while, ma crasha lo stesso. come la devo usare nel main? chiamarla una volta sola o usare un for cmq? in entrambi i casi crasha!
__________________
P4 2.8 NorthwoodC - 2x256 vitesta ddr500 + 1GB Kingston ddr400 - P4C800-Deluxe - SAPPHIRE Radeon X1950pro 512MB AGP - Samsung 931BW Macbook Alu |
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
Quote:
|
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: May 2003
Messaggi: 1113
|
Quote:
Codice:
#include <stdio.h>
#include <stdlib.h>
// Dichiarazione Struttura Lista
typedef struct TipoLista
{
int elem;
struct TipoLista *next;
}list;
// Prototipi delle funzioni
list *inserisci(list *pointer,int elemento);
int stampa(list *pointer, int pos);
// Main del programma
main()
{
int a,b,i;
list *lista;
lista=(list *)malloc(sizeof(list));
printf("Quanti elementi vuoi inserire?");
scanf("%d",&a);
printf("\n");
for (i=0;i<a;i++)
{
printf("Inserire elemento %i: ",(i+1));
scanf("%d",&b);
lista=inserisci(lista,b);
}
printf("\n");
for (i=0;i<a;i++)
{
printf("Estraggo elemento %i: %i \n", i+1, stampa(lista,i) );
}
getch();
return 0;
}
// Procedura inserimento in lista
list *inserisci(list *pointer,int elemento)
{
list *punt=(list *)malloc(sizeof(list));
punt->elem=elemento;
punt->next=pointer;
return punt;
// test sull'inserimento
printf("Ho correttamente inserito: %i\n\n", pointer->elem);
}
// Procedura per estrarre i numeri gli elementi da una lista
int stampa(list *pointer, int pos)
{
list *punt;
punt=pointer;
while(pos>0)
{
punt=punt->next;
pos--;
}
return punt->elem;
}
__________________
| Athlon XP Barton 3000+ | CoolerMaster HAC-V81 | ASUS A7N8X DELUXE v2.0 | 2*256 PC3200 + 1*512 PC3200 = 1GB DDR400| ATI Radeon 9250 | HD 80Gb Maxtor SATA | Ali Q-TEC 550W Dual Fan GOLD PFC |
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: May 2003
Città: Milano
Messaggi: 2894
|
ok quello che mi hai postato va. mi fate capire cosa nn va bene in quello che facevo io pls. grazie
Codice:
#include <stdio.h>
#include <stdlib.h>
struct el{int elem;
struct el *prox;};
typedef struct el lista;
void inizializza(lista *pointer);
void inserisci(lista *pointer,int a);
void stampa(lista *pointer);
main()
{
lista *lista1;
int a,i,b;
inizializza(lista1);
printf("numero di elementi: "); scanf("%d",&b);
for (i=0;i<b;i++)
{
printf("inserire elemento "); scanf("%d",&a);
inserisci(lista1,a);
}
stampa(lista1);
}
void inizializza(lista *pointer)
{pointer=NULL;}
void inserisci(lista *pointer,int a)
{
lista *punt;
punt=(lista*)malloc(sizeof(lista));
punt->elem=a;
punt->prox=pointer;
pointer=punt;
}
void stampa(lista *pointer)
{
lista *punt; //cursore
punt=pointer;
while(punt!=NULL){
printf("%d", punt->elem);
punt=punt->prox;}
}
__________________
P4 2.8 NorthwoodC - 2x256 vitesta ddr500 + 1GB Kingston ddr400 - P4C800-Deluxe - SAPPHIRE Radeon X1950pro 512MB AGP - Samsung 931BW Macbook Alu |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:37.



















