PDA

View Full Version : lista in C: problema!


cicoandcico
18-09-2003, 17:10
#include <stdio.h>
#include <stdlib.h>
#define max 6

struct nodo
{
float inf;
int k;
struct nodo *next;
};

struct nodo *build(struct nodo *, float value, int);
int findK(struct nodo *, float);
float findINF(struct nodo *, int);
struct nodo *order(struct nodo *, struct nodo *);
void stampa(struct nodo *);

int main()
{
struct nodo *lista = NULL, *lista1=NULL;
float V1[max];
int i;
float min;
printf("Inserire dati:\n");
for (i=0;i<max;i++) scanf("%f", &V1[i]);
for (i=0;i<max;i++) lista=build(lista, V1[i], i);
if (lista != NULL) min=lista->inf;
printf("L'indice del valore minimo e' %d.\n",findK(lista,min));
printf ("Nella posizione 3 c'e' il valore %f.\n",findINF(lista, 3));
lista1=order(lista1,lista);
stampa(lista1);
system("pause");
}

struct nodo *build(struct nodo *lista, float value, int i)
{
if (lista == NULL)
{
lista=(struct nodo *)malloc(sizeof(struct nodo));
lista->inf=value;
lista->k=i;
lista->next=NULL;
}
else lista->next=build(lista->next,value,i);
return lista;
}

int findK(struct nodo *lista, float min)
{
static i;
if (lista != NULL)
{
if (lista->inf < min)
{
min=lista->inf;
i=lista->k;
}
min=findK(lista->next, min);
}
return i;
}

float findINF(struct nodo *lista, int i)
{
float value;
if (lista != NULL)
{
if (i == lista->k) value=lista->inf;
else value=findINF(lista->next, i);
}
return value;
}

struct nodo *order(struct nodo *lista1, struct nodo *lista)
{
float min;
if (lista1 == NULL)
{
lista1=(struct nodo *)malloc(sizeof(struct nodo));
if (lista != NULL) min=lista->inf;
lista1->inf=findINF(lista, findK(lista,min));
XXXXXXX
lista1->next=NULL;
}
else lista1=order(lista1->next,lista);
return lista1;
}

void stampa(struct nodo *list)
{
if (list != NULL)
{
printf("%f ", list->inf);
stampa(list->next);
}
}

il programma costruisce una lista non ordinata a partire da un array, la
funzione findK trova l'indice del valore minimo e la findINF trova il valore
corrispondente all'indice k.
poi devo utilizzare la lista e SOLO le due funzioni sopra per costruire una
lista ordinata in modo crescente, con la funzione order. il fatto č che
trova il minimo della lista vecchia e lo mette
nella prima posizione della lista nuova, ma dopo prende sempre quello.
bisogna eliminarlo una volta trovato in modo che prenda il valore
immediatamente pių grande, ma non so come fare!

so con l'acqua alla gola AIUTOOOOOO.

cionci
19-09-2003, 08:18
Senza una funzione che cancella un certo elemento k dalla lista credo che sia quasi impossibile (a meno di scansionare tutti gli elementi della lista)...