Lineární spojové seznamy – Delphi – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Lineární spojové seznamy – Delphi – Fórum – Programujte.comLineární spojové seznamy – Delphi – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Dane0
Newbie
28. 2. 2012   #1
-
0
-

Dobrý den,

potřebovala bych poradit jak vypadá programový kód v Delphi. Mám dva stejně dlouhé seznamy (s prvky x1, x2, x3 a y1, y2, y3) s nichž se má vytvořit třetí lineární seznam, který bude sloučením obou stávajících. Nový lineární seznam má obsahovat prvky x1, y1, x2, y2, x3, y3 a v průběhu vytváření třetího seznamu se má uvolňovat prvky původních seznamů z paměti.

(Odpověď jsem hledala na google, ale stále tomu nerozumím, proto se obracím na Vás s prosbou o radu).

děkuju předem

Nahlásit jako SPAM
IP: 193.85.21.–
KIIV
~ Moderátor
+43
God of flame
28. 2. 2012   #2
-
0
-

zalezi na tom jestli uz ty seznamy mas nebo je musis teprve udelat...

Velice zhruba jde o nekolik prvku samostatne v pameti, ktere na sebe odkazuji pomoci adres v pameti...

tj. prvni prvek ma taky adresu kde je druhy, druhy ma adresu kde je treti, a treti ma adresu nastavenou na null (nil) aby se dalo poznat ze uz nepokracuje... krome adres musi kazdy prvek obsahovat i hodnotu

(a ty prvky seznamu se samozrejme v pameti vytvareji az za behu)

tj. co potrebujes: ukazatele, dynamicka pamet, struktury

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Dane0
Newbie
28. 2. 2012   #3
-
0
-

#2 KIIV
ten první seznam je daný a ten druhý vytvořený:

implementation

{$R *.dfm}

type
  Pvag=^vag;
  vag = record
    obsah: Byte;
    pocet: Integer;
    dalsi: Pvag;
  end;

var p: Pvag;

procedure TForm1.Button1Click(Sender: TObject);
var r, n, q: Pvag;
begin
new(r);
r^.obsah:=30;
r^.dalsi:=nil;

new(n);
n^.obsah:=70;
n^.dalsi:=nil;
r^.dalsi:=n;

new(q);
q^.obsah:=200;
q^.dalsi:=nil;
n^.dalsi:=q;

Nahlásit jako SPAM
IP: 193.85.21.–
KIIV
~ Moderátor
+43
God of flame
28. 2. 2012   #4
-
0
-

no ted musis nekam ty zacatky ulozit ... pak uz akorat na preskacku davat do toho tretiho... a pokud mas mazat polozky z tech predchozich - staci pouzit to co uz existuje a ty dva seznamy jen nahodit na nil (ten prvopocatek) 

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Dane0
Newbie
28. 2. 2012   #5
-
0
-

#4 KIIV
... neumím zapsat smysluplnou syntaxi. Jak by měl vypadat začátek?

Nahlásit jako SPAM
IP: 193.85.21.–
KIIV
~ Moderátor
+43
God of flame
28. 2. 2012   #6
-
0
-

#5 Dane
napis co se ted snazis zapsat .. pak se da resit syntaxe

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Dane0
Newbie
28. 2. 2012   #7
-
0
-

#6 KIIV
tohle by byla zbylá část programového kódu, ze kterého se má vytvořit funkční aplikace (používám Lazarus). Programový kód se má zobecnit tak, aby to fungovalo na libovolný počet vagonků zadaný pomocí editovacího boxu.

r^.dalsi:=p; 
n^.dalsi:=p^.dalsi;
p^.dalsi:=n;
dispose(r);

r:=p;
r:=r^.dalsi;
dispose(p);

p:=r;
r:=r^.dalsi;
q^.dalsi:=r^.dalsi;
r^.dalsi:=q;
dispose(p);

p:=r;
r:=r^.dalsi;
dispose(p);

p:=r;
r:=r^.dalsi;
dispose(p);

p:=r;
r:=r^.dalsi;
dispose(p);
p:=r;

Nahlásit jako SPAM
IP: 193.85.21.–
KIIV
~ Moderátor
+43
God of flame
29. 2. 2012   #8
-
0
-

no ucel je evidentne zadat cislo v textboxu, zmacknout tlacitko (vlozit do jednoho nebo druheho) - tj. vytvorit novy prvek, nastavit cislo (hlavne prevest) a pak pridat na konec spravneho seznamu....

spojeni je jen prochazeni tech seznamu na preskacku a vkladani podobnym zpusobem jako vkladani prvku

pak oba zpracovane seznamy vyprazdnit

prochazeni je o cyklech, mazani je taky o cyklech (jen si pod sebou "nepodrezat vetev")

ale psat kod ted nehodlam.. leda ze by se nasel nekdo jinej komu se do toho chce

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Dane0
Newbie
29. 2. 2012   #9
-
0
-

#8 KIIV
prosím, aspoň začátek ...

Nahlásit jako SPAM
IP: 193.85.21.–
KIIV
~ Moderátor
+43
God of flame
29. 2. 2012   #10
-
0
-

tak treba vlozit neco na konec:


var temp,novy:  Pvag;

begin
  temp := seznam1_zacatek;
  while ( temp^.dalsi <> nil ) do temp := temp^.dalsi;  (* dojede na posledni prvek *)

  new(novy);
  novy^.obsah:=  ??preved??(?form.input??); // textboxy sou jako retezce
  novy^.dalsi:= nil;
  temp^.dalsi:= novy;

end;
Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
KIIV
~ Moderátor
+43
God of flame
29. 2. 2012   #11
-
0
-

mimochodem bude to chit taky osetrit pridavani do prazdneho seznamu :)

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Dane0
Newbie
6. 3. 2012   #12
-
0
-

#11 KIIV
... to by se asi ošetřit nedalo. Hmm a kdybych vytvořila dva seznamy (p, r) z nichž by vznikl třetí seznam (z), např.

var
  Form1: TForm1; 

implementation

{$R *.lfm}

type
  pvag=^vag;
  vag=record
    Obsah: Byte;
    dalsi: Pvag;
  end;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var p, r, q, z: Pvag;
begin
  new(p);
  p:=nil;

  new(p);			//seznam p
  p:=nil;

  new(q);
  q^.obsah:=10;
  q^.dalsi:=p;
  p:=q;

  new(q);
  q^.obsah:=8;
  q^.dalsi:=p;
  p:=q;

  new(q);
  q^.obsah:=6;
  q^.dalsi:=p;
  p:=q;

  new(r);			//seznam r
  r:=nil;

  new(q);
  q^.obsah:=9;
  q^.dalsi:=r;
  r:=q;

  new(q);
  q^.obsah:=7;
  q^.dalsi:=r;
  r:=q;

  new(q);
  q^.obsah:=5;
  q^.dalsi:=r;
  r:=q;

  new(z);			//spojený seznam
  z:=nil;
  q:=p;
  p:=p^.dalsi;
  q^.dalsi:=z;
  z:=q;

  q:=r;
  r:=r^.dalsi;
  q^.dalsi:=z;
  z:=q;

  q:=p;
  p:=p^.dalsi;
  q^.dalsi:=z;
  z:=q;

  q:=r;
  r:=r^.dalsi;
  q^.dalsi:=z;
  z:=q;

  q:=p;
  p:=p^.dalsi;
  q^.dalsi:=z;
  z:=q;

  q:=r;
  r:=r^.dalsi;
  q^.dalsi:=z;
  z:=q;
end;           

Jak by prosím mohlo vypadat druhé tlačítko, které by zobrazovalo nejprve seznam p a r a potom z?

procedure TForm1.Button2Click(Sender: TObject);
var
begin

 ??

  Memo1.Lines.Clear;
  while ??  do
  begin
    Memo1.Lines.Add(IntToStr....
  end;

Nahlásit jako SPAM
IP: 193.85.21.–
KIIV
~ Moderátor
+43
God of flame
6. 3. 2012   #13
-
0
-

to by se osetrit samozrejme dalo:

var temp,novy:  Pvag;

begin
  new(novy);  // novy prvek
  novy^.obsah:=  ??preved??(?form.input??); // textboxy sou jako retezce
  novy^.dalsi:= nil;  // nema nic za sebou (hlavne nenechat smeti)

  if ( seznam1_zacatek = nil ) then begin // pokud je seznam prazdny chce to hodit prvni prvek na zacatek
    seznam1_zacatek := novy;
  end else begin // jinak najit posleni prvek a pridat na konec
    temp := seznam1_zacatek;
    while ( temp^.dalsi <> nil ) do temp := temp^.dalsi;  (* dojede na posledni prvek *)
    temp^.dalsi:= novy;
  end;
end;

a k tomu: memu na konci pouzit to same jak mam pro vyhledavani na konec a akorat pridat jeste ten vypis (a blok)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Dane0
Newbie
7. 3. 2012   #14
-
0
-

#13 KIIV
děkuju za vysvětlení. Odevzdat však musím ten druhý příklad (tj. vytvořit dva seznamy, které spojím jako třetí seznam z). Ale nemám ponětí jak to zapsat v cyklech. Nefunguje mi to.

Nahlásit jako SPAM
IP: 193.85.21.–
KIIV
~ Moderátor
+43
God of flame
7. 3. 2012   #15
-
0
-

tak to co sem daval je priblizne pridavani do jednoho a s malou upravou i druheho

prekopirovani do tretiho je to trosku horsi ale taky se to da zvladnout --- jen se mi to nechce delat (a hlavne ne naslepo - delphi uz nemam k dispozici)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 3 hosté

Podobná vlákna

Seznamy — založil

Ty seznamy... — založil tom9k

Problém se seznamy — založil watterma

Seznamy v databázi — založil VelkyBubak

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý