PDA

Visualizza la versione completa : [C] Problema inserimento in lista


Lasentinella
27-05-2007, 12:02
Ciao a tutti :)
Devo realizzare una coda che ha due metodi, uno (leggi) che riceve una sequenza di numeri interi (finché l'utente non ne inserisce uno negativo) e costruisce una lista, restituendo il puntatore alla testa.
L'altro metodo (inserisci ) inserisce nella lista un nuovo elemento x, mantenendo l'ordinamento e ritorna il puntatore al nodo inserito (da fare ricorsivamente).

Questa è la lista:


typedef struct nodo *lista;
struct nodo {
int x; /* Informazione. */
lista next; /* Puntatore al nodo successivo */
};


L'inserisci, che inserisce un nuovo elemento in ordine:


lista inserisci(lista *punt_lista, int x) {
lista temp;
if(*punt_lista == NULL || (*punt_lista)->x >=x){

temp = (lista)malloc(sizeof(struct nodo));
temp->x = x;
temp->next= *punt_lista;

}
else
inserisci(&temp->next, x);
return temp;


}

Del codice qui sopra mi sembra manchi l'istruzione che dice all'elemento precedente a quello inserito di puntare a temp, cioé inserisco temp ma non viene "agganciato alla coda"..ma non capisco come fare!



lista leggi(void) {
lista punt_lista;
lista temp;

int n;
printf("Immetti una sequenza di interi terminata da un numero negativo: ");
do{

scanf("%d",&n);

if(n>=0){

temp=(lista)malloc(sizeof(struct nodo));
if(!temp)
{
printf("Allocazione memoria non riuscita");
return NULL;
}
else{

inserisci(&(temp->next),n);

punt_lista=temp;
free(temp);
}
}


}while(n>=0);
return punt_lista;


Io passerei per argomento a di inserisci(&punt_lista,n); ,ovvero la lista che sto creando.. ma mi dà errore!!

edit: metto anche il main:


#include <stdio.h>
lista leggi(void);
int main(void)
{
lista L[5];
L[0]=leggi();
L[1]=leggi();
printf("\nL1=");
stampa(L[0]);
printf("\nL2=");
stampa(L[1]);
system("PAUSE");
return 0;
}


Anche se non scrivete il codice da modificare vi prego di spiegarmi cosa sbaglio! Grazie!
Ho cercato nel forum ma non ho trovato nulla di simile :cry:
:ciauz:

UltraBeginner
27-05-2007, 13:44
Originariamente inviato da Lasentinella
Ciao a tutti :)
Devo realizzare una coda che ha due metodi, uno (leggi) che riceve una sequenza di numeri interi (finché l'utente non ne inserisce uno negativo) e costruisce una lista, restituendo il puntatore alla testa.
L'altro metodo (inserisci ) inserisce nella lista un nuovo elemento x, mantenendo l'ordinamento e ritorna il puntatore al nodo inserito (da fare ricorsivamente).

Questa è la lista:


typedef struct nodo *lista;
struct nodo {
int x; /* Informazione. */
lista next; /* Puntatore al nodo successivo */
};


L'inserisci, che inserisce un nuovo elemento in ordine:


lista inserisci(lista *punt_lista, int x) {
lista temp;
if(*punt_lista == NULL || (*punt_lista)->x >=x){

temp = (lista)malloc(sizeof(struct nodo));
temp->x = x;
temp->next= *punt_lista;

}
else
inserisci(&temp->next, x);
return temp;


}

Del codice qui sopra mi sembra manchi l'istruzione che dice all'elemento precedente a quello inserito di puntare a temp, cioé inserisco temp ma non viene "agganciato alla coda"..ma non capisco come fare!



lista leggi(void) {
lista punt_lista;
lista temp;

int n;
printf("Immetti una sequenza di interi terminata da un numero negativo: ");
do{

scanf("%d",&n);

if(n>=0){

temp=(lista)malloc(sizeof(struct nodo));
if(!temp)
{
printf("Allocazione memoria non riuscita");
return NULL;
}
else{

inserisci(&(temp->next),n);

punt_lista=temp;
free(temp);
}
}


}while(n>=0);
return punt_lista;


Io passerei per argomento a di inserisci(&punt_lista,n); ,ovvero la lista che sto creando.. ma mi dà errore!!

edit: metto anche il main:


#include <stdio.h>
lista leggi(void);
int main(void)
{
lista L[5];
L[0]=leggi();
L[1]=leggi();
printf("\nL1=");
stampa(L[0]);
printf("\nL2=");
stampa(L[1]);
system("PAUSE");
return 0;
}


Anche se non scrivete il codice da modificare vi prego di spiegarmi cosa sbaglio! Grazie!
Ho cercato nel forum ma non ho trovato nulla di simile :cry:
:ciauz:

Uhm dando una rapida occhiata mi sembra che non metti mai a NULL l elemento next quando chiudi la lista....

Lasentinella
27-05-2007, 14:28
Ho provato ad aggiungere (punt_lista)->next=NULL;
dopo free(temp);


free(temp);
(punt_lista)->next=NULL;

ma non funziona comunque :bhò:
Comunque è vero, mancava anche questo :)

UltraBeginner
28-05-2007, 10:09
Originariamente inviato da Lasentinella
Ho provato ad aggiungere (punt_lista)->next=NULL;
dopo free(temp);


free(temp);
(punt_lista)->next=NULL;

ma non funziona comunque :bhò:
Comunque è vero, mancava anche questo :)

Ciao Sentinella,

prova questo codice, dovrebbe funzionare. Nei commenti ho messo un po di spiegazioni, spero ti siano utili



#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <math.h>

typedef struct nodo *lista;
struct nodo {
int x; /* Informazione. */
lista next; /* Puntatore al nodo successivo */
};

/* ======Funzione inserisci=========== */

lista inserisci(lista *punt_lista, int x)
{

lista temp,prov;

// Sono alla fine oppure l elemento corrente e maggiore del numero inserito
if((*punt_lista) == NULL || (*punt_lista)->x >=x)
{

temp = (lista)malloc(sizeof(struct nodo));

if(*punt_lista == NULL) // inserimento elemento al fondo
{
(*punt_lista)=temp;
(*punt_lista)->x=x;
(*punt_lista)->next=NULL; // siccome inserisco al fondo il prossimo campo sara NULL!
return *punt_lista;
}
else // inserimendo del nodo in mezzo alla coda
{
prov=(*punt_lista);
(*punt_lista)=temp;
(*punt_lista)->x=x;
(*punt_lista)->next=prov;
return *punt_lista;

}
}

// altrimenti la coda e ordinata e vado avanti
else
inserisci(&(*punt_lista)->next, x);


}

/* ===============================Funzione leggi================================*/
/* Restituisce la testa della coda come valore
/* mentre come riferimento restituisce l indirizzo dell ultimo elemento inserito*/
/*================================================= =============================*/

lista leggi(lista * lastpunt)
{
lista punt_lista;

int n,flag=1;


printf("Immetti una sequenza di interi terminata da un numero negativo: ");
do
{
scanf("%d",&n);

if(n>=0)
{
if(flag) // Prima iterazione, creo la testa della coda!!!!
{
punt_lista=(lista)malloc(sizeof(struct nodo));
if(!punt_lista)
{
printf("Allocazione memoria non riuscita");
return NULL;
}
punt_lista->x=n;
punt_lista->next=NULL;
flag =0; // flag=0, in questo modo non creo sempre delle teste!
}
else
*lastpunt=inserisci(&punt_lista,n); // creazione altri nodi della coda
}
}while(n>=0);
return punt_lista; // restituisco la testa della coda
}

int main()
{
lista L[5],lastpunt,temppunt;
L[0]=leggi(&lastpunt);

temppunt=L[0];

/* Ciclo di stampa, utile per il debug*/
while(temppunt!=NULL)
{
printf("%d\n",temppunt->x);
temppunt=temppunt->next;
}


system("pause");

}


Saluti e buona settimana!!! :ciauz: :ciauz:

Lasentinella
28-05-2007, 10:41
Perfetto! Non so come avrei fatto senza il tuo aiuto, grazie infinite!!!!
Il programma è chiarissimo e i commenti che hai messo sono utilissimi :)

Grazie ancora!
Ciao e buona settimana :ciauz:

UltraBeginner
28-05-2007, 11:55
Originariamente inviato da Lasentinella
Perfetto! Non so come avrei fatto senza il tuo aiuto, grazie infinite!!!!
Il programma è chiarissimo e i commenti che hai messo sono utilissimi :)

Grazie ancora!
Ciao e buona settimana :ciauz:

Figurati!! :)

Cmq dimenticavo...bisogna deallocare la memoria occupata dalla coda a fine programma con una free!!

Buon lavoro!! Saluti! :ciauz: :ciauz: :ciauz:

Lasentinella
04-06-2007, 15:17
Stavo riguardando il metodo elimina che deallochi lo spazio occupato dalla lista...secondo voi libera lo spazio oppure cancella solo temp questo codice?



void elimina(lista *p_L){
while(*p_L!=NULL){
if(*p_L!=NULL){
lista tmp = (lista)malloc(sizeof(struct nodo));
tmp = *p_L;
*p_L = (*p_L)->next;
free(tmp);
}
}
}



Perché, provando a stampare la lista dopo elimina(), non ottengo nessun elemento, ma non so se succede perché è stata disallocata oppure se è SOLO il risultato di *p_L = (*p_L)->next;

:D Grazie

UltraBeginner
04-06-2007, 15:26
Originariamente inviato da Lasentinella
Stavo riguardando il metodo elimina che deallochi lo spazio occupato dalla lista...secondo voi libera lo spazio oppure cancella solo temp questo codice?



void elimina(lista *p_L){
while(*p_L!=NULL){
if(*p_L!=NULL){
lista tmp = (lista)malloc(sizeof(struct nodo));
tmp = *p_L;
*p_L = (*p_L)->next;
free(tmp);
}
}
}



Perché, provando a stampare la lista dopo elimina(), non ottengo nessun elemento, ma non so se succede perché è stata disallocata oppure se è SOLO il risultato di *p_L = (*p_L)->next;

:D Grazie

Credo che sia giusto quello che tu abbia fatto :)

:ciauz: :ciauz:

Loading