Advertisement
Garey

Danny_zadachka_SAA_spisuk

Apr 2nd, 2018
454
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.52 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. /* Struktura za spisuka */
  6. struct List {
  7.     int key;
  8.     struct List* next;
  9. };
  10.  
  11. /*
  12.     Vzema purviqt element ot purviqt spisuk i go slaga kato
  13.     kato purvi element na vtoriqt spisuk
  14. */
  15. void move_element(struct List**, struct List**);
  16.  
  17. /*
  18.     Vzema dva spisuka, sortirani vuv vuzhodqsht red i obedinqva
  19.     elementite im v edin nov spisuk
  20. */
  21. struct List* combine_lists(struct List* list1, struct List* list2)
  22. {
  23.     /* Vremenen element da sudurja rezultata */
  24.     struct List temp;
  25.  
  26.     /* sochi kum kraq na spisuka */
  27.     struct List* end = &temp;
  28.  
  29.     /* taka che sledvashtiqt element na krainiqt da e
  30.        mqstoto, kudeto da se dobavqt novi elementi */
  31.     temp.next = nullptr;
  32.     while (1)
  33.     {
  34.         if (list1 == nullptr)
  35.         {
  36.             /* Ako edin ot spisucite svurshi(toest nqma
  37.                elementi veche), izpolzvame drugiqt spisuk
  38.             */
  39.             end->next = list2;
  40.             break;
  41.         }
  42.         else if (list2 == nullptr)
  43.         {
  44.             end->next = list1;
  45.             break;
  46.         }
  47.         if (list1->key <= list2->key)
  48.             move_element(&(end->next), &list1);
  49.         else
  50.             move_element(&(end->next), &list1);
  51.  
  52.         end = end->next;
  53.     }
  54.     return(temp.next);
  55. }
  56.  
  57. /* move_element()
  58.  
  59.    funkciqta vzema element ot nachaloto na ediniqt spisuk i
  60.    go premestva v nachaloto na drugiqt spisuk. Greshka e da
  61.    se izvika funkciqta pri prazen spisuk
  62.  
  63.    Predi izvikvaneto na move_element():
  64.    list1 == {1, 2, 3}
  65.    list2 == {1, 2, 3}
  66.  
  67.    Sled izvikvaneto na move_element():
  68.    list1 == {2, 3}
  69.    list2 == {1, 1, 2, 3} */
  70. void move_element(struct List** list1, struct List** list2)
  71. {
  72.     /*
  73.         ukazatel kum nachaloto na vtoriqt spisuk
  74.         kum koito shte se dobavqt elementite v nachaloto
  75.     */
  76.     struct List* new_list = *list2;
  77.  
  78.     /* Advance the source pointer */
  79.     *list2 = new_list->next;
  80.  
  81.     /* Link the old dest off the new node */
  82.     new_list->next = *list1;
  83.  
  84.     /* Move dest to point to the new node */
  85.     *list1 = new_list;
  86. }
  87.  
  88.  
  89. /* Funkciq za vuvejdane v nachaloto na spisuka */
  90. void push(struct List** begin, int number) {
  91.     /* Zadelqne na pamet za nov vremenen spisuk*/
  92.     struct List* elem = (struct List*) malloc(sizeof(struct List));
  93.  
  94.     /* Vuvejdame chisloto v kletkata  */
  95.     elem->key  = number;
  96.  
  97.     /* Pravim sledvashtiqt ukazatel da sochi kum nachaloto na spisuka
  98.         za da se dobavqt novite elementi tam
  99.     */
  100.     elem->next = (*begin);
  101.  
  102.     /* Zadavame na ukazatelqt, koito sochi nachaloto na
  103.         spisuka kum noviqt element, za da moje da se
  104.         dobavqt novi elementi
  105.     */
  106.     (*begin) = elem;
  107. }
  108.  
  109. /* Function to print nodes in a given linked list */
  110. void print_list(struct List *list) {
  111.     while (list != nullptr) {
  112.         cout << list->key << "  ";
  113.         list = list->next;
  114.     }
  115. }
  116.  
  117. /* Glavna funkciq*/
  118. int main()
  119. {
  120.     /* Zanulqvane na spisucite */
  121.     struct List* a = nullptr;
  122.     struct List* b = nullptr;
  123.     struct List* c = nullptr;
  124.  
  125.     /* Suzdavame dva spisuka
  126.        a: 1->10->7,  b: 18->4->13 */
  127.     push(&a, 1);
  128.     push(&a, 10);
  129.     push(&a, 7);
  130.  
  131.     push(&b, 18);
  132.     push(&b, 4);
  133.     push(&b, 13);
  134.  
  135.     /* Izvejdame vseki spisuk po otdelno */
  136.  
  137.     cout << "List A: \n";
  138.     print_list(a);
  139.  
  140.     cout << "\n\nList B: \n";
  141.     print_list(b);
  142.  
  143.     /* Kombinirame dvata spisuka v treti spisuk s ime c  */
  144.     c = combine_lists(a, b);
  145.  
  146.     /* Izvejdame kombiniraniqt spisuk */
  147.     cout << "\n\nList C: \n";
  148.     print_list(c);
  149.  
  150.     cout << "\n\n";
  151.     return 0;
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement