Prog.Hu

Családfa készítése
0

2013-09-09T00:29+02:00
pdv
pdvProg.Hu
regisztrált tag
Programozásra a tanár feladott egy nagy házi feladatot. Melyben családfát kell csinálni (láncoltan). Szerencsére azzal a kikötéssel, hogy egy embernek 2 gyereke lehet csak, és feleségeket/férjeket nem kell feltüntetni. A feladat továbbá: Valósítson meg egy fát, melybe tetszés szerinti helyre be lehet szúrni elemet. Az elemek legyenek stringek! A fa bejárását és a beszúrást/módosítást szöveges inputról lehessen vezérelni.
Már csak pár nap van hátra, és nem tartok sehol. Kérlek segítsetek, mert sok múlik rajta.
Mutasd a teljes hozzászólást!
Családfa készítése
2013-09-09T00:29+02:00
pdv
pdvProg.Hu
regisztrált tag
Köszönöm mindenkinek a hozzászólást. Végül sikerült nagyon faszán megírni. Már kezdem vágni a mutatókat. Kiderült hogy mégis kell hogy tudja a program, hogy egy szülőnek több gyereke is legyen. Két irányú láncolt listával lett megoldva (a beszúrás, és keresés miatt). Még egyszer köszönöm, sokat segítettetek.
Mutasd a teljes hozzászólást!
Oszd meg másokkal is!

Ha nem tartasz sehol, az nagy baj.
Mutasd a teljes hozzászólást!
sok múlik rajta


Hát ez bizony ciki
Rajtad múlik, hogy a feladat megoldódik-e.
Szvsz addig ne is gyere ide, amíg nem gondolkodtál rajta semmit. Mellesleg RTFM,STFW !!
Mutasd a teljes hozzászólást!
Miben akarod írni? Én meg is írom neked, mert van már vmi hasonló progikezdeményem, de az elég durván assembly... Ha jó, írj vissza!
Mutasd a teljes hozzászólást!
Nem értek a C++-hoz, de a feladat magja egy nagyon egyszerű recordláncolás. Persze szülő-gyerek objektum öröklődéssel is megoldható.
A beszúrásokat nem értem pontosan, családfa szempontjából. Arról van szó, hogy egy új ágat létrehozni, vagy egy kész ágba beszúrni egy "elfelejtett" őst? Továbbá nem értem azt sem, mit akar jelenteni a szöveges inputról vezérlés. Ilyeneket, hogy "jobbra, balra, fel, le, beszúr, kivesz"? Vagy mi?

Maga a fűzött recordstruktúra így néz ki:

szülőrecord:
neve - string
gyerek1 - szülőrecordra mutató pointer
gyerek2 - szülőrecordra mutató pointer

ahol minkét "gyerekpointer" a semmibe mutat, ott a faág elhal, ahol csak az egyik, az egy lineáris ág, ahol egyikse, ott elágazás van.
Mutasd a teljes hozzászólást!
Szvsz éppen fordítva. Egy ember, egy rekord, és nem egy szülő, két gyerek.
És a balra fel, stb. rájössz, hogy nem jó, mert itt csak egy őse van mindenkinek, hiszen mint írva van, feleségeket, férjeket nem kell feltünteni. De már többet írtam, mint kellene.
Mutasd a teljes hozzászólást!
Nézőpont kérdése.
A bináris fát felülről lefelé szerteágazónak szokták ábrázolni, a családfát pedig felfelé. Persze, ha le- és felfelé is akarunk mozogni a családfában, akkor kell még egy szülőre mutató "szülőrecordra mutató pointer" is.

Mutasd a teljes hozzászólást!
Olyan pályáról vagyok, ahol az ábrázológeometria lexemetebb tételeinek megoldása az alapfeltételt adták a folytatáshoz. Ezért nekem nincs fent, lent, meg más efféle bohóság. Automatikusan transzformálom magam bármely rendszerbe. Most például vízszintesbe. Hi.
Mutasd a teljes hozzászólást!
Mi a túró az a RTFM, STFW?
Mutasd a teljes hozzászólást!
Eddig csak gondolkodtam a feladaton. Azt gondolom, hogy azt kéne csinálni, hogy minden lánc egy ember. Minden lánc tartalmazza a nevet, két mutatót a két gyerekre, és egy mutatót, a szülőre. Szerintem még tartalmazhatná azt is hogy hányadik generációban van. Ennek csupán a megvalósításával van a baj, mert ezek a pointerek kikészítenek.
Mutasd a teljes hozzászólást!
1. Nem lánc, esetleg láncszem.
2. Ha vízszintesen is akarsz mozogni a családfán, ajánlom, hogy a gyerekeknél különböztesd meg a jobb- és baloldali gyereket. Jelentősen megkönnyítheti az algoritmust (majd ha odajutsz - ezzel a sebességgel kb. 2 év múlva)
Mutasd a teljes hozzászólást!
Most nem vagyok biztos benne, hogy ez e a láncolt lista:

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

struct
{
  char nev[20];
  void *szulo;
  void *gyerek[2];
} tag[10];

main()
{
  stdcpy( tag[0].nev, "Kovacs Bela" );
  *gyerek[0]=tag[1];
  *gyerek[1]=tag[2];

  stdcpy( tag[1].nev, "Kovacs Lajos" );
  *szulo=tag[0];
  *gyerek[0]=tag[3];

  stdcpy( tag[2].nev, "Kovacs Ilonka" );
  *szulo=tag[0];
  *gyerek[0]=tag[4];
  *gyerek[1]=tag[5];
}

Már nem emlékszem rá, hogy hogyan is néz ki egy láncolt lista, mint már mondtam és nincs is szakirodalom a kezemben, így valószínűnek tartom, hogy nem így néz ki.

Amúgy tényleg gondolkodhattál volna rajta, de legalább utánanézhetnél mi az a láncolt lista, ha én már nem tehetem.
Mutasd a teljes hozzászólást!
Ha idegesítenek a pointerek, van egy nagyon jó hírem.
A láncolt lista egy dinamikusan lefoglalt, és akár véletlenszerű helyeken lévő memóriaterületek halmaza.
Ha egy új elemet kell létrehozni, a malloc függvénnyel kérsz egy területet az operációs rendszertől. Az majd választ. De nem tudsz egy bizonyos területet lefoglalni.
Ezek a lefoglalt területek úgy kapcsolódnak egymáshoz, hogy amikor a programod lefoglal egy új elemet, annak memóriacímét beírja az azt közvetlenül megelőzően létrehozott rekord arra szolgáló mezőjébe. Vagyis egy láncolt lista minden rekordja tartalmaz egy mutatót, ami a következő elemre mutat. Ha egy láncszemet törölsz, az azt követő elemek elvesznek, ha nem gondoskodsz róla.
A családfa nem lineáris elemhalmaz, hanem éppen 'fa', azaz az egymást követő elemek között nincs kötelező sorrend. Tehát okoskodással sem jutsz semmire, már olyasfélével, hogy ha Pista bácsi bal unokájára van szükség, elég x előrelépés. Az unoka bárhol lehet.
A jó hír tehát az, hogy ez a sok mutató, amit elképzeltek, nem létezik. Honnan tudná a program, amikor betölti az első rekordját, hol fog lenni pl. a baloldali gyerek a memóriában? Vagy hol lesz az apja?

Mutasd a teljes hozzászólást!
Már bocsánat, de mit érdekel engem, hogy hol van az első, vagy akármelyik elem fizikailag a memóriában?
Mutasd a teljes hozzászólást!
Köszönöm mindenkinek a hozzászólást. Végül sikerült nagyon faszán megírni. Már kezdem vágni a mutatókat. Kiderült hogy mégis kell hogy tudja a program, hogy egy szülőnek több gyereke is legyen. Két irányú láncolt listával lett megoldva (a beszúrás, és keresés miatt). Még egyszer köszönöm, sokat segítettetek.
Mutasd a teljes hozzászólást!
Oszd meg másokkal is!