<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Forum Pasja Informatyki - Najnowsze z tagiem lista-dwukierunkowa</title>
<link>https://forum.pasja-informatyki.pl/tag/lista-dwukierunkowa</link>
<description>Powered by Question2Answer</description>
<item>
<title>Lista dwukierunkowa</title>
<link>https://forum.pasja-informatyki.pl/494775/lista-dwukierunkowa</link>
<description>

&lt;p&gt;Hej :)&lt;/p&gt;



&lt;p&gt;Rozpisuję obecnie funkcje wymagane do zadanka z związanego z konstrukcją listy dwukierunkowej:&lt;/p&gt;



&lt;p&gt;Oto treść wymagana do rozpisania funkcji:&lt;/p&gt;



&lt;pre class=&quot;brush:cpp;&quot;&gt;
Napisz program pozwalający użytkownikowi na wykonywanie dowolnej operacji na liście dwukierunkowej z poziomu konsoli (menu tekstowe).

W tym celu zaimplementuj listę wiązaną dwukierunkową, opartą o następujące struktury oraz API:

struct doubly_linked_list_t
{
  struct node_t *head;
  struct node_t *tail;
};

struct node_t
{
  int data;
  struct node_t *next;
  struct node_t *prev;
};

gdzie:

head - wskaźnik na pierwszy element listy, jeżeli lista jest pusta powinien być ustawiony na NULL,
tail - wskaźnik na ostatni element listy, jeżeli lista jest pusta powinien być ustawiony na NULL.
next - wskaźnik na następny element listy, jeżeli nie ma następnego elementu to NULL
prev - wskaźnik na poprzedni element listy, jeżeli nie ma poprzedniego elementu to NULL,
data - wartość przechowywana w elemencie listy
Przygotuj następujące funkcje, umożliwiające obsługę listy:

struct doubly_linked_list_t* dll_create();

int dll_push_back(struct doubly_linked_list_t* dll, int value);
int dll_push_front(struct doubly_linked_list_t* dll, int value);
int dll_pop_front(struct doubly_linked_list_t* dll, int *err_code);
int dll_pop_back(struct doubly_linked_list_t* dll, int *err_code);

int dll_back(const struct doubly_linked_list_t* dll, int *err_code);
int dll_front(const struct doubly_linked_list_t* dll, int *err_code);

struct node_t* dll_begin(struct doubly_linked_list_t* dll);
struct node_t* dll_end(struct doubly_linked_list_t* dll);

int dll_size(const struct doubly_linked_list_t* dll);
int dll_is_empty(const struct doubly_linked_list_t* dll);

int dll_at(const struct doubly_linked_list_t* dll, unsigned int index, int *err_code);

int dll_insert(struct doubly_linked_list_t* dll, unsigned int index, int value);
int dll_remove(struct doubly_linked_list_t* dll, unsigned int index, int *err_code);

void dll_clear(struct doubly_linked_list_t* dll);

void dll_display(const struct doubly_linked_list_t* dll);
void dll_display_reverse(const struct doubly_linked_list_t* dll);
Deklaracje wszystkich funkcji oraz struktur umieść w pliku nagłówkowym doubly_linked_list.h, a definicje w pliku doubly_linked_list.c.

struct doubly_linked_list_t* dll_create();
Funkcja przydziela pamięć na strukturę doubly_linked_list_t, inicjuje ją na pustą listę dwukierunkową i zwraca adres przydzielonej struktury. Jeżeli operacja się nie powiedzie to zwraca NULL.

int dll_push_back(struct doubly_linked_list_t* dll, int value);
int dll_push_front(struct doubly_linked_list_t* dll, int value);
Funkcje dodają element o wartości value na koniec (push_back) lub początek (push_front) listy dll. Funkcje zwracają:

0 w przypadku sukcesu,
1 w przypadku błędnych danych wejściowych lub
2 jeżeli nie uda się przydzielić pamięci.
int dll_pop_front(struct doubly_linked_list_t* dll, int *err_code);
int dll_pop_back(struct doubly_linked_list_t* dll, int *err_code);
Funkcje usuwają pierwszy (pop_front) lub ostatni (pop_back) element z listy dll zwracając jego wartość. Do zmiennej err_code, o ile to możliwe, zapisany powinien zostać kod błędu:

0 w przypadku sukcesu,
1 w przypadku błędnych danych wejściowych.
int dll_front(const struct doubly_linked_list_t* dll, int *err_code);
int dll_back(const struct doubly_linked_list_t* dll, int *err_code);
Funkcje zwracają wartość pierwszego (front) lub ostatniego (back) elementu z listy dll bez usuwania tego elementu. Do zmiennej err_code, o ile to możliwe, zapisany powinien zostać kod błędu:

0 w przypadku sukcesu,
1 w przypadku błędnych danych wejściowych.
struct node_t* dll_begin(struct doubly_linked_list_t* dll);
struct node_t* dll_end(struct doubly_linked_list_t* dll);
Funkcje zwracają:

wskaźnik na pierwszy (begin) lub ostatni (end) elementu listy dll lub
NULL jeżeli nie będzie to możliwe.
int dll_size(const struct doubly_linked_list_t* dll);
Funkcja zwraca:

liczbę elementów w liście dll lub
-1 w przypadku błędnych danych wejściowych.
int dll_is_empty(const struct doubly_linked_list_t* dll);
Funkcja sprawdza czy lista dll jest pusta. Funkcja zwraca:

1 jeżeli lista jest pusta,
0 jeżeli w liście znajdują się jakieś elementy lub
-1 w przypadku błędnych danych wejściowych.
int dll_at(const struct doubly_linked_list_t* dll, unsigned int index, int *err_code);
Funkcja zwraca wartość elementu spod indeksu index listy dll. Indeks elementu liczony jest względem pierwszego elementu (head). Do zmiennej err_code, o ile to możliwe, zapisany powinien zostać kod błędu:

0 w przypadku sukcesu,
1 w przypadku błędnych danych wejściowych.
int dll_insert(struct doubly_linked_list_t* dll, unsigned int index, int value);
Funkcja dodają element o wartości value na pozycję index listy dll. Funkcja zwraca:

0 w przypadku sukcesu,
1 w przypadku błędnych danych wejściowych lub
2 jeżeli nie uda się przydzielić pamięci.
Przykład:

Dana jest lista sześciu elementów ll = ABCDEF.
Element x jest wstawiany na pozycję 3.
Lista ll po zmianie: ABCxDEFG.
int dll_remove(struct doubly_linked_list_t* dll, unsigned int index, int *err_code);
Funkcja usuwa element spod indeksu index z listy dll i zwraca jego wartość. Do zmiennej err_code, o ile to możliwe, zapisany powinien zostać kod błędu:

0 w przypadku sukcesu,
1 w przypadku błędnych danych wejściowych.
void dll_clear(struct doubly_linked_list_t* dll);
Funkcja usuwa wszystkie elementy z listy dll (zwalnia również pamięć).

void dll_display(const struct doubly_linked_list_t* dll);
Funkcja wyświetla wszystkie elementy z listy dll, w jednym wierszu, oddzielone spacjami. Jeżeli lista jest pusta to funkcja nie podejmuje żadnej akcji.


void dll_display_reverse(const struct doubly_linked_list_t* dll);

Funkcja wyświetla wszystkie elementy z listy dll, w jednym wierszu, oddzielone spacjami. Elementy należy wyświetlać od ostatniego (tail).

Jeżeli lista jest pusta to funkcja nie podejmuje żadnej akcji.&lt;/pre&gt;



&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
<category>C i C++</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/494775/lista-dwukierunkowa</guid>
<pubDate>Thu, 18 Jun 2020 14:39:13 +0000</pubDate>
</item>
<item>
<title>Sortowanie listy dwukierunkowej przez scalanie - rozdzielanie listy</title>
<link>https://forum.pasja-informatyki.pl/461816/sortowanie-listy-dwukierunkowej-przez-scalanie-rozdzielanie-listy</link>
<description>Zaproponuj algorytm rozdzielania listy dwukierunkowej&lt;br /&gt;
&lt;br /&gt;
ze szczególnym uwzględnieniem przypadków brzegowych&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
Myślę z pozostałymi funkcjami potrzebnymi do realizacji sortowania przez scalanie bym sobie&lt;br /&gt;
&lt;br /&gt;
poradził choć chciałbym poznać wasz pomysł na konkatenacje bo&lt;br /&gt;
&lt;br /&gt;
występuje ona podczas scalania&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
Scalanie dwóch posortowanych list&lt;br /&gt;
&lt;br /&gt;
Scalanie(L,A,B)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;L=NIL&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dopóki lista A jest niepusta oraz lista B jest niepusta wykonuj&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Jeżeli klucz pobrany z głowy listy A jest mniejszy bądź równy kluczowi pobranemu z głowy listy B to&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Usuń węzeł z głowy listy A i zapamiętaj go w lokalnej zmiennej&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;w przeciwnym przypadku&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Usuń węzeł z głowy listy B i zapamiętaj go w lokalnej zmiennej&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Wstaw zapamiętany węzeł na koniec listy L&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Teraz co najmniej jedna lista powinna być pusta ale nie wiemy która więc&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;łączymy obie listy A oraz B z listą L &amp;nbsp;przy czym łączenie to redukuje się do tzw konkatenacji */&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Połącz listę L z listą A&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Połącz &amp;nbsp;listę L z listą B&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
Sortowanie(L)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Jeżeli głowa listy L nie pokazuje na NIL oraz następnik głowy listy L nie pokazuje na NIL to&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Rozdziel listę L na połowę&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Posortuj rekurencyjnie obydwie połowy&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Scal posortowane połowy</description>
<category>Algorytmy</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/461816/sortowanie-listy-dwukierunkowej-przez-scalanie-rozdzielanie-listy</guid>
<pubDate>Fri, 06 Dec 2019 22:33:34 +0000</pubDate>
</item>
<item>
<title>wskazniki-lista dwukierunkowa</title>
<link>https://forum.pasja-informatyki.pl/382810/wskazniki-lista-dwukierunkowa</link>
<description>

&lt;p&gt;witam,&lt;/p&gt;



&lt;p&gt;Kompletnie nie wiem jak zabrać&amp;nbsp;się&amp;nbsp;za tą&amp;nbsp;listę. proszę&amp;nbsp;o jakieś&amp;nbsp;wskazówki/&lt;/p&gt;



&lt;p&gt;Do napisania jest funkcja która zamienia poczatek a końcem i druga ktora usuwa osoby strasze o jakims okreslonym wieku.&lt;/p&gt;



&lt;pre class=&quot;brush:cpp;&quot;&gt;
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#define MAXLEN 30
//usuwa strasze osoby i zwraca liczbe osob po ususnieciu.
//zamienia pierwsza pozycje z druga/

struct Dane
{
	char Imie[MAXLEN];
	char Nazwisko[MAXLEN];
	int RokUr;
};

struct Element
{
	struct Dane dane;
	struct Element *Poprz;
	struct Element *Nast;
};

struct Lista
{
	struct Element *Poczatek;
	struct Element *Koniec;
	int Rozmiar;
};

void DrukujDane(struct Dane dn) {
	printf(&quot;%s %s, rok ur: %d\n&quot;, dn.Imie, dn.Nazwisko, dn.RokUr);
}

void Drukuj(struct Lista *lst) {
	struct Element *p;
	//p = lst-&amp;gt;Poczatek;
	//while (p != NULL) {
	//	DrukujDane(p-&amp;gt;dane);
	//	p = p-&amp;gt;Nast;
	//}
	for (p = lst-&amp;gt;Poczatek; p != NULL; p = p-&amp;gt;Nast)
		DrukujDane(p-&amp;gt;dane);

	printf(&quot;=== Liczba elementow: %d ====\n&quot;, lst-&amp;gt;Rozmiar);
}

void DodajPoczatek(struct Lista* lst, struct Dane dn) {

	struct Element *nel;
	nel = (struct Element*)malloc(sizeof(struct Element));
	//(*nel).dane = dn;
	nel-&amp;gt;dane = dn;
	if (lst-&amp;gt;Poczatek == NULL) {
		//lista pusta
		lst-&amp;gt;Poczatek = nel;
		lst-&amp;gt;Koniec = nel;
		nel-&amp;gt;Poprz = NULL;
		nel-&amp;gt;Nast = NULL;
	}
	else {
		//lista niepusta
		nel-&amp;gt;Poprz = NULL;
		nel-&amp;gt;Nast = lst-&amp;gt;Poczatek;
		lst-&amp;gt;Poczatek-&amp;gt;Poprz = nel;
		lst-&amp;gt;Poczatek = nel;
	}
	lst-&amp;gt;Rozmiar++;
}

void DodajKoniec(struct Lista* lst, struct Dane dn) {
	struct Element *nel;
	nel = (struct Element*)malloc(sizeof(struct Element));
	nel-&amp;gt;dane = dn;
	if (lst-&amp;gt;Poczatek == NULL) {
		lst-&amp;gt;Poczatek = nel;
		lst-&amp;gt;Koniec = nel;
		nel-&amp;gt;Poprz = NULL;
		nel-&amp;gt;Nast = NULL;
	}
	else {
		nel-&amp;gt;Nast = NULL;
		nel-&amp;gt;Poprz = lst-&amp;gt;Koniec;
		lst-&amp;gt;Koniec-&amp;gt;Nast = nel;
		lst-&amp;gt;Koniec = nel;
	}
	lst-&amp;gt;Rozmiar++;
}

void ZamienPoczatekKoniec(struct Element *lst,struct Dane dn){
    struct Element *temp;
    temp=(struct Element*)malloc(sizeof(struct Element));

    temp=lst-&amp;gt;Koniec;

    temp-&amp;gt;Nast=lst-&amp;gt;Koniec-&amp;gt;Nast;
    temp-&amp;gt;Poprz=lst-&amp;gt;Koniec-&amp;gt;Poprz;
   lst-&amp;gt; Koniec-&amp;gt;Nast=lst-&amp;gt;Poczatek-&amp;gt;Nast;
    lst-&amp;gt;Koniec-&amp;gt;Poprz=lst-&amp;gt;Poczatek-&amp;gt;Poprz;
    lst-&amp;gt;Poczatek-&amp;gt;Poprz=temp-&amp;gt;Poprz;
    lst-&amp;gt;Poczatek-&amp;gt;Nast=temp-&amp;gt;Nast;

}
struct Element* ZnajdzNazwisko(struct Lista* lst, char *Nazwisko) {
	struct Element *p;

	for (p = lst-&amp;gt;Poczatek; p != NULL; p = p-&amp;gt;Nast)
		if (strcmp(p-&amp;gt;dane.Nazwisko, Nazwisko) == 0)
			break;
	return p;
}

void UsunNajstarszy(struct Lista *lst,int *RokUr){
    struct Element *p;
    for (p = lst-&amp;gt;Poczatek; p != NULL; p = p-&amp;gt;Nast){
        if(RokUr&amp;gt;70)
            UsunElement(*lst,p);

    }
    lst-&amp;gt;Rozmiar--;
        return 0;

}
void UsunElement(struct Lista* lst, struct Element* pBiezacy) {

	if (pBiezacy-&amp;gt;Poprz == NULL)
		lst-&amp;gt;Poczatek = pBiezacy-&amp;gt;Nast;
	else
		pBiezacy-&amp;gt;Poprz-&amp;gt;Nast = pBiezacy-&amp;gt;Nast;
	if (pBiezacy-&amp;gt;Nast == NULL)
		lst-&amp;gt;Koniec = pBiezacy-&amp;gt;Poprz;
	else
		pBiezacy-&amp;gt;Nast-&amp;gt;Poprz = pBiezacy-&amp;gt;Poprz;
	free(pBiezacy);
	lst-&amp;gt;Rozmiar--;
}

void UsunKoniec(struct Lista* lst) {
	if (lst-&amp;gt;Koniec == NULL)
		return;
	UsunElement(lst, lst-&amp;gt;Koniec);
}

void UsunPoczatek(struct Lista* lst) {
	if (lst-&amp;gt;Poczatek == NULL)
		return;
	UsunElement(lst, lst-&amp;gt;Poczatek);
}

void UsunWszystko(struct Lista* lst) {
	while (lst-&amp;gt;Poczatek != NULL)
		UsunElement(lst, lst-&amp;gt;Poczatek);
}


int main()
{
	char Bufor[MAXLEN];

	struct Lista KierInform;
	struct Lista KierKosmit;

	struct Element* pEl;

	KierInform.Poczatek = NULL;
	KierInform.Koniec = NULL;
	KierInform.Rozmiar = 0;

	struct Dane dane = { &quot;Jan&quot;, &quot;Kowalski&quot;,1990 };
	DodajPoczatek(&amp;amp;KierInform, dane);

	dane = (struct Dane) { &quot;Marcin&quot;, &quot;Wolski&quot;, 1980 };
	DodajPoczatek(&amp;amp;KierInform, dane);
	Drukuj(&amp;amp;KierInform);

	dane = (struct Dane) { &quot;Szymon&quot;, &quot;Stepniak&quot;, 1970 };
	DodajPoczatek(&amp;amp;KierInform, dane);
	Drukuj(&amp;amp;KierInform);

	dane = (struct Dane) { &quot;Anna&quot;, &quot;Walczak&quot;, 1999 };
	DodajKoniec(&amp;amp;KierInform, dane);
	Drukuj(&amp;amp;KierInform);

	printf(&quot;Podaj nazwisko: &quot;);
	scanf(&quot;%29s&quot;, Bufor);
	pEl = ZnajdzNazwisko(&amp;amp;KierInform, Bufor);
	if (pEl == NULL)
		printf(&quot;Nie znaleziono.\n&quot;);
	else {
		//DrukujDane(pEl-&amp;gt;dane);
		UsunElement(&amp;amp;KierInform, pEl);
		Drukuj(&amp;amp;KierInform);
	}
	UsunWszystko(&amp;amp;KierInform);
	Drukuj(&amp;amp;KierInform);


	return 0;
}

&lt;/pre&gt;



&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
<category>C i C++</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/382810/wskazniki-lista-dwukierunkowa</guid>
<pubDate>Thu, 27 Sep 2018 10:09:35 +0000</pubDate>
</item>
<item>
<title>lista dwukierunkowa błąd w kodzie</title>
<link>https://forum.pasja-informatyki.pl/353038/lista-dwukierunkowa-blad-w-kodzie</link>
<description>

&lt;p&gt;Witam&lt;/p&gt;



&lt;p&gt;Nie chce mi się skompilować lista i nie mogę znaleźć błędu.Jak by ktos pomógł będę wdzięczny.&lt;/p&gt;



&lt;pre class=&quot;brush:cpp;&quot;&gt;
#include &amp;lt;iostream&amp;gt;

using namespace std;
struct dane
    {
        int data;
        dane* next;
        dane* prev;

    };
    struct kurs
    {
    dane* head;
    dane* tail;
    int ilosc;

    };
void poczatek (kurs *r)
{
    int v=22;
    dane * p=new dane;

  p-&amp;gt;data = v;
  p-&amp;gt;prev = NULL;
  p-&amp;gt;next = head;
  head  = p;
  ilosc++;
  if(p-&amp;gt;next)
  {
      p-&amp;gt;next-&amp;gt;prev = p;
  }
  else
    tail = p;
}
void przed(kurs *r)
{
    int poz;
    int v=10;
    cout&amp;lt;&amp;lt;&quot;Podaj pozycje:&quot;;
    cin&amp;gt;&amp;gt;poz;
    dane * p=new dane;

  if(poz == head)
  {
      poczatek(r);
  }
  else
  {
    p = new dane;
    p-&amp;gt;data = v;
    p-&amp;gt;next = poz;
    p-&amp;gt;prev = poz-&amp;gt;prev;
    ilosc++;
    poz-&amp;gt;prev-&amp;gt;next = p;
    poz-&amp;gt;prev = p;
  }
}
void wyswietl(kurs *r)
{

  dane * p=new element;


  while(p)
  {
    cout &amp;lt;&amp;lt; &quot; &quot; &amp;lt;&amp;lt; p-&amp;gt;data;
    p = p-&amp;gt;next;
  }

}

int main()
{
   kurs*r=new kurs;
   r=NULL;

   int w;
  do
   {
       cout&amp;lt;&amp;lt;&quot;1.Dodawanie elementu  na poczatek listy&quot;&amp;lt;&amp;lt;endl;
        cout&amp;lt;&amp;lt;&quot;2.Dodanie przed element &quot;&amp;lt;&amp;lt;endl;
        cout&amp;lt;&amp;lt;3.Wyswietl liste&quot;&amp;lt;&amp;lt;endl;
        cout&amp;lt;&amp;lt;&quot;Wybor:&quot;;
        cin&amp;gt;&amp;gt;w;
        switch(w)
        {
        case 1:
            poczatek(r);
            break;
        case 2:
            przed(r);
            break;
        case 3:
            wyswietl(r);
            break;
        }

   }while(w !=10);
    return 0;
}
&lt;/pre&gt;



&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
<category>C i C++</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/353038/lista-dwukierunkowa-blad-w-kodzie</guid>
<pubDate>Sat, 26 May 2018 08:57:37 +0000</pubDate>
</item>
<item>
<title>Lista dwukierunkowa - rekurencja</title>
<link>https://forum.pasja-informatyki.pl/348293/lista-dwukierunkowa-rekurencja</link>
<description>

&lt;p&gt;Cześć&lt;/p&gt;



&lt;p&gt;Muszę napisać podane funkcję za pomocą rekurencji. Tyle, że nie do końca wiem jak to można zrobić. Mógłby ktoś mi podpowiedzieć jak to zrobić.&lt;/p&gt;



&lt;p&gt;Kod oryginalnego programu:&lt;/p&gt;



&lt;pre class=&quot;brush:cpp;&quot;&gt;
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

struct dll_node
{
    int data ;
    struct dll_node *prev, * next ;
};

struct dll_node * create_list ( int data )
{
    struct dll_node * front = ( struct dll_node *)
                              malloc ( sizeof ( struct dll_node ) ) ;
    if ( NULL != front )
    {
        front -&amp;gt; data = data ;
        front -&amp;gt; prev = front -&amp;gt; next = NULL ;
    }
    return front ;
}

struct dll_node * insert_front ( struct dll_node *front,
                                 struct dll_node * new_node )
{
    new_node -&amp;gt; next = front ;
    front -&amp;gt; prev = new_node ;
    return new_node ;
}

struct dll_node * find_spot ( struct dll_node *front, int data )
{
    struct dll_node * prev = NULL ;
    while (( NULL != front ) &amp;amp;&amp;amp; (front -&amp;gt; data &amp;gt; data ) )
    {
        prev = front ;
        front = front -&amp;gt; next ;
    }
    return prev ;
}

void insert_after ( struct dll_node *node, struct dll_node * new_node )
{
    new_node -&amp;gt; prev = node ;
    new_node -&amp;gt; next = node -&amp;gt; next ;
    node -&amp;gt;next -&amp;gt; prev = new_node ;
    node -&amp;gt; next = new_node ;
}

void insert_back ( struct dll_node *back, struct dll_node * new_node )
{
    back -&amp;gt; next = new_node ;
    new_node -&amp;gt; prev = back ;
}

struct dll_node * insert_node ( struct dll_node *front, int data )
{
    if ( NULL == front )
        return NULL ;

    struct dll_node * new_node = ( struct dll_node *)
                                 malloc ( sizeof ( struct dll_node ) ) ;
    if ( NULL != new_node )
    {
        new_node -&amp;gt; data = data ;
        new_node -&amp;gt; prev = new_node -&amp;gt; next = NULL ;
        if (front -&amp;gt; data &amp;lt;= data )
            return insert_front (front, new_node ) ;
        else
        {
            struct dll_node * node = find_spot (front, data ) ;
            if ( NULL != node -&amp;gt; next )
                insert_after (node, new_node ) ;
            else
                insert_back (node, new_node ) ;
        }
    }
    return front ;
}

struct dll_node * delete_front ( struct dll_node * front )
{
    struct dll_node * next = front -&amp;gt; next ;
    if ( NULL != next )
        next -&amp;gt; prev = NULL ;
    free ( front ) ;
    return next ;
}

struct dll_node * find_node ( struct dll_node *front, int data )

{
    while (( NULL != front ) &amp;amp;&amp;amp; (front -&amp;gt; data != data ) )
        front = front -&amp;gt; next ;
    return front ;
}

void delete_within ( struct dll_node * node )
{
    node -&amp;gt;next -&amp;gt; prev = node -&amp;gt; prev ;
    node -&amp;gt;prev -&amp;gt; next = node -&amp;gt; next ;
    free ( node ) ;
}

void delete_back ( struct dll_node * back )
{
    back -&amp;gt;prev -&amp;gt; next = NULL ;
    free ( back ) ;
}

struct dll_node * delete_node ( struct dll_node *front, int data )
{
    if ( NULL == front )
        return NULL ;

    if (front -&amp;gt; data == data )
        return delete_front ( front ) ;

    struct dll_node * node = find_node (front, data ) ;
    if ( NULL != node )
    {
        if ( NULL != node -&amp;gt; next )
            delete_within ( node ) ;
        else
            delete_back ( node ) ;
    }
    return front ;
}

void print_list ( struct dll_node * front )
{
    for (; NULL != front ; front = front -&amp;gt; next )
        printf (&quot;%d &quot;, front -&amp;gt; data ) ;
    printf (&quot;\n&quot;) ;
}

void print_list_backwards ( struct dll_node * front )
{
    if ( NULL != front )
    {
        for (; NULL != front -&amp;gt; next ; front = front -&amp;gt; next ) ;
        for (; NULL != front ; front = front -&amp;gt; prev )
            printf (&quot;%d &quot;, front -&amp;gt; data ) ;
    }
    printf (&quot;\n&quot;) ;
}

void remove_list ( struct dll_node ** front )
{
    struct dll_node * next = NULL ;
    while ( NULL != * front )
    {
        next = (* front ) -&amp;gt;next ;
        free (* front ) ;
        * front = next ;
    }
}

int main ()
{
    struct dll_node * front = create_list (1) ;
    int i;

    for (i=2; i &amp;lt;5; i++)
        front = insert_node (front, i) ;
    for (i=6; i &amp;lt;10; i++)
        front = insert_node (front, i) ;
    printf (&quot; List elements :\n&quot;) ;
    print_list ( front ) ;
    printf (&quot; List elements printed backwards :\n&quot;) ;
    print_list_backwards ( front ) ;

    front = insert_node (front, 0) ;
    printf (&quot; List elements after insertion of 0:\n&quot;) ;
    print_list ( front ) ;
    front = insert_node (front, 5) ;
    printf (&quot; List elements after insertion of 5:\n&quot;) ;
    print_list ( front ) ;
    front = insert_node (front, 7) ;
    printf (&quot; List elements after insertion of 7:\n&quot;) ;
    print_list ( front ) ;
    front = insert_node (front, 10) ;
    printf (&quot; List elements after insertion of 10:\n&quot;) ;
    print_list ( front ) ;

    front = delete_node (front, 0) ;
    printf (&quot; List elements after deletion of 0:\n&quot;) ;
    print_list ( front ) ;
    front = delete_node (front, 1) ;
    printf (&quot; List elements after deletion of 1:\n&quot;) ;
    print_list ( front ) ;
    front = delete_node (front, 1) ;
    printf (&quot; List elements after deletion of 1:\n&quot;) ;
    print_list ( front ) ;
    front = delete_node (front, 5) ;
    printf (&quot; List elements after deletion of 5:\n&quot;) ;
    print_list ( front ) ;
    front = delete_node (front, 7) ;
    printf (&quot; List elements after deletion of 7:\n&quot;) ;
    print_list ( front ) ;
    front = delete_node (front, 10) ;
    printf (&quot; List elements after deletion of 10:\n&quot;) ;
    print_list ( front ) ;

    remove_list (&amp;amp; front ) ;
    return 0;
}
&lt;/pre&gt;



&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
<category>C i C++</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/348293/lista-dwukierunkowa-rekurencja</guid>
<pubDate>Fri, 04 May 2018 16:02:00 +0000</pubDate>
</item>
<item>
<title>lista dwukierunkowa</title>
<link>https://forum.pasja-informatyki.pl/299429/lista-dwukierunkowa</link>
<description>

&lt;p&gt;Witam, mam problem z lista dwukierunkową. Funkcja insert podczas dodawania na koniec listy nie przepina wskaźnika końca. Chodzi dokładnie o instrukcje w if. Wszystko sobie rozpisałam i powinno działać, a jednak coś jest nie tak :(&amp;nbsp;&lt;/p&gt;



&lt;pre class=&quot;brush:cpp;&quot;&gt;
class lista{
      public:
             class ogniwo{
                   public:
                   ogniwo * next;
                   ogniwo * prev;
                   int value;
                   };
             class interator{
                   public:
                   ogniwo * wsk;
                   interator next(interator it);
                   };
...&lt;/pre&gt;



&lt;pre class=&quot;brush:cpp;&quot;&gt;
lista::interator lista::insert_list(interator it, int v){
     ogniwo * a = it.wsk;
     ogniwo * b = new ogniwo;
     ogniwo * c = a-&amp;gt;next;
     b-&amp;gt;next = c;
     b-&amp;gt;prev = a;
     b-&amp;gt;value = v;
     c-&amp;gt;prev = b;
     a-&amp;gt;next = b;
     if(b-&amp;gt;next == b){
               koniec.wsk =b;
     }
     size++;
     return it;
}
&lt;/pre&gt;



&lt;p&gt;Z góry dzięki za pomoc &lt;img alt=&quot;angel&quot; src=&quot;https://forum.pasja-informatyki.pl/qa-plugin/ckeditor4/plugins/smiley/images/angel_smile.png&quot; style=&quot;height:23px; width:23px&quot; title=&quot;angel&quot;&gt;&lt;/p&gt;</description>
<category>C i C++</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/299429/lista-dwukierunkowa</guid>
<pubDate>Thu, 02 Nov 2017 18:30:34 +0000</pubDate>
</item>
<item>
<title>Inicjalizacja listy dwukierunkowej</title>
<link>https://forum.pasja-informatyki.pl/241392/inicjalizacja-listy-dwukierunkowej</link>
<description>

&lt;p&gt;Chyba czegoś nie ogarniam ze wskaźnikami... ktoś mógłby mi wskazać błąd?
&lt;br&gt;
head.h
&lt;br&gt;
&amp;nbsp;&lt;/p&gt;



&lt;pre class=&quot;brush:cpp;&quot;&gt;
#ifndef HEAD_H_INCLUDED
#define HEAD_H_INCLUDED

typedef struct dane Dane;
typedef struct lista Lista;
void clearIn();
void endl();
void init(Lista *);
void addBegining(Lista *);

#endif // HEAD_H_INCLUDED
&lt;/pre&gt;



&lt;p&gt;fn.c
&lt;br&gt;
&amp;nbsp;&lt;/p&gt;



&lt;pre class=&quot;brush:cpp;&quot;&gt;
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &quot;head.h&quot;

struct dane {
    char *imie, * nazwisko;
    int pesel;
    Dane *next, *prev;
};

struct lista {
    Dane *head, *tail;
    unsigned count;
};

void clearIn(){
     while(getchar()!='\n');
}

void endl(){
    printf(&quot;\n&quot;);
}

void init(Lista * start) {
    start -&amp;gt; head = NULL;
    start -&amp;gt; tail = NULL;
    start -&amp;gt; count = 0;
}

void addBegining(Lista *lista) {
    Dane *element = (Dane*)malloc(sizeof(Dane));
    char *imie = (char*)malloc(64*sizeof(char));
    printf(&quot;Podaj imie: &quot;);
    gets(imie);
    char *nazwisko = (char*)malloc(64*sizeof(char));
    printf(&quot;Podaj nazwisko: &quot;);
    gets(nazwisko);
    int pesel;
    scanf(&quot;%d&quot;, &amp;amp;pesel);
}
&lt;/pre&gt;



&lt;p&gt;main.c
&lt;br&gt;
&amp;nbsp;&lt;/p&gt;



&lt;pre class=&quot;brush:cpp;&quot;&gt;
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &quot;head.h&quot;

int main()
{
    Dane *my_list;
    Lista *start;
    init(start);
    printf(&quot;Lista dwukierunkowa\n\n&quot;);
    printf(&quot;a. dodaj do listy\tb. wyswietl liste\n&quot;);
    switch(getchar()){
    case 'a':
    case 'A':
        addBegining(start);
        break;
    }
}
&lt;/pre&gt;



&lt;p&gt;Chodzi mi knokretnie o funkcję init. Która ma inicjalizować listę. W mainie tworzę wskaźnik start i chcę przekazać go do funkcji który zainicjalisuje tą listę zerami. &amp;nbsp;Jednak po włączeniu program crashuje.
&lt;br&gt;

&lt;br&gt;
Inna sprawa to w funkcji main chciałem zrobić coś takiego:
&lt;br&gt;
&amp;nbsp;&lt;/p&gt;



&lt;pre class=&quot;brush:cpp;&quot;&gt;
Lista *start = (Lista*)malloc(sizeof(Lista);&lt;/pre&gt;



&lt;p&gt;to dostaję zwrot z kompilatora:
&lt;br&gt;
&quot;error: invalid application of 'sizeof' to incomplete type 'Lista {aka struct lista}'|&quot;
&lt;br&gt;

&lt;br&gt;
Jak to ogarnąć? Co robię źle ;/?
&lt;br&gt;

&lt;br&gt;

&lt;br&gt;
EDIT. Może zdąże zanim ktos przeczyta:
&lt;br&gt;
char *imie = (char*)malloc(64*sizeof(char));
&lt;br&gt;

&lt;br&gt;
Takie cudo.... czy muszę tam określać że ma wielkość 64? Jak bym zrobił np.&amp;nbsp;
&lt;br&gt;
char *imie = (char*)malloc(sizeof(char));
&lt;br&gt;
to czy program sam będzie dostosowywać wielkość w zależności od tego co wpiszę? Czy raczej może być to niebezpieczne?&lt;/p&gt;</description>
<category>C i C++</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/241392/inicjalizacja-listy-dwukierunkowej</guid>
<pubDate>Tue, 04 Apr 2017 09:40:50 +0000</pubDate>
</item>
<item>
<title>[C] Sortowanie listy dwukierunkowej</title>
<link>https://forum.pasja-informatyki.pl/220926/c-sortowanie-listy-dwukierunkowej</link>
<description>Hejo, wiem że są podobne tematy, ale nie znalazłem satysfakcjonującej odpowiedzi.&lt;br /&gt;
Mam sobie listę dwukierunkową, milion różnych danych w niej (typu imię, nazwisko, wiek itd itd). Jak napisać funkcje sortującą tą listę wg zadanego parametru?&lt;br /&gt;
Bardziej niż na kodzie zależy mi na omówieniu jakiegoś schematu/algorytmu, nie musi być nlogn. Tym razem prostota &amp;gt; efektywność. (raczej nie quick, chciałbym załatwić to bez rekursji, napisałem już swoją wersję funkcji swap)&lt;br /&gt;
Nie odsyłajcie proszę do googla, chciałbym żeby wytłumaczył to ktoś przedstawiając swój sposób myślenia.</description>
<category>C i C++</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/220926/c-sortowanie-listy-dwukierunkowej</guid>
<pubDate>Fri, 27 Jan 2017 23:25:36 +0000</pubDate>
</item>
<item>
<title>Struktury dynamiczne napisane obiektowo</title>
<link>https://forum.pasja-informatyki.pl/207642/struktury-dynamiczne-napisane-obiektowo</link>
<description>Poszukuję tutorialów, kursów, filmików, książek, cokolwiek co omówi temat struktur dynamicznych tj. lista jednokierunkowa, lista dwukierunkowa oraz drzewa z tym, że napisanych obiektowo.&lt;br /&gt;
&lt;br /&gt;
Czy coś ciekawego znacie? :)</description>
<category>C i C++</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/207642/struktury-dynamiczne-napisane-obiektowo</guid>
<pubDate>Mon, 19 Dec 2016 21:29:30 +0000</pubDate>
</item>
</channel>
</rss>