|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Apr 2001
Città: pavia
Messaggi: 49
|
Aiuto! :-(( non riesco a far funzionare la funzione di ordin
#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; } } }
__________________
We can learn from the past, But those days are gone We can hope for the future, But there might not be one (A change of seasons - DreamTheater) |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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...
Codice:
#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;
}
}
}
|
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Apr 2001
Città: pavia
Messaggi: 49
|
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
__________________
We can learn from the past, But those days are gone We can hope for the future, But there might not be one (A change of seasons - DreamTheater) |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Apr 2001
Città: pavia
Messaggi: 49
|
scusa se posto ancora.....ce l'ho fatta a sistemare il mio.
ovviamente avevo fatto una cagata colossale con i puntatori alle strutture :-D Codice:
#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;
}
}
}
__________________
We can learn from the past, But those days are gone We can hope for the future, But there might not be one (A change of seasons - DreamTheater) |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
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 |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:57.



















