Advertisement
majczel23000

Lista z zamianą

Mar 11th, 2018
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.65 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. //===========================
  5. //JEDNOKIERUNKOWA
  6. //===========================
  7. struct wezel{
  8.     wezel *next;
  9.     int key;
  10. };
  11.  
  12. void print(wezel *head)
  13. {
  14.     cout<<"[LISTA] ";
  15.     if(head==NULL)
  16.         cout<<"Lista jednokierunkowa pusta";
  17.     else
  18.         while(head!=NULL)
  19.         {
  20.             if(head->next!=0)
  21.                 cout<<head->key<<" -> ";
  22.             else
  23.                 cout<<head->key;
  24.             head = head->next;
  25.         }
  26.     cout<<endl;
  27. }
  28.  
  29. //DODAWANIE ELEMENTOW WEDLUG WARTOSCI, CZYLI SORTOWANIE
  30. void add(wezel *&head, int key)
  31. {
  32.     wezel * n = new wezel;
  33.     n->key = key;
  34.     if(head == NULL)
  35.     {
  36.         head = n;
  37.         n->next = 0;
  38.     }
  39.     else
  40.     {
  41.         if(head->key > key)
  42.         {
  43.             n->next = head;
  44.             head = n;
  45.         }
  46.         else
  47.         {
  48.             wezel *p = head;
  49.             wezel *x = head->next;
  50.             while(x != NULL && x->key <= key)
  51.             {
  52.                 p = x;
  53.                 x = x->next;
  54.             }
  55.             n->next = x;
  56.             p->next = n;
  57.         }
  58.     }
  59. }
  60.  
  61. void search(wezel* head,int key)
  62. {
  63.     while(head!=NULL && key != head->key)
  64.         head= head->next;
  65.     if(head!=0)
  66.         cout<<"Element o kluczu: "<<key<< " istnieje i znajduje sie pod adresem: "<<head<<endl;
  67.     else
  68.         cout<<"Element o kluczu: "<<key<< " nie istnieje"<<endl;
  69. }
  70.  
  71. void usun(wezel *& head, int key)
  72. {
  73.     if(head == NULL)
  74.         cout<<"Lista pusta"<<endl;
  75.     else if(head->key > key)
  76.     {
  77.         cout<<"Nie ma takiego elementu"<<endl;
  78.     }
  79.     else if(head->key == key)
  80.     {
  81.         wezel *p = head->next;
  82.         delete head;
  83.         head = p;
  84.         cout<<"Usunieto head o kluczu: "<<key<<endl;
  85.     }
  86.     else
  87.     {
  88.         wezel *p, *n;
  89.         p = head;
  90.         n = head->next;
  91.         for( ; n != 0; n = n->next)
  92.         {
  93.             if(key == n->key)
  94.             {
  95.                 p->next = n->next;
  96.                 delete n;
  97.                 cout<<"Usunieto element o kluczu: "<<key<<endl;
  98.             }
  99.             else
  100.                 p = n;
  101.         }
  102.     }
  103. }
  104.  
  105. void usun_liste(wezel * & head)
  106. {
  107.     wezel *p;
  108.     while(head!=0)
  109.     {
  110.         p = head->next;
  111.         delete head;
  112.         head = p;
  113.     }
  114.     cout<<"Usunieto liste jednokierunkowa"<<endl;
  115. }
  116.  
  117. void poprzedni(wezel * head, int x){
  118.     wezel *p = head;
  119.     wezel *poprzedni = head;
  120.     for(p, poprzedni; p != NULL && poprzedni != NULL; p = p->next){
  121.         if(x == head->key){
  122.             cout << "To jest pierwszy element, przed nim nic nie ma" << endl;
  123.             break;
  124.         }
  125.         if(p->key == x)
  126.             cout << "Poprzednik "<< x<< " to "<<poprzedni->key << endl;
  127.         if(p != head)
  128.             poprzedni = poprzedni->next;
  129.     }
  130. }
  131.  
  132.  
  133. //===========================
  134. //DWUKIERUNKOWA
  135. //===========================
  136.  
  137. struct wezel2{
  138.     wezel2 *next;
  139.     wezel2 *prev;
  140.     int key;
  141. };
  142.  
  143.  
  144. void print2(wezel2 *head)
  145. {
  146.     cout<<"[LISTA] ";
  147.     if(head==NULL)
  148.         cout<<"Lista dwukierunkowa pusta";
  149.     else
  150.         while(head!=NULL)
  151.         {
  152.            if(head->next!=0)
  153.                 cout<<head->key<<" <-> ";
  154.             else
  155.                 cout<<head->key;
  156.             head = head->next;
  157.         }
  158.     cout<<endl;
  159. }
  160.  
  161. void print2_from_end(wezel2 *head)
  162. {
  163.     cout<<"[LISTA - od konca] ";
  164.     if(head==NULL)
  165.         cout<<"Lista dwukierunkowa pusta";
  166.     else
  167.         while(head->next!=NULL)
  168.             head = head->next;
  169.         while(head!=NULL)
  170.         {
  171.             if(head->prev!=0)
  172.                 cout<<head->key<<" <-> ";
  173.             else
  174.                 cout<<head->key;
  175.             head = head->prev;
  176.  
  177.         }
  178.     cout<<endl;
  179. }
  180.  
  181. void poprzedni2(wezel2 * head, int x){
  182.     wezel2 *p = head;
  183.     for(p; p != NULL ; p = p->next){
  184.         if(x == head->key){
  185.             cout << "To jest pierwszy element, przed nim nic nie ma" << endl;
  186.             break;
  187.         }
  188.         if(p->key == x)
  189.             cout << "Poprzednik "<< x<< " to "<<p->prev->key << endl;
  190.     }
  191. }
  192.  
  193. void add2(wezel2 *&head, int key)
  194. {
  195.     wezel2 * n = new wezel2;
  196.     n->key = key;
  197.     if(head == NULL)    //jesli pusta
  198.     {
  199.         head = n;
  200.         n->next = 0;
  201.         n->prev = 0;
  202.     }
  203.     else
  204.     {
  205.         if(head->key > key) //jesli dodajemy przed head
  206.         {
  207.             n->next = head;
  208.             n->prev = 0;
  209.             head->prev = n;
  210.             head = n;
  211.         }
  212.         else    //dodajemy za head
  213.         {
  214.             wezel2 *p = head;
  215.             wezel2 *x = head->next;
  216.             while(x != NULL && x->key <= key)
  217.             {
  218.                 p = x;
  219.                 x = x->next;
  220.             }
  221.             if(x==NULL)
  222.                 n->next = 0;
  223.             else
  224.             {
  225.                 x->prev = n;
  226.                 n->next = x;
  227.             }
  228.             n->prev = p;
  229.             p->next = n;
  230.         }
  231.     }
  232. }
  233.  
  234. void dodaj_koniec2(wezel2* &head, int key)
  235. {
  236.     wezel2 * n = new wezel2;
  237.     n->key = key;
  238.     wezel2 *p = head;
  239.     if(head==NULL)  //jesli jest pusta to dodawanie na koniec dodaje nowy head
  240.     {
  241.          head = n;
  242.          n->next = 0;
  243.          n->prev = 0;
  244.     }
  245.     else    //jesli juz cos jest to dodaje na koniec
  246.     {
  247.         while(p->next!=0)
  248.             p = p->next;
  249.         p->next = n;
  250.         n->next = 0;
  251.         n->prev = p;
  252.     }
  253. }
  254.  
  255. void dodaj_pocz2(wezel2* &head, int key)
  256. {
  257.     wezel2 * n = new wezel2;
  258.     n->key = key;
  259.     if(head==NULL)  //jesli jest pusta
  260.          n->next = 0;
  261.     else
  262.     {
  263.         n->next = head;
  264.         n->next->prev = n;
  265.     }
  266.             //jesli cos jest
  267.  
  268.     head = n;
  269.     n->prev = 0;
  270. }
  271.  
  272. void usun2(wezel2 *& head, int key)
  273. {
  274.     //usuwa tylko pierwsze wyst¹pienie
  275.     if(head == NULL)
  276.         cout<<"Lista pusta"<<endl;
  277.     else if(head->key == key)
  278.     {
  279.         wezel2 *p = head->next;
  280.         delete head;
  281.         head = p;
  282.         head->prev = 0;
  283.         cout<<"Usunieto head o kluczu: "<<key<<endl;
  284.     }
  285.     else
  286.     {
  287.         wezel2 *p, *n;
  288.         p = head;
  289.         n = head->next;
  290.         while(n!=0 && key!=n->key)
  291.         {
  292.             p = n;
  293.             n=n->next;
  294.         }
  295.         p->next = n->next;
  296.         if(n->next!=0)
  297.             n->next->prev = p;
  298.         delete n;
  299.         cout<<"Usunieto element o kluczu: "<<key<<endl;
  300.     }
  301. }
  302.  
  303. void usun_liste2(wezel2 * & head)
  304. {
  305.     wezel2 *p;
  306.     while(head!=0)
  307.     {
  308.         p = head->next;
  309.         delete head;
  310.         head = p;
  311.     }
  312.     cout<<"Usunieto liste dwukierunkowa"<<endl;
  313. }
  314.  
  315.  
  316. //ZAMIANA SZUKANEGO ELEMENTU Z NASTEPNIKIEM
  317. void zamien(wezel * & head, int x)
  318. {
  319.     wezel *p = head;    //wskazuje na poczatek listy
  320.     wezel *q;           //wykorzystam do pamiętania poprzednika szukanego
  321.     while(p->key != x && p->next!=NULL)  //szukamy danego x
  322.     {
  323.         q = p;
  324.         p=p->next;
  325.     }
  326.     if(p == NULL)       //jesli nie ma szukanego x to while przejdzie przez cala liste az dojdzie do smieci i null
  327.         cout<<"Nie ma takiego x"<<endl;
  328.     else
  329.     {
  330.         if(p->next == NULL) //jesli jest x, ale nie ma nastepnika to nie mozemy zamienic
  331.             cout<<"Jest taki x, ale nie ma nastepnika"<<endl;
  332.         else    //jesli mozemy zamienic
  333.         {
  334.             //q aktualnie wskazuje poprzednika znalezionego elementu o wartosci x
  335.             //p wskazuje aktualnie znalezniony element o wartosci x
  336.             //w bedzie wskazywac nastepnika p
  337.             //temp - zmienna tymczasowa do przechowania p
  338.             wezel *w = p->next;
  339.             wezel *temp = p;
  340.             p = w;
  341.             w = temp;
  342.             w->next = p->next;
  343.             p->next = w;
  344.             q->next = p;
  345.  
  346.         }
  347.     }
  348. }
  349.  
  350. //ZAMIANA SZUKANEGO ELEMENTU Z POPRZEDNIKIEM
  351. void zamien2(wezel * & head, int x)
  352. {
  353.     wezel *p = head;    //wskazuje na poczatek listy
  354.     wezel *q;           //wykorzystam do pamiętania poprzednika szukanego
  355.     while(p->key != x && p != NULL)  //szukamy danego x
  356.     {
  357.         q = p;
  358.         p=p->next;
  359.     }
  360.     if(p == head)       //jesli element do zamiany to head
  361.         cout<<"nie mozna zamienic z poprzednikiem, bo jest to pierwszy element na liscie"<<endl;
  362.     else if(p == NULL)  //jesli nie ma szukanego x to while przejdzie przez cala liste az dojdzie do smieci i null
  363.         cout<<"Nie ma takiego x";
  364.     else    //jesli mozemy zamienic
  365.     {
  366.         if(q == head)   //jesli x jest drugim elementem na liscie to jego poprzednik to head
  367.         {
  368.             head = p;
  369.             wezel *temp = p->next;
  370.             p = q;
  371.             head->next = p;
  372.             p->next = temp;
  373.         }
  374.         else
  375.         {
  376.             //szukamy poprzednika poprzednika znalezionego elementu x
  377.             wezel *pop = head;
  378.             while(pop->next!=q)
  379.                 pop = pop->next;
  380.             //temp wskazuje poprzenika elementu o wartosci x
  381.             //tmp wskazuje nastepnika elementu o wartosci x
  382.             //q wskazuje poprzednika elementu o wartosci x
  383.             //p wskazuje element o wartosci x
  384.             //pop wskazuje poprzednika q
  385.             wezel *temp = q;
  386.             wezel *tmp = p->next;
  387.             q = p;
  388.             p = temp;
  389.             pop->next = q;
  390.             q->next = p;
  391.             p->next = tmp;
  392.         }
  393.     }
  394. }
  395.  
  396. int main(){
  397.     //dodawanie elementow do listy do testowania dzialania zamiany
  398.     wezel *head = 0;
  399.     add(head, 1);
  400.     add(head, 2);
  401.     add(head, 3);
  402.     add(head, 4);
  403.     add(head, 5);
  404.     add(head, 6);
  405.     add(head, 7);
  406.     print(head);
  407.     zamien2(head, 4);
  408.     print(head);
  409.  
  410.  
  411.  
  412.  
  413.  
  414.     return 0;
  415. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement