Prog.Hu

Családfa készítése probléma

Keresés
Hírlevél

Családfa készítése

2013-09-09T00:29+02:00
pdv
pdvProg.Hu
regisztrált tag
nyitotta: pdv, idő: 2004.12.13. 20:22, moderátor: moderator, megoldás elfogadva: 1970.01.01. 01:00
  Értesítés változás esetén Felvétel kedvencekhez Küldés emailben

Kategóriák:Programozási nyelvek » C++

Sorrend:
Időzóna:
Oldalanként:
Oszd meg!
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.
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. előzmény

Ha nem tartasz sehol, az nagy baj. előzmény
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 !! előzmény
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!
előzmény
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. előzmény
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. előzmény
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.

előzmény
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. előzmény
Mi a túró az a RTFM, STFW? előzmény
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. előzmény
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) előzmény
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. előzmény
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?

előzmény
Már bocsánat, de mit érdekel engem, hogy hol van az első, vagy akármelyik elem fizikailag a memóriában? előzmény
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. előzmény
Oszd meg másokkal is!