Multilista

Kezdőlap Fórumok Programozás Multilista

7 bejegyzés megtekintése - 11-17 / 17
  • Szerző
    Bejegyzés
  • #1935368
    pointux
    Felhasználó

      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.

      #1935369
      pointux
      Felhasználó

        A 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.

        #1935370
        Morzel
        Felhasználó

          A qsort() része az ANSII szabványnak?
          Sajnos most nincs nálam a C könyv.

          #1935371
          pointux
          Felhasználó

            A prototípusa az stdlib.h fileban van.

            Ezen a címen nézheted, hogyan mûködik:
            http://www.cplusplus.com/ref/cstdlib/qsort.html

            Az 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.

            #1935372
            pointux
            Felhasználó

              Pé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 3

              O: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].

              #1935373
              Morzel
              Felhasználó

                Na 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;
                }


                #1873386
                csaba
                Felhasználó
                7 bejegyzés megtekintése - 11-17 / 17
                • Be kell jelentkezni a hozzászóláshoz.