Facebook
From Edgy Pheasant, 4 Years ago, written in C++.
Embed
Download Paste or View Raw
Hits: 217
  1. //sortowania lista jednokierunkowa i tablice
  2. #include <iostream>
  3. #include <ctime>
  4. #include <cstdlib>
  5. using namespace std;
  6.  
  7. //int licznikjebany =0;
  8.  
  9. struct node{
  10. node *next;
  11. int val;
  12. };
  13. void delfirst(node*&head);
  14.  
  15. void usunwieksze(node*&head,int odczego)
  16. {
  17.     node*temp=head;
  18.     node*temp2;
  19.  while (temp != NULL && temp->val > odczego) {
  20.         head = temp->next;
  21.         delete temp;
  22.         temp = head;
  23.     }
  24.  
  25.     while(temp!=NULL)
  26.         {
  27.  
  28.          while(temp!=NULL &&temp->val <=odczego)
  29.     {
  30.         temp2=temp;
  31.         temp=temp->next;
  32.     }
  33.  
  34.  
  35.  
  36.     if(temp==NULL)
  37.     return;
  38.  
  39.     temp2->next=temp->next;
  40.     delete temp;
  41.     temp=temp2->next;
  42.  
  43.  
  44.         }
  45.  
  46. }
  47.  
  48. void add(node *&head,int x)
  49. {
  50.     //licznikjebany++;
  51.     node *temp=new node;
  52.     temp->val=x;
  53.     temp->next=head;
  54.     head=temp;
  55.  
  56. }
  57.  
  58.  
  59. node* split(node *&head)
  60. {
  61.   if(head==NULL)
  62.         return NULL;
  63.   node *temp=head;
  64.   node *temp2=head->next;
  65.   while(temp2!=NULL)
  66.   {
  67.       temp2=temp2->next;
  68.       if(temp2==NULL)
  69.         break;
  70.       temp2=temp2->next;
  71.       temp=temp->next;
  72.   }
  73.     node *dozwrocenia= temp->next;
  74.     temp->next=NULL;
  75.     return dozwrocenia;
  76. }
  77.  
  78.  
  79.  
  80. void show(node *head)
  81. {
  82.     node *temp=head;
  83.     while(temp!=NULL)
  84.     {
  85.  
  86.         cout<<temp->val<<"-->";
  87.          temp=temp->next;
  88.     }
  89.  
  90. }
  91. void maxi(node *head)
  92. {
  93.     node *temp=head;
  94.     node *temp2=head;
  95.     while(temp  !=NULL)
  96.     {
  97.         if(temp2->val < temp->val)
  98.         {
  99.          temp2=temp;
  100.         }
  101.  
  102.         temp=temp->next;
  103.  
  104.  
  105.     }
  106.  cout<<temp2->val;
  107. }
  108.  
  109. void delfirst(node*&head)
  110. {
  111.     if(head!=NULL)
  112.     {
  113.        // licznikjebany--;
  114.         node *temp=head;
  115.         head=temp->next;
  116.         delete temp;
  117.  
  118.  
  119.     }
  120. }
  121.  
  122. void usunx2(node *&head)
  123. {
  124.     if(head!=NULL)
  125.     {
  126.         node *temp=head;
  127.         node *temp2=head->next;
  128.         while(temp!=NULL && temp2!=NULL)
  129.         {
  130.             temp->next=temp2->next;
  131.             delete temp2;
  132.             temp=temp->next;
  133.             if(temp!=NULL)
  134.             {
  135.                 temp2=temp->next;
  136.             }
  137.  
  138.  
  139.         }
  140.     }
  141.  
  142. }
  143.  
  144. int srednia(node*head)
  145. {
  146.     int iloscob=0;
  147.     int dodajemy=0;
  148.     if(head==NULL)
  149.        return 0;
  150.     node *temp=head;
  151.     while(temp)
  152.     {
  153.         dodajemy=dodajemy+temp->val;
  154.         temp=temp->next;
  155.         iloscob++;
  156.  
  157.     }
  158.     return dodajemy/iloscob;
  159.  
  160. }
  161. void addxx(node*&head)
  162. {
  163.     node *temp=new node;
  164.     temp=head;
  165.     while(temp!=NULL)
  166.     {
  167.         add(temp->next,temp->val);
  168.         temp=temp->next->next;
  169.  
  170.     }
  171.  
  172.  
  173. }
  174. void addpoval(node*&head)
  175. {
  176.     node *temp=new node;
  177.     temp=head;
  178.     while(temp!=NULL)
  179.     {
  180.         for(int i=0;i<temp->val-1;i++)
  181.         {
  182.         add(temp->next,temp->val);
  183.         temp=temp->next;
  184.  
  185.         }
  186.         temp=temp->next;
  187.     }
  188.  
  189.  
  190. }
  191.  
  192. void bubblesort(node *&head)
  193. {
  194.     node *i,*j;
  195.     int temp;
  196.     i=head;
  197.  
  198.  
  199.     for(i=head;i->next!=NULL;i=i->next)
  200.     {
  201.         for(j=i->next;j!=NULL;j=j->next)
  202.  
  203.             if(i->val>j->val)
  204.         {
  205.             temp=i->val;
  206.             i->val=j->val;
  207.             j->val=temp;
  208.         }
  209.  
  210.     }
  211. }
  212.  
  213. void selectsort(node *&head)
  214. {
  215.     node *i,*j,*dobry;
  216.     int temp;
  217.     i=head;
  218.  
  219.     for(i=head;i->next!=NULL;i=i->next)
  220.     {
  221.         dobry=i;
  222.         // na poczatku zawsze ustawiamy wartosc minimalna na 1 element
  223.         for(j=i->next;j!=NULL;j=j->next) // ta petla porownuje wartosc minimalna z kolejnymi elementami
  224.         {                                 // jesli znajdzie mniejsza wartosc to ona zostaje nowym minimalem
  225.             if(dobry->val>j->val)
  226.             {
  227.                 dobry=j;
  228.             }
  229.         }
  230.         if(dobry->val !=i->val)
  231.         {
  232.             temp=i->val;
  233.             i->val=dobry->val; //jesli wartosc minimalna rozni sie od indeksu pierwszej robimy swapa
  234.             dobry->val=temp;
  235.         }
  236.  
  237.     }
  238. }
  239.  
  240. void addtosorted(node *&head,int x)
  241. {
  242. //    licznikjebany++;
  243.     add(head,NULL);
  244.     node *temp2=head;
  245.     while((temp2->next!=NULL) && (temp2->next->val<x))
  246.           {
  247.               temp2=temp2->next;
  248.           } //temp 2 l¹duje zawsze przed wiekszym elementem
  249.           //dodawanie nody
  250.           node *temp = new node;
  251.           temp->val=x;
  252.           temp->next=temp2->next;
  253.           temp2->next=temp;
  254.           delfirst(head);
  255.  
  256. }
  257. void insertionSort(node *&head)
  258. {
  259.     // Initialize sorted linked list
  260.    node *sorted = NULL;
  261.  
  262.     // Traverse the given linked list and insert every
  263.     // node to sorted
  264.     node *current = head;
  265.     while (current != NULL)
  266.     {
  267.         // Store next for next iteration
  268.       node *next = current->next;
  269.  
  270.         // insert current in sorted linked list
  271.         addtosorted(*&sorted, current->val);
  272.  
  273.         // Update current
  274.         current = next;
  275.     }
  276.  
  277.     // Update head_ref to point to sorted linked list
  278.     head = sorted;
  279. }
  280. /* Rozbija node z podanej listy na przednie i tylnie po³owy,
  281.         i zwraca je u¿ywaj¹c referencji.
  282.         Jeœli d³ugoœæ jjest niecodzienna to dodatkowy node idzie na przód.
  283.         U¿ywa fast/slow. */
  284.         //source - head z funkcji MergeSort| front i back to a i b
  285. void FrontBackSplit(node* source, node*& frontRef, node*& backRef)
  286. {
  287.         node* fast;
  288.         node* slow;
  289.         slow = source;
  290.         fast = source->next;
  291.  
  292.         /* fast przechodzi o 2 node a slow o jeden dzieki czemu znajdujemy srodek listy w efektywnym czasie */
  293.         while (fast != NULL) {
  294.                 fast = fast->next;
  295.                 if (fast != NULL) {
  296.                         slow = slow->next;
  297.                         fast = fast->next;
  298.                 }
  299.         }
  300.  
  301.         /* Zwracamy wartoœci-slow jest zaraz przed œrodkiem
  302.         wiec aby rozbic na pó³ potrzeba nam slow->next. */
  303.         frontRef = source;
  304.         backRef = slow->next;
  305.         slow->next = NULL;
  306. }
  307.  
  308. /* funkcja laczaca posorotowane podlsty(lista d³ugoœci 1 jest zawsze posortowana)  */
  309. node* SortedMerge(node* a, node* b)
  310. {
  311.         node* result = NULL;
  312.  
  313.         /*Jeœli niema 2giego elemetu do scalenia to zwróæ ten jeden istniej¹cy */
  314.         if (a == NULL)
  315.                 return (b);
  316.         else if (b == NULL)
  317.                 return (a);
  318.  
  319.         /*Wybiera jeden z elementów i wywo³uje siê rekurencyjnie */
  320.         if (a->val <= b->val) {
  321.                 result = a;
  322.                 result->next = SortedMerge(a->next, b);
  323.         }
  324.         else {
  325.                 result = b;
  326.                 result->next = SortedMerge(a, b->next);
  327.         }
  328.         return (result);
  329. }
  330.  
  331. void MergeSort(node *& head)
  332. {
  333.         node* pom = head;
  334.         node* a;
  335.         node* b;
  336.  
  337.         /* Jeœli lista ma d³ugoœæ 0 lub 1 to nie ma czego sortowaæ */
  338.         if ((head == NULL) || (head->next == NULL)) {
  339.                 return;
  340.         }
  341.  
  342.         /*Rozbijamy head na 2 podlisty */
  343.         FrontBackSplit(head, a, b);
  344.  
  345.         /* rozbite podlisty rozbijamy dalej tworz¹c coraz mniejsze listy */
  346.         MergeSort(a);
  347.         MergeSort(b);
  348.  
  349.         /* z³¹cza posortowane listy ze sob¹ */
  350.         head = SortedMerge(a, b);
  351. }
  352.  
  353.  
  354.  
  355. void wypelnij(int * tab, int rozmiar)
  356. {
  357.         for (int i = 0; i < rozmiar; i++)
  358.         {
  359.                 tab[i] = (rand() % 100);
  360.         }
  361. }
  362.  
  363. void wypisz_tablice(int * tab ,int rozmiar)
  364. {
  365.         for (int i = 0; i < rozmiar; i++)
  366.         {
  367.                 cout << "tab [" << i << "] = [" << tab[i] << "]" << endl;
  368.         }
  369. }
  370.  
  371. void swapp( int &x, int &y){
  372. int tmp =x;
  373. x=y;
  374. y= tmp ;
  375. }
  376. void shiftdown (int*t, int i, int n) {
  377. for ( int l =2* i; l <= n; i=l, l =2* i) {
  378. if(l+1 <= n && t[l +1] > t[l]) ++l;
  379. if(t[i] >= t[l]) return ;
  380. swapp (t[i], t[l]);
  381. }
  382. }
  383. void buildheapBU (int*t, int n) {
  384. for ( long i=n /2; i; --i)
  385. shiftdown (t, i, n);
  386. }
  387.  
  388. void heap_sort (int*t, int n) {
  389. --t; // teraz indeks 1 pokazuje na element 0 !
  390. buildheapBU (t, n); // shiftdown / shifup
  391. while (n > 1) {
  392. // przenosimy max. elem . na koniec kopca
  393. swapp (t[1] , t[n]);
  394. // przywracamy w³asnosc kopca dla mniejszego kopca
  395. shiftdown (t, 1, --n);
  396. }
  397. }
  398.  
  399. void sortowanie_grzebieniowe(int * tab,int rozmiar)
  400. {
  401.         int gap = rozmiar;
  402.         int temp;
  403.         bool czy_zamieniono = true;
  404.         while (gap > 1 || czy_zamieniono)               //tak d³ugo a¿ nei dokonamy zamiany albo gap nie bêdzie mniejszy od 1 wykonuj
  405.         {
  406.                 gap = (gap/(1.3));
  407.                 if (gap == 9 || gap == 10) gap = 11;//s¹ to niekorzystne wartosci ktore obni¿aja wydajnoœæ
  408.                 if (gap == 0)
  409.                 {
  410.                         gap = 1;                                                // jeœli gap jest równy 0 to ustawiamy go na 1 ¿eby nadal dokonywaæ zamian
  411.                 }
  412.                 czy_zamieniono = false;                         //jesli nie dokonamy zamiany to wyjdziemy z petli
  413.                 for (int i = 0; i + gap < rozmiar; i++)
  414.                 {
  415.                         if (tab[i + gap] < tab[i])
  416.                         {
  417.                                 temp = tab[i];
  418.                                 tab[i] = tab[i + gap];
  419.                                 tab[i + gap] = temp;
  420.                                 czy_zamieniono = true;
  421.                         }
  422.                 }
  423.         }
  424. }
  425.  
  426.  
  427. int main()
  428. {
  429.  
  430.     node *head=NULL;
  431.  
  432.     //delfirst(head);
  433.     show(head);
  434.     cout<<endl<<"wywolanie"<<endl;
  435.     add(head,3);
  436.     add(head,1);
  437.     add(head,3);
  438.     add(head,-2);
  439.     add(head,5);
  440.     add(head,10);
  441.  
  442.  
  443.  
  444.    //addpoval(head);
  445.   // usunx2(head);
  446.    show(head);
  447.    cout<<endl;
  448.      //  cout<<"licznik:"<<licznikjebany<<endl;
  449.  
  450.    MergeSort(head);
  451.    show(head);
  452.    cout<<endl;
  453.  
  454.  
  455.         srand(time(NULL));
  456.  
  457.     //addxx(head);
  458.  
  459.         int tab[10]={9,8,5,6,2,1,2,5,6,1};
  460.         //wypelnij(tab, a);
  461.     wypisz_tablice(tab, 10);
  462.         //sortowanie_grzebieniowe(tab, a);
  463.         cout<<"po sortowaniu"<<endl;
  464.         heap_sort(tab,10);
  465.         wypisz_tablice(tab, 10);
  466.  
  467.  
  468.  
  469.     return 0;
  470. }
  471.  
  472.  
  473. //drzewo BST
  474. #include <iostream>
  475.  
  476. using namespace std;
  477.  
  478. struct node {
  479.     int val;
  480.     node *P;
  481.     node *L;
  482.     node *O;
  483. };
  484.  
  485. void insertBST(node *& root, int val) {
  486.     if (root == NULL) {
  487.         root = new node;
  488.         root->val = val;
  489.         root->L = root->P = NULL;
  490.     }
  491.     else {
  492.         if (val < root->val) {
  493.             insertBST(root->L, val);
  494.             root->L->O = root;
  495.         }
  496.         else {
  497.             insertBST(root->P, val);
  498.             root->P->O = root;
  499.         }
  500.     }
  501. }
  502.  
  503. void inorder(node *root) {
  504.     if (root != NULL) {
  505.         inorder(root->L);
  506.         cout << root->val << " ";
  507.         inorder(root->P);
  508.     }
  509. }
  510.  
  511. void find_sek(node*root, int val) {
  512.     while (root) {
  513.         if (root->val == val) {
  514.             cout << "element istnieje!" << endl;
  515.             break;
  516.         }
  517.         else if (root->val > val) {
  518.             root = root->L;
  519.         }
  520.         else {
  521.             root = root->P;
  522.         }
  523.     }
  524. }
  525.  
  526. void find_rek(node*root, int val) {
  527.     if (root != NULL) {
  528.         if (root->val == val) {
  529.             cout << "element istnieje" << endl;
  530.         }
  531.         else if (root->val > val) {
  532.             find_rek(root->L, val);
  533.         }
  534.         else {
  535.             find_rek(root->P, val);
  536.         }
  537.     }
  538. }
  539.  
  540. node* usun_liscie(node*root) {
  541.     if (root != NULL)
  542.     {
  543.         if (root->L == NULL && root->P == NULL)
  544.         {
  545.             delete root;
  546.             return NULL;
  547.         }
  548.         else
  549.         {
  550.             root->L = usun_liscie(root->L);
  551.             root->P = usun_liscie(root->P);
  552.         }
  553.     }
  554.     return root;
  555. }
  556.  
  557. node* max(node*root) {
  558.     while (root->P) root = root->P;
  559.     return root;
  560. }
  561.  
  562. void poprzednik(node*root, node*&pop, int x) {
  563.     if (root == NULL) {
  564.         pop = NULL;
  565.         return;
  566.     }
  567.         if (root->val == x) {
  568.             if (root->L) {
  569.                 pop = max(root->L);
  570.             }
  571.         }
  572.         else if (x < root->val) {
  573.             poprzednik(root->L, pop, x);
  574.         }
  575.         else {
  576.             pop = root;
  577.             poprzednik(root->P, pop, x);
  578.         }
  579.  
  580. }
  581.  
  582. int main()
  583. {
  584.     node*root = NULL;
  585.     insertBST(root, 15);
  586.     insertBST(root, 6);
  587.     insertBST(root, 18);
  588.     insertBST(root, 17);
  589.     insertBST(root, 20);
  590.     insertBST(root, 3);
  591.     insertBST(root, 7);
  592.     insertBST(root, 2);
  593.     insertBST(root, 4);
  594.     insertBST(root, 13);
  595.     insertBST(root, 9);
  596.  
  597.     inorder(root);
  598.     cout << endl;
  599.     //usun_liscie(root);
  600.     inorder(root);
  601.     cout << endl;
  602.     node*pop = NULL;
  603.     poprzednik(root, pop, 17);
  604.     cout << "Poprzednik dla wartosci wprowadzonej w funkcji wyzej (17) to: " <<pop->val << endl;
  605.  
  606.    // system("PAUSE");
  607.     return 0;
  608. }
  609.  
  610. //kolejki + stos
  611. #include <iostream>
  612.  
  613. using namespace std;
  614.  
  615. struct  node{
  616. node*next;
  617. int val;
  618. };
  619.  
  620.  
  621. void enqueue(node *&Q,node *&T,int x)
  622. {
  623.     node*p =new node;
  624.     p->val=x;
  625.     p->next=NULL;
  626.     if(Q==NULL)
  627.     Q=p;
  628.     else
  629.     T->next=p;
  630.  
  631.     T=p;
  632. }
  633.  
  634. void dequeue(node*&Q,node *&T)
  635. {
  636.     if(Q!=NULL)
  637.     {
  638.         node *p=Q;
  639.         Q=Q->next;
  640.         delete p;
  641.     }
  642.     if(Q==NULL)
  643.     T=NULL;
  644.  
  645. }
  646. void showfirst(node* Q)
  647. {
  648.       if(Q!=NULL){
  649.     node *p = Q;
  650.     cout<<p->val;
  651.  
  652.     }
  653. }
  654.  
  655. void showlast(node* T)
  656. {
  657.       if(T!=NULL){
  658.     node *p = T;
  659.     cout<<p->val;
  660.  
  661.     }
  662. }
  663.  
  664.  bool is_Emptyx(node*Q)              //t-next=new node; t=t-next;  t-val=x; t-next=null;   -  to ->
  665.  {
  666.      if(Q==NULL)
  667.      return true;
  668.      else
  669.      return false;
  670.  }
  671.  
  672.  
  673.  
  674. bool is_Empty(node*stos)
  675. {
  676.     if(stos==NULL)
  677.         return true;
  678.     else
  679.         return  false;
  680.  
  681. }
  682.  
  683. void push(node*&stos,int x)
  684. {
  685. node *temp=new node;
  686. temp->val=x;
  687. temp->next=stos;
  688. stos=temp;
  689. }
  690.  
  691. int pop(node*&stos)
  692. {
  693.     if(is_Empty(stos))
  694.     {
  695.         cout<<"stos jest pusty";
  696.     }
  697.     else
  698.         {
  699.    node*temp=stos;
  700.    stos=stos->next;
  701.    return (temp->val);
  702.         }
  703. }
  704.  
  705. void showtop(node*stos)
  706. {
  707.   if(is_Empty(stos))
  708.     {
  709.         cout<<endl<<"stos jest pusty";
  710.     }
  711.     else
  712.   {
  713.       node *temp=stos;
  714.       cout<<"gora stosu :"<<temp->val;
  715.  
  716.   }
  717. }
  718.  
  719. void stosnakolejke(node*&stos,node *&Q,node *&T)
  720. {
  721.     node *temp=stos;
  722.     while(temp!=NULL)
  723.     {
  724.         int x=pop(temp);
  725.         temp=temp->next;
  726.         cout<<"wrzucam na kolejke: "<<x;
  727.         enqueue(Q,T,x);
  728.     }
  729. }
  730.  
  731. int dequeuex(node*&Q,node *&T)
  732. {
  733.     if(Q!=NULL)
  734.     {
  735.         node *p=Q;
  736.         Q=Q->next;
  737.         return (p->val);
  738.     }
  739.     if(Q==NULL)
  740.     T=NULL;
  741.  
  742. }
  743.  
  744. void stosnakolejkecaly(node*&stos,node *&Q,node *&T)
  745. {
  746.  
  747.     while(stos!=NULL)
  748.     {
  749.         int x=pop(stos);
  750.         //temp=temp->next;
  751.         //cout<<"wrzucam na kolejke: "<<x;
  752.         enqueue(Q,T,x);
  753.     }
  754. }
  755.  
  756. void kolejkanastoscala(node*&stos,node *&Q,node *&T)
  757. {
  758.     while(Q!=NULL)
  759.     {
  760.         int x=dequeuex(Q,T);
  761.         push(stos,x);
  762.     }
  763.  
  764. }
  765.  
  766. void kolejkanastos(node*&stos,node *&Q,node *&T)
  767. {
  768.  
  769.     while(Q!=NULL)
  770.     {
  771.         int x=dequeuex(Q,T);
  772.         push(stos,x);
  773.         Q=Q->next;
  774.  
  775.     }
  776.  
  777.  
  778. }
  779.  
  780. void show(node*stos)
  781. {
  782.     node *temp=stos;
  783.     while(temp!=NULL)
  784.     {
  785.  
  786.         cout<<temp->val<<"->"<<endl;
  787.         temp=temp->next;
  788.     }
  789.  
  790. }
  791.  
  792. void showxx(node*Q)
  793. {
  794.     node *temp=Q;
  795.     while(temp!=NULL)
  796.     {
  797.  
  798.         cout<<temp->val<<"->"<<endl;
  799.         temp=temp->next;
  800.     }
  801.  
  802. }
  803.  
  804.  
  805. int main()
  806. {
  807.  
  808.     node* Q = NULL;
  809.     node* T=NULL;
  810.     node*stos=NULL;
  811.     push(stos,5);
  812.     push(stos,2);
  813.     push(stos,3);
  814.     push(stos,6);
  815.     push(stos,7);
  816.     push(stos,1);
  817.     show(stos);
  818.     stosnakolejkecaly(stos,Q,T);
  819.     cout<<endl;
  820.     cout<<"1 element kolejki: ";
  821.     showfirst(Q);
  822.     cout<<endl;
  823.     cout<<"ostatni element kolejki: ";
  824.     showlast(T);
  825.     cout<<endl;
  826.     showxx(Q);
  827.     cout<<endl;
  828.     showtop(stos);
  829.     cout<<endl<<"kolejka na stos";
  830.  
  831.     kolejkanastos(stos,Q,T);
  832.     show(stos);
  833.  
  834.  
  835.     return 0;
  836. }
  837.  
  838.  
  839.  
  840.