<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
	<id>http://brain.fuw.edu.pl/edu/index.php?action=history&amp;feed=atom&amp;title=TI%2FAlgorytmy_i_struktury_danych%2FDynamiczne_struktury_danych</id>
	<title>TI/Algorytmy i struktury danych/Dynamiczne struktury danych - Historia wersji</title>
	<link rel="self" type="application/atom+xml" href="http://brain.fuw.edu.pl/edu/index.php?action=history&amp;feed=atom&amp;title=TI%2FAlgorytmy_i_struktury_danych%2FDynamiczne_struktury_danych"/>
	<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=TI/Algorytmy_i_struktury_danych/Dynamiczne_struktury_danych&amp;action=history"/>
	<updated>2026-05-03T15:16:08Z</updated>
	<subtitle>Historia wersji tej strony wiki</subtitle>
	<generator>MediaWiki 1.34.1</generator>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=TI/Algorytmy_i_struktury_danych/Dynamiczne_struktury_danych&amp;diff=1978&amp;oldid=prev</id>
		<title>Jarekz: Utworzono nową stronę &quot; = szkic =  * co to jest tablica i jakie ma wady, jak to jest w pythonie, a jak to jest gdzie indziej i czemu to, że będizemy te struktury implementować w pythonie je...&quot;</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=TI/Algorytmy_i_struktury_danych/Dynamiczne_struktury_danych&amp;diff=1978&amp;oldid=prev"/>
		<updated>2015-05-23T14:10:38Z</updated>

		<summary type="html">&lt;p&gt;Utworzono nową stronę &amp;quot; = szkic =  * co to jest tablica i jakie ma wady, jak to jest w pythonie, a jak to jest gdzie indziej i czemu to, że będizemy te struktury implementować w pythonie je...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nowa strona&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
= szkic =&lt;br /&gt;
&lt;br /&gt;
* co to jest tablica i jakie ma wady, jak to jest w pythonie, a jak to jest gdzie indziej i czemu to, że będizemy te struktury implementować w pythonie jest trochę oszukane&lt;br /&gt;
* wskaźnik w miejsce pamięci – czysto teoretycznie, kilka ćwiczeń na „odwołania do pamięci”, co jest wskaźnikiem, a co wartością miejsca w pamięci&lt;br /&gt;
* prosta lista jenokierunkowa, przejście i wypisanie elementów -- implementacja w C&lt;br /&gt;
&lt;br /&gt;
* przykład programu w C ze wskaźnikami, przykład błędu jakiegoś złego odwołania do pamięci, żeby zobaczyli, jak takie coś wygląda, wyjaśnienie na czym to polega, wszystko na zasadzie oswajania że kiedyś może ich to spotkać?&lt;br /&gt;
&lt;br /&gt;
* nie tylko teoria, również implementacja w C&lt;br /&gt;
&lt;br /&gt;
= zadania =&lt;br /&gt;
&lt;br /&gt;
odwracanie listy&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
 procedure odwrocListe(l : lista);&lt;br /&gt;
 var&lt;br /&gt;
  p, q : lista;&lt;br /&gt;
 begin&lt;br /&gt;
  if l != nil then&lt;br /&gt;
  begin&lt;br /&gt;
   p := l^.nast;&lt;br /&gt;
   q := nil;&lt;br /&gt;
   while p != nil do&lt;br /&gt;
   begin&lt;br /&gt;
    l^.nast := q;&lt;br /&gt;
    q := l;&lt;br /&gt;
    l := p;&lt;br /&gt;
    p := p^.nast;&lt;br /&gt;
   end;&lt;br /&gt;
   l^.nast := q;&lt;br /&gt;
  end;  &lt;br /&gt;
 end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
koniecznie zadanie ze sprawdzaniem czy lista ma cykl przez parę ścigających się wskaźników :-)&lt;br /&gt;
&lt;br /&gt;
 function czyListaMaCykl(l : lista) : boolean;&lt;br /&gt;
 var&lt;br /&gt;
  p : lista;&lt;br /&gt;
 begin&lt;br /&gt;
  if l = nil then&lt;br /&gt;
  begin&lt;br /&gt;
   p := l^.nast;&lt;br /&gt;
   while (p != nil) and (p != l) do&lt;br /&gt;
   begin&lt;br /&gt;
    l := l^.nast;&lt;br /&gt;
    p := p^.nast;&lt;br /&gt;
    if p != nil then&lt;br /&gt;
     p := p^.nast;&lt;br /&gt;
   end;&lt;br /&gt;
   czyListaMaCykl := p != nil;&lt;br /&gt;
  end else&lt;br /&gt;
   czyListaMaCykl := false;&lt;br /&gt;
 end;&lt;br /&gt;
&lt;br /&gt;
scalanie dwóch posortowanych list&lt;br /&gt;
&lt;br /&gt;
 procedure scal(var l1 : lista; l2 : lista);&lt;br /&gt;
 var&lt;br /&gt;
  p, q, s : lista;&lt;br /&gt;
 begin&lt;br /&gt;
  new(p); p^.nast := nil; q := l1; l1 := p;&lt;br /&gt;
  while (q != nil) and (l2 != nil) do&lt;br /&gt;
  begin&lt;br /&gt;
   if q^.value &amp;lt; l2^.value then&lt;br /&gt;
   begin&lt;br /&gt;
    p^.nast := q;&lt;br /&gt;
    q := q^.nast;&lt;br /&gt;
    p^.nast^.nast := nil; &lt;br /&gt;
   end else if p^.value &amp;gt; l2^.value then&lt;br /&gt;
   begin&lt;br /&gt;
    p^.nast := l2;&lt;br /&gt;
    l2 := 2l^.nast;&lt;br /&gt;
    p^.nast^.nast := nil;&lt;br /&gt;
   end else&lt;br /&gt;
   begin&lt;br /&gt;
    p^.nast := q;&lt;br /&gt;
    q := q^.nast;&lt;br /&gt;
    s := l2;&lt;br /&gt;
    l2 := l2^.nast;&lt;br /&gt;
    dispose(s);&lt;br /&gt;
    p^.nast^.nast := nil;&lt;br /&gt;
   end;&lt;br /&gt;
  end;&lt;br /&gt;
  if q != nil then&lt;br /&gt;
   p^.nast := q;&lt;br /&gt;
  if l1 != nil then&lt;br /&gt;
   p^.nast := l1; &lt;br /&gt;
 end;&lt;br /&gt;
&lt;br /&gt;
mamy listy posortowane l1 i l2, z l2 usunąć wszystkie elementy występujące na liście l1 - zastosowanie atrapy&lt;br /&gt;
&lt;br /&gt;
 procedure usun(var l1 : lista; l2 : lista);&lt;br /&gt;
 var&lt;br /&gt;
  p, q : lista;&lt;br /&gt;
 begin&lt;br /&gt;
  new(p);&lt;br /&gt;
  p^.nast := l1;&lt;br /&gt;
  q := l1;&lt;br /&gt;
  l1 := p;&lt;br /&gt;
  while (q != nil) and (l2 != nil) do&lt;br /&gt;
  begin&lt;br /&gt;
   if q^.value = l2^.value then&lt;br /&gt;
   begin&lt;br /&gt;
    p^.nast := q^.nast;&lt;br /&gt;
    q := q ^.nast;&lt;br /&gt;
    delete(p^.nast);&lt;br /&gt;
   end else if q^.value &amp;lt; l2^.value then&lt;br /&gt;
    q := q^.nast;&lt;br /&gt;
   else&lt;br /&gt;
    l2 := l2^.nast;&lt;br /&gt;
  end;&lt;br /&gt;
  p := l1;&lt;br /&gt;
  l1 := l1^.nast;&lt;br /&gt;
  dispose(p);&lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
dana jest lista nieposortowana, uzyskać listę w której najpierw będą elementy ujemne, później zera i na końcu dodatnie&lt;br /&gt;
&lt;br /&gt;
 procedure tasuj(var l : lista);&lt;br /&gt;
 var&lt;br /&gt;
  a, b, c, d : lista;&lt;br /&gt;
 begin&lt;br /&gt;
  new(a); new(b); new(c);&lt;br /&gt;
  a^.nast := nil; b^.nast := nil; c^.nast := nil;&lt;br /&gt;
  d := l;&lt;br /&gt;
  while d != nil do&lt;br /&gt;
  begin&lt;br /&gt;
   if d^.value = 0 then&lt;br /&gt;
   begin&lt;br /&gt;
    p := b^.nast;&lt;br /&gt;
    b^.nast := d;&lt;br /&gt;
    d^.nast := p;&lt;br /&gt;
   end else if d^.value &amp;lt; 0 then&lt;br /&gt;
   begin&lt;br /&gt;
    p := a^.nast;&lt;br /&gt;
    a^.nast := d;&lt;br /&gt;
    d^.nast := p;&lt;br /&gt;
   end else&lt;br /&gt;
   begin&lt;br /&gt;
    p := c^.nast;&lt;br /&gt;
    c^.nast := d;&lt;br /&gt;
    d^.nast := p;&lt;br /&gt;
   end;&lt;br /&gt;
   d := d^.nast;&lt;br /&gt;
  end;&lt;br /&gt;
  l := a^.nast;&lt;br /&gt;
  dispose(a);&lt;br /&gt;
  if l = nil then begin&lt;br /&gt;
   l := b^.nast;&lt;br /&gt;
   dispose(b);&lt;br /&gt;
   if l = nil then&lt;br /&gt;
   begin&lt;br /&gt;
    l := c^.nast;&lt;br /&gt;
    dispose(c);&lt;br /&gt;
   end else begin&lt;br /&gt;
    a := l;&lt;br /&gt;
    while a^.nast != nil do&lt;br /&gt;
     a := a^.nast;&lt;br /&gt;
    a := c^.nast;&lt;br /&gt;
    dispose(c);&lt;br /&gt;
   end;&lt;br /&gt;
  end else&lt;br /&gt;
  begin&lt;br /&gt;
   a := l;&lt;br /&gt;
   while a^.nast != nil do&lt;br /&gt;
    a := a^.nast;&lt;br /&gt;
   a^.nast := b^.nast;&lt;br /&gt;
   dispose(b);&lt;br /&gt;
   if a^.nast = nil then&lt;br /&gt;
   begin&lt;br /&gt;
    a^.nast := c^.nast;&lt;br /&gt;
    dispose(c);&lt;br /&gt;
   end else&lt;br /&gt;
   begin&lt;br /&gt;
    while a^.nast != nil do&lt;br /&gt;
     a := a^.nast;&lt;br /&gt;
    a^.nast := c^.nast;&lt;br /&gt;
    dispose(c);&lt;br /&gt;
   end;&lt;br /&gt;
  end;&lt;br /&gt;
 end;&lt;br /&gt;
&lt;br /&gt;
= Tablica a lista =&lt;br /&gt;
&lt;br /&gt;
tablica ma ustaloną długość, aby przechowywać więcej elementów musimy zaalokować nową tablicę o większej pojemności i przepisać wszystkie elementy (patrz opis tablicy dynamicznej w podrozdziale koszt amortyzowany), podobny problem występuje gdy chcemy wstawić do tablicy wartość między dwie już istniejące - wszystkie późniejsze elementy muszą zostać przeniesione - są to niewątpliwie wady tablic, ta struktura danych ma jednak dużą zaletę mianowicie szybki dostęp do elementu o danym indeksie&lt;br /&gt;
&lt;br /&gt;
konkurencją dla tablic są listy, element listy jednokierunkowej przechowuje wartość pewnego typu i wskaźnik na następny element, ostatni element wskazuje na nil (null, 0), zaletą tablic jest bardzo tanie i wygodne wstawianie elementu między dwa już istniejące, wadą jest to, że aby dostać się do jakiegoś elementu musimy przejść wszystkie go poprzedzające&lt;br /&gt;
&lt;br /&gt;
lista w C:&lt;br /&gt;
&lt;br /&gt;
 struct elementListy{&lt;br /&gt;
  int wartosc;&lt;br /&gt;
  elementListy * nast;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 typedef *ElementListy lista;&lt;br /&gt;
&lt;br /&gt;
wypisanie listy w C:&lt;br /&gt;
 lista * l;&lt;br /&gt;
 ...&lt;br /&gt;
 while(l != 0){&lt;br /&gt;
  printf(&amp;quot;%d\n&amp;quot;, l-&amp;gt;wartosc);&lt;br /&gt;
  l = l-&amp;gt;nast;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
element listy dwukierunkowej trzyma także wskaźnik na poprzednik&lt;br /&gt;
&lt;br /&gt;
= Tablice vs listy, podejście abstrakcyjne =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Złożoność list vs tablic ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Różne przykłady, z którymi nie wiadomo co teraz zrobić&lt;br /&gt;
&lt;br /&gt;
Wróćmy do przykładu sortowania przez liczanie, z wykładu o złożoności.&lt;br /&gt;
Poprzednio nie umieliśmy tworzyc list, więc alokowaliśmy dodatkowo całe tablice dla każdej liczby N. Zatem złożoność pamięciowa wynosiła O(M * N). Tym razem mamy już do dyspozycji listy -- możemy zamiast tablic, w każdej komórce naszej tablicy pom tworzyć listę naszych obiektów do posortowania. Złożność pamięciowa nie pogorszy się już tak bardzo.&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
</feed>