PDA

View Full Version : Aiuto! :-(( non riesco a far funzionare la funzione di ordin


Micio82
08-09-2002, 02:25
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>


struct EL{
int car;
struct EL *prox;};

typedef struct EL elemlista;
typedef elemlista *lista;

void crea(lista *,int);
void stampalista(lista);
void ordinalista(lista,int);


main()
{
char invio;
int a,i=0;
lista primo=NULL;
clrscr();
while(a!=0)
{
scanf("%d",&a);
scanf("%c",&invio);
crea(&primo,a);
i=i+1;
}
stampalista(primo);
ordinalista(primo,i);
stampalista(primo);
invio = getch();
return 0;
}

void crea(lista *pprimo,int a)
{
lista curr,nuovo,prec;
nuovo = (lista)malloc(sizeof(elemlista));
if ((*pprimo)==NULL) *pprimo=nuovo;
else{
curr=*pprimo;
do
{
prec=curr;
curr=curr->prox;
} while(curr!=NULL);
prec->prox=nuovo;
}
nuovo->car=a;
nuovo->prox=NULL;
}


void stampalista(lista pprimo)
{
lista curr;
curr=pprimo;
while(curr!=NULL)
{
printf("%d ",curr->car);
curr=curr->prox;
}
}

void ordinalista(lista pprimo,int par)
{

int aus,i=0;
lista curr;
curr=pprimo;
for (i=0;i<par;i++)
{
while ((curr!=NULL) && ((curr+1)!=NULL))
{
if ((curr->car) > ((curr+1)->car))
{
aus=(curr->car);
curr->car=(curr+1)->car;
(curr+1)->car=aus;
}
curr=curr+1;
}
}
}

cionci
08-09-2002, 12:48
Questo è un algoritmo di ordinamento che mi sono inventato lì per lì...ci sono anche quelli canonici...magari con la ricorsione, ma non so se ti interessavano...

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>


struct EL{
int car;
struct EL *prox;
};

typedef struct EL elemlista;
typedef elemlista *lista;

void crea(lista *,int);
void stampalista(lista);
void ordinalista(lista *);
lista spostaInTesta(lista pprimo, lista curr, lista prec);

main()
{
char invio;
int a,i=0;
lista primo=NULL;
//clrscr();
while(a!=0)
{
scanf("%d",&a);
scanf("%c",&invio);
crea(&primo,a);
i=i+1;
}
stampalista(primo);
ordinalista(&primo);
stampalista(primo);
invio = getch();
return 0;
}

void crea(lista *pprimo,int a)
{
lista curr,nuovo,prec;
nuovo = (lista)malloc(sizeof(elemlista));
if ((*pprimo)==NULL) *pprimo=nuovo;
else{
curr=*pprimo;
do
{
prec=curr;
curr=curr->prox;
} while(curr!=NULL);
prec->prox=nuovo;
}
nuovo->car=a;
nuovo->prox=NULL;
}


void stampalista(lista pprimo)
{
lista curr;
curr=pprimo;
while(curr!=NULL)
{
printf("%d ",curr->car);
curr=curr->prox;
}
}

lista spostaInTesta(lista pprimo, lista curr, lista prec)
{
prec->prox = curr->prox;
curr->prox = pprimo;
return curr;
}

void ordinalista(lista *pprimo)
{
lista curr = *pprimo;
lista prec = *pprimo;
int cont = 0, start = 1, tot = 0, scambi = 0;

while(1)
{
++tot;
if(!curr->prox)
{
curr = *pprimo;
prec = *pprimo;
scambi += cont;
if(!cont) break;
cont = 0;
}
else
{
prec = curr;
curr = curr->prox;
}
if(!curr->prox) continue;
if(curr->prox->car < (*pprimo)->car)
{
++cont;
*pprimo = spostaInTesta(*pprimo, curr->prox, curr);
}
else if(curr->car > curr->prox->car)
{
++cont;
prec->prox = curr->prox;
spostaInTesta(curr, curr->prox, curr);
curr = prec->prox;
}
}
}

Usa il tag {code}{/code} (con le quadre al posto delle grafe) per mettere il codice almeno ti mantiene l'indentazione...

Micio82
08-09-2002, 13:33
ti ringrazio molto........funziona perfettamente!
approfitto della tua bravura....mi sai dire dove sbagliavo?il fatto è che anche la mia funzione mi sembrava giusta....

ti ringrazio in anticipo

:D

Micio82
08-09-2002, 13:55
scusa se posto ancora.....ce l'ho fatta a sistemare il mio.
ovviamente avevo fatto una cagata colossale con i puntatori alle strutture :-D


#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>


struct EL{
int car;
struct EL *prox;};

typedef struct EL elemlista;
typedef elemlista *lista;

void crea(lista *,int);
void stampalista(lista);
void ordinalista(lista,int);


main()
{
char invio;
int a,i=0;
lista primo=NULL;
clrscr();
while(a!=0)
{
scanf("%d",&a);
scanf("%c",&invio);
crea(&primo,a);
i=i+1;
}
stampalista(primo);
ordinalista(primo,i);
printf("\n");
stampalista(primo);
invio = getch();
return 0;
}

void crea(lista *pprimo,int a)
{
lista curr,nuovo,prec;
nuovo = (lista)malloc(sizeof(elemlista));
if ((*pprimo)==NULL) *pprimo=nuovo;
else{
curr=*pprimo;
do
{
prec=curr;
curr=curr->prox;
} while(curr!=NULL);
prec->prox=nuovo;
}
nuovo->car=a;
nuovo->prox=NULL;
}


void stampalista(lista pprimo)
{
lista curr;
curr=pprimo;
while(curr!=NULL)
{
printf("%d ",curr->car);
curr=curr->prox;
}
}

void ordinalista(lista pprimo,int par)
{

int aus,i=0;
lista curr;
for (i=0;i<par;i++)
{
curr=pprimo;
while ((curr!=NULL) && (curr->prox!=NULL))
{
if ((curr->car) > ((curr->prox)->car))
{
aus=(curr->car);
curr->car=(curr->prox)->car;
(curr->prox)->car=aus;
}
curr=curr->prox;
}
}
}

cionci
08-09-2002, 15:18
Originariamente inviato da Micio82
[B]scusa se posto ancora.....ce l'ho fatta a sistemare il mio.
ovviamente avevo fatto una cagata colossale con i puntatori alle strutture :-D

Eh già...quel +1 sui puntatori era un po' bruttino...

Comunque non avevo continuato sulla tua linea perchè non mi sembrava giusto l'approccio...tu lavori sulal lista come se fosse un vettore scambiando gli elementi di informazione...ora, quando è solo un carattere può andare bene...ma pensa se all'interno della struttara l'informazione fosse anche solo di qualche centinaio di kbyte... In quel caso il tuo algoritmo sarebbe lentissimo (dovrebbe fare lo swap di molti dati)...
L'approccio che ho usato io lavora sui puntatori scambiando solamente quelli...il contenuto informativo all'interno di ogni singolo elemento non viene mai modificato...ed in generale con le liste si preferisce lavorare sui puntatori...

Inoltre il tuo algoritmo ha una complessita costante pari a O(N^2)...mentre nel mio la complessità è più bassa (non l'ho quantificata comunque)...

Tanto per farti un esempio con 19 dati (gli stessi) il tuo fa 342 cicli e 90 scambi, mentre il mio 185 cicli e 57 scambi...

Questo non per vantarmi del mio algoritmo sia chiaro :), ma per farti notare le differenze sul genere di approccio usato...