Kezdőlap › Fórumok › Programozás › Multilista
- This topic has 16 hozzászólás, 4 résztvevő, and was last updated 21 years, 2 months telt el by
Morzel.
-
SzerzőBejegyzés
-
2004-04-02-11:12 #1935368
A második rész egyszerû még indexfile-t sem hoznék létre (persze, ha jól értem a kiírás szerint létre kell hozni), mert a karakterek száma mindig ugyanannyi, és eleve az adatokat érkezési sorrendben érdemes tárolni.
Ahhoz, hogy az elsõ rész mindig napra kész legyen, miden beérkezõ adat után indexelni kell.
Van egy gyorsrendezõ algoritmus, aminek még a neve sem jut eszembe, mert vagy 6 éve tanultam. (Mert a legtöbb rendezõ azt hiszem olyan, hogy az elemek számával négyzetesen nõ az idõ.)Egyenlõre, ennyi, majd átgondolom az algoritmust.
2004-04-02-11:56 #1935369A legegyszerûbb megoldás a qsort beépített c függvénnyel rendezni, persze külön kell választani az osztályzatokat, amelyeket késõbb a rendezéssel a kóddal kell vinni. Ez már multilistának tûnik. De lehet azzal bonyolítani, ill gyorsítani az algoritmust az elsõ betûk külön indexelésével.
2004-04-02-12:28 #1935370A qsort() része az ANSII szabványnak?
Sajnos most nincs nálam a C könyv.2004-04-02-13:56 #1935371A prototípusa az stdlib.h fileban van.
Ezen a címen nézheted, hogyan mûködik:
http://www.cplusplus.com/ref/cstdlib/qsort.htmlAz algorimusra, már nem emlékszem, de nem úgy mûkszik, hogy sorban végignézi és összehasonlítja az elemeket. Valahogy másképp, ezért gyorsabb.
2004-04-02-14:08 #1935372Példa is van, de a helyzet az oldalonszereplõ példánál bonyolultabb, mert egy 2D mátrixot kell építeni, melyben a jegy és a kód külön szerepel, és egyik indexe (pl.: sor) tartja õket össze. Rendezés csak a kód oszlop szerint történhet úgy hogy mindkét oszlop rendezõdjön.
1 2
1 WSFGBZ 5
2 HZHBHJ 3O:oszlop
S: sor
Rendezés 1 oszlop szerint, ha [O1][S1] ] [O1][S2], akkor [O1][S2] érték mellett [O2][S2] elõbbre kerül, mint [O1][S2] és [O2][S2].2004-04-05-06:49 #1935373Na a végére meg lett 🙂
Ha valakit érdekel:
/* sorokat olvas be szabvanyos bemenetrol. A sorok egy erdemjegyet es egy
Neptun-kodot tartalmaznak vesszovel elvalasztva. A sorok szama tetszoleges.
A program EOF-ig olvas. Kilistazza Beptun-kod szerint, majd erkezesi sorrend
szerint az adatokat. */#include”stdio.h”
#include”stdlib.h”
#include”string.h”#define SORHOSSZ 10
/* a listaelemet tarolo struktura */
typedef struct elem
{
unsigned int jegy; /* az erdemjegy */
char *neptun; /* a neptunkod */
struct elem *kov1; /* a kovetkezo listaelem az elso listaban */
struct elem *kov2; /* a kovetkezo listaelem a masodik listaban */
}elem;elem *fej1 = NULL; /* az elso lista feje */
elem *fej2 = NULL; /* a masodik lista feje */int kissebb(char *s1, char *s2) /* osszehasonlit ket szovaget */
{
int i=0;while (s1 == s2)
i++;if (s1 jegy = jegy;
ujelem->neptun = neptun;
ujelem->kov1 = NULL;
ujelem->kov2 = NULL;return ujelem;
}char *szovegdupl(char s[]) /* karaktersorozat duplazasa */
{
char *p;p = (char *) malloc(strlen(s) + 1);
if (p != NULL)
strcpy(p, s);
return p;
}void beilleszt(unsigned int jegy, char *neptun) /* uj elem a multilistaba */
{
elem *ujelem, *p = fej1;if (fej1 == NULL) { /* ha ures a multilistank */
fej1 = fej2 = foglal_elem(jegy, szovegdupl(neptun));
return;
}ujelem = foglal_elem(jegy, szovegdupl(neptun));
/* megkeressuk a helyet az elso listaban */if (kissebb(fej1->neptun, neptun)) {
while (p->kov1 && kissebb(p->kov1->neptun, neptun))
p = p->kov1;ujelem->kov1 = p->kov1;
p->kov1 = ujelem;
}
else {
ujelem->kov1 = fej1;
fej1 = ujelem;
}/* hozzafuzzuk a masodik listahoz */
p = fej2;
while (p->kov2)
p = p->kov2;
p->kov2 = ujelem;return;
}elem *lista_torol(elem *p) /* a mutilista felszabaditasa */
{
elem *tmp;while (p) {
tmp = p->kov1;
free(p);
p = tmp;
}return NULL;
}main() {
elem *akt;
char neptun[SORHOSSZ]; /* az aktualis sornak */
unsigned int jegy; /* az aktualis erdemjegynek */while (scanf(„%u,%s”, &jegy, neptun) != EOF) /* adatok bekerese */
beilleszt(jegy, neptun); /* lancolas */akt = fej1; /* az elso lista kiirasa */
while (akt != NULL) {
printf(„%u %sn”, akt->jegy, akt-> neptun);
akt = akt->kov1;
}
printf(„—n”);
akt = fej2; /* a masodik lista kiirasa */
while (akt != NULL) {
printf(„%u %sn”, akt->jegy, akt-> neptun);
akt = akt->kov2;
}lista_torol(fej1); /* a mulitilista torlese */
system(„PAUSE”);
return 0;
}
2009-12-04-19:56 #1873386 -
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.
legutóbbi hsz