Salve ragazzi,
sto programmando un pochino in C e devo concatenare alcuni oggetti. Il problema è che non so a priori quanti oggetti dovrò concatenare e quindi ho usato, nella mia ignoranza, una lista...ho visto, però, che in termini di efficienza (ripstto ad un altro porgramma) ci perdo. Sapete se c'è un modo più intelligente/efficiente per concatenare oggetti (nel mio caso o int o double)? Questo è il codice che uso per creare, riempire, visualizzare la lista
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
/* elemento della lista */
struct elemento{
int x;
struct elemento *next;
};
void ins_lista(int n, struct elemento **lista);
void stampa_lista(struct elemento *lista);
void svuota(struct elemento **lista);
#if 1
int main(){
struct elemento *lista=NULL; //puntatore nullo ad una lista
int i,p;
for(i=0;i<VAL;i++){
printf("inserisci un numero: ");
scanf("%d",&p);
/* funzione di inserimento (si possono
scegliere 3 tipi di inserimento) */
ins_lista(p,&lista);
}
stampa_lista(lista);
// svuota(&lista);
// stampa_lista(lista);
}
#endif
void stampa_lista(struct elemento *lista){
struct elemento *tmp;
int i=0;
tmp=lista;
while(tmp){ /* equivale a scrivere while(tmp!=NULL) */
printf("elemento: %d\n",tmp->x);
tmp=tmp->next;
i++;
}
printf("in questa lista ci sono %d elementi\n",i);
}
/* funzione che cancella tutti gli elementi della lista */
void svuota(struct elemento **lista){
struct elemento *tmp;
if(*lista==NULL)
return;
else{
tmp=*lista;
*lista=(*lista)->next;
free(tmp);
svuota(&(*lista));
/* funzione ricorsiva che richiama se stessa ma con
l’indirizzo del puntatore successivo */
}
}
void ins_lista(int n, struct elemento **lista){
struct elemento *new;
if(*lista==NULL){
//controllo per verificare se la lista e’ vuota
new=(struct elemento *)malloc(sizeof(struct elemento));
new->x=n;
new->next=NULL;
*lista=new;
}
else
ins_lista(n, &(*lista)->next);
/* viene richiamata la funzione ricorsivamente fino a quando non
si raggiunge la fine della lista */
}
sto programmando un pochino in C e devo concatenare alcuni oggetti. Il problema è che non so a priori quanti oggetti dovrò concatenare e quindi ho usato, nella mia ignoranza, una lista...ho visto, però, che in termini di efficienza (ripstto ad un altro porgramma) ci perdo. Sapete se c'è un modo più intelligente/efficiente per concatenare oggetti (nel mio caso o int o double)? Questo è il codice che uso per creare, riempire, visualizzare la lista
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
/* elemento della lista */
struct elemento{
int x;
struct elemento *next;
};
void ins_lista(int n, struct elemento **lista);
void stampa_lista(struct elemento *lista);
void svuota(struct elemento **lista);
#if 1
int main(){
struct elemento *lista=NULL; //puntatore nullo ad una lista
int i,p;
for(i=0;i<VAL;i++){
printf("inserisci un numero: ");
scanf("%d",&p);
/* funzione di inserimento (si possono
scegliere 3 tipi di inserimento) */
ins_lista(p,&lista);
}
stampa_lista(lista);
// svuota(&lista);
// stampa_lista(lista);
}
#endif
void stampa_lista(struct elemento *lista){
struct elemento *tmp;
int i=0;
tmp=lista;
while(tmp){ /* equivale a scrivere while(tmp!=NULL) */
printf("elemento: %d\n",tmp->x);
tmp=tmp->next;
i++;
}
printf("in questa lista ci sono %d elementi\n",i);
}
/* funzione che cancella tutti gli elementi della lista */
void svuota(struct elemento **lista){
struct elemento *tmp;
if(*lista==NULL)
return;
else{
tmp=*lista;
*lista=(*lista)->next;
free(tmp);
svuota(&(*lista));
/* funzione ricorsiva che richiama se stessa ma con
l’indirizzo del puntatore successivo */
}
}
void ins_lista(int n, struct elemento **lista){
struct elemento *new;
if(*lista==NULL){
//controllo per verificare se la lista e’ vuota
new=(struct elemento *)malloc(sizeof(struct elemento));
new->x=n;
new->next=NULL;
*lista=new;
}
else
ins_lista(n, &(*lista)->next);
/* viene richiamata la funzione ricorsivamente fino a quando non
si raggiunge la fine della lista */
}
Commenta