Listy w drzewie

0

Witam

Od kilku godzin stoje w miejscu z programem.
Ma byc to słownik wyrazów opary na drzewie. W każdym węźle ma być lista liter. Odpowiednio od początku drzewa (korzeń) do końca danej galezi tworzy wyraz. Wygląda to mniej więcej tak

PROGRAM slownik;
USES crt;
TYPE
	Welement=^element; {węzeł drzewa}
	WlistaLiter=^listaLiter; {lista jednokierunkowa}
	Wznaczenie=^znaczenie;

	znaczenie = record
		wyraz:string;
		NastepneZnaczenie:Wznaczenie;
	end;

	listaLiter = record
		nastepny_element:Welement;
		litera:char;
		next:WlistaLiter;
	end;

	element = record
		id:char;
		rodzic:Welement;
		lista_liter:WlistaLiter;
	end;

var
	wsk:Welement;
	k:byte;

{tworzy liste jedno kierunkową liter w kazdym węźle drzewa}
procedure wstawLitere(var lista:WlistaLiter;var node:Welement; lit:char);
var
   nowy:WlistaLiter;
begin
    if lista=nil then begin
	new(nowy);
        nowy^.next:=nil;
        nowy^.litera:=lit;
        nowy^.nastepny_element:=nil;
        lista:=nowy;
     end else begin
      new(nowy);
      nowy^.litera:=lit;
      nowy^.next:=nil;
      nowy^.next:=lista;
      nowy^.nastepny_element:=nil;
      lista:=nowy;

	  end;
end;

procedure wstawElement(var node:Welement; lit:char);
begin
	{tworzenie pierwszego węzła root}
	if node=nil then begin
		new(node);
		node^.lista_liter:=nil;
		node^.id:=lit;
       	wstawLitere(node^.lista_liter,node,lit);
	end
		else
	begin
             wstawElement(node^.lista_liter^.nastepny_element,lit);
	end;
end;

procedure wstawSlowo(var slownik:Welement; slowo:string; znaczenie:string);
var
	S:Welement;
	i:byte;
	nowy:Welement;
begin
	for i:=1 to length(slowo) do wstawElement(slownik,slowo[i]);
	{po przejsciu calego fora i zatrzymaniu sie na ostatniej literze
	zapisujemy znaczenie rozłożonego zdania do listy jedno kierunkowej znaczenie}
	end;

procedure pokazListe(var f:WlistaLiter);
begin
 while f <> nil do
     begin
          writeln(f^.litera);
          f:=f^.next;

   end;
end;

procedure pokazSlownik(var node:Welement);
begin
	if node <> nil then begin
	pokazListe(node^.lista_liter);
		pokazSlownik(node^.lista_liter^.nastepny_element);
	end;
end;

BEGIN
	clrscr;
	writeln(MemAvail);
	wstawSlowo(wsk,'cd','aa');
	wstawSlowo(wsk,'xd','aa');
	pokazSlownik(wsk);
	writeln(MemAvail);
	readln;
END.

user image

Jak widać na powyższym rysunku, każdy węzeł drzewa zawiera listę, która zawiera kolejne litery słowa. Numer stanowi poziom drzewa. Trochę jestem już zamieszany, ponieważ program się wysypuje. Sam już nie wiem co jest źle co dobrze :P
Jednym sałowem za długo już go męcze ;/
Prosiłbym o pomoc w samej strukturze dodawania słowa. Nie jestem pewien czy rekordy wskaźników są dobre..

0

Mistrzu, jak juz będziesz wiedział jak to zrobic to weno wrzuć tu kod źródłowy tego pliku bo ja tez siedze ponad tydzień i mam ten sam problem.

0

A tak propo twojego kodziku to zapętla sie przy wyświetlaniu drzewa:

procedure pokazListe(var f:WlistaLiter);
begin
 while f <> nil do
     begin
          writeln(f^.litera);
          f:=f^.next;

   end;
end;

procedure pokazSlownik(var node:Welement);
begin
        if node <> nil then begin
        pokazListe(node^.lista_liter);
                pokazSlownik(node^.lista_liter^.nastepny_element);
        end;
end;
0

Czy na całym 4programmers nie ma nikogo kto rozumie i potrafiłby zrobić te drzewa z list?

0

a musi to byc na wskaznikach i w pascalu?
ja bym zrobil jakos na TTreeView, albo poszukal jakiegos gotowego drzewa i tylko dopisal co mi tam potrzebne...

0
k0b3 napisał(a)

Czy na całym 4programmers nie ma nikogo kto rozumie i potrafiłby zrobić te drzewa z list?

Są ;-) Jednak, nie kazdy ma czas by zaglebiac sie w Twoja implementacje, musisz uzbroic sie w cierpliwosc;)

po edycji:

Zrobiłem takie coś.

PROGRAM slownik;
USES crt;

type
  PWezel = ^TWezel;
  TWezel = record
    Litera: Char;
    TablicaZnaczen: array of String;
    Rodzic: PWezel;
    TablicaWezlow: array of PWezel;
  end;

var
  NoweDrzewo: PWezel;

procedure ListujDrzewo(var Drzewo: PWezel);
var
  i: Integer;
  procedure ListujWezel(var Wezel: PWezel; Slowo: String);
  var
    S: String;
    i: Integer;
  begin
    Slowo := Slowo + Wezel^.Litera;
    if Wezel^.TablicaZnaczen <> nil then
    begin
      for i := 0 to Length(Wezel^.TablicaZnaczen) - 1 do
        S := S + Wezel^.TablicaZnaczen[i] + ', ';
      S := Slowo + ' : ' + S;
      Writeln(S);
    end;
    for i := 0 to Length(Wezel^.TablicaWezlow) - 1 do
      ListujWezel(Wezel^.TablicaWezlow[i], Slowo);
  end;
begin
  for i := 0 to Length(Drzewo^.TablicaWezlow) - 1 do
    ListujWezel(Drzewo^.TablicaWezlow[i], '');
end;

procedure WstawSlowo(var Drzewo: PWezel; const Slowo, Znaczenie: String);
var
  DlugoscTablicy, IndexLitery: Integer;
  WezelIstnieje: Boolean;

  procedure WstawLitere(var Wezel: PWezel);
  var
    Dziecko: PWezel;
    i: Integer;
  begin
    WezelIstnieje := False;
    DlugoscTablicy := Length(Wezel^.TablicaWezlow);
    for i := 0 to DlugoscTablicy - 1 do
      if Wezel^.TablicaWezlow[i]^.Litera = Slowo[IndexLitery] then
      begin
        WezelIstnieje := True;
        Dziecko := Wezel^.TablicaWezlow[i];
        Break;
      end;

    if not WezelIstnieje then
    begin
      SetLength(Wezel^.TablicaWezlow, DlugoscTablicy + 1);
      New(Wezel^.TablicaWezlow[DlugoscTablicy]);
      Wezel^.TablicaWezlow[DlugoscTablicy]^.Litera := Slowo[IndexLitery];
      Wezel^.TablicaWezlow[DlugoscTablicy]^.Rodzic := Wezel;
      Dziecko := Wezel^.TablicaWezlow[DlugoscTablicy];
    end;
    Inc(IndexLitery);
    if IndexLitery > Length(Slowo) then with Dziecko^ do
    begin
      for i := 0 to Length(TablicaZnaczen) - 1 do
        if TablicaZnaczen[i] = Znaczenie then
          Exit;
      SetLength(TablicaZnaczen, Length(TablicaZnaczen) + 1);
      TablicaZnaczen[Length(TablicaZnaczen) - 1] := Znaczenie;
      Exit;
    end;
    WstawLitere(Dziecko);
  end;

begin
  if Length(Slowo) < 1 then
    Exit;
  if Drzewo = nil then
  begin
    New(Drzewo);
  end;
  IndexLitery := 1;
  WstawLitere(Drzewo);
end;

BEGIN
  WstawSlowo(NoweDrzewo, 'wieża', 'tower');
  WstawSlowo(NoweDrzewo, 'wieża', 'rook');
  WstawSlowo(NoweDrzewo, 'zamek', 'castle');
  ListujDrzewo(NoweDrzewo);
END.

Nie wiem czy toto się kompiluje pod Turbo Pascalem, pod FreePascalem raczej na pewno tak, choc dawnom nie uzywal. Wywalilem te Twoje listy i oparlem to na tablicach. Mozna to zoptymalizowac pod wzgledem wymagan pamieciowych jak i czasowych ale to juz zostawiam Tobie. Nie wiem tez czy nie zawiera to jakichs tam bledow, nie wspominajac o tym ze nie zwalniamy pamieci.
Pobaw sie, i napisz wlasne lepsze :-)

Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1