Advertisement
Guest User

Untitled

a guest
Nov 14th, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.33 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. // Implementacija atp List
  5. //
  6. // Potrebno je prvo pozvati initialize().
  7. //
  8. // Error kodovi:
  9. // 101 - Nema više mjesta.
  10. // 102 - Pokušaj pristupa poziciji koja ne postoji.
  11.  
  12. #define MAXLEN 10000
  13.  
  14. typedef int elementtype;
  15. typedef int List;
  16. typedef int position;
  17.  
  18. struct cellstruct {
  19.     elementtype element;
  20.     int next;
  21. } space[MAXLEN];
  22. int first_available;
  23.  
  24. void initialize() {
  25.     int i;
  26.     first_available = 0;
  27.     for (i = 0; i < MAXLEN - 1; i++) {
  28.         space[i].next = i + 1;
  29.     }
  30.     space[MAXLEN - 1].next = -1;
  31. }
  32.  
  33. position LiEnd(List L) {
  34.     int p = L;
  35.     while (space[p].next != -1)
  36.         p = space[p].next;
  37.     return p;
  38. }
  39.  
  40. position LiMakeNull(List* Lp) {
  41.     int p = first_available;
  42.     if (first_available == -1) exit(101);
  43.     first_available = space[first_available].next;
  44.     *Lp = p;
  45.     space[p].next = -1;
  46.     return p;
  47. }
  48.  
  49. void LiInsert(elementtype x, position p, List* Lp) {
  50.     int q = space[p].next;
  51.     if (first_available == -1) exit(101);
  52.     space[p].next = first_available;
  53.     first_available = space[first_available].next;
  54.     space[space[p].next].element = x;
  55.     space[space[p].next].next = q;
  56. }
  57.  
  58. void LiDelete(position p, List* Lp) {
  59.     int q = space[p].next;
  60.     space[p].next = space[q].next;
  61.     space[q].next = first_available;
  62.     first_available = q;
  63. }
  64.  
  65. position LiFirst(List L) {
  66.     return L;
  67. }
  68.  
  69. position LiNext(position p, List L) {
  70.     if (space[p].next == -1) exit(102);
  71.     return space[p].next;
  72. }
  73.  
  74. position LiPrevious(position p, List L) {
  75.     int q = L;
  76.     if (q == p) exit(102);
  77.     while (space[p].next != q) {
  78.         if (space[p].next == -1) exit(102);
  79.         p = space[p].next;
  80.     }
  81.     return p;
  82. }
  83.  
  84. elementtype LiRetrieve(position p, List L) {
  85.     if (space[p].next == -1) exit(102);
  86.     return space[space[p].next].element;
  87. }
  88.  
  89. // Kraj implementacije List.
  90.  
  91.  
  92. #define MAXN 10
  93.  
  94. void input(int* n, List lists[], int lens[]) {
  95.     int i;
  96.     elementtype x;
  97.     position p;
  98.    
  99.     scanf("%d", n);
  100.     for (i = 0; i < *n; i++) {
  101.         p = LiMakeNull(&lists[i]);
  102.         lens[i] = 0;
  103.         while (1) {
  104.             scanf("%d", &x);
  105.             if (x == -1) break;
  106.             LiInsert(x, p, &lists[i]);
  107.             p = LiEnd(lists[i]);
  108.             lens[i]++;
  109.         }
  110.     }
  111. }
  112.  
  113. void output_lists(int n, List lists[], int lens[]) {
  114.     int i;
  115.     position p;
  116.  
  117.     for (i = 0; i < n; i++) {
  118.         if (lens[i] == 0) continue;
  119.         printf("L%d: ", i + 1);
  120.         for (p = LiFirst(lists[i]); p != LiEnd(lists[i]); p = LiNext(p, lists[i]))
  121.             printf("%d ", LiRetrieve(p, lists[i]));
  122.         printf("\n");
  123.     }
  124. }
  125.  
  126. List merge_lists(List a, List b) {
  127.     List c;
  128.     position p, q, r = LiMakeNull(&c);
  129.  
  130.     while (1) {
  131.         p = LiFirst(a);
  132.         q = LiFirst(b);
  133.         if (p == LiEnd(a) && q == LiEnd(b)) break;
  134.  
  135.         if (p == LiEnd(a)) {
  136.             LiInsert(LiRetrieve(q, b), r, &c);
  137.             LiDelete(q, &b);
  138.         } else if (q == LiEnd(b)) {
  139.             LiInsert(LiRetrieve(p, a), r, &c);
  140.             LiDelete(p, &a);
  141.         } else if (LiRetrieve(p, a) > LiRetrieve(q, b)) {
  142.             LiInsert(LiRetrieve(q, b), r, &c);
  143.             LiDelete(q, &b);
  144.         } else {
  145.             LiInsert(LiRetrieve(p, a), r, &c);
  146.             LiDelete(p, &a);
  147.         }
  148.         r = LiEnd(c);
  149.     }
  150.  
  151.     return c;
  152. }
  153.  
  154. void huffmann(int n, List lists[], int lens[]) {
  155.     int i, j, a, b, tmp;
  156.  
  157.     for (i = 0; i < n - 1; i++) {
  158.         a = b = -1;
  159.         for (j = 0; j < n; j++) {
  160.             if (lens[j] == 0) continue;
  161.             if (a == -1 || lens[j] < lens[a]) {
  162.                 b = a;
  163.                 a = j;
  164.             } else if (b == -1 || lens[j] < lens[b]) {
  165.                 b = j;
  166.             }
  167.         }
  168.         if (b == -1) break;
  169.         if (a > b) {
  170.             tmp = a;
  171.             a = b;
  172.             b = tmp;
  173.         }
  174.         lists[a] = merge_lists(lists[a], lists[b]);
  175.         lens[a] += lens[b];
  176.         lens[b] = 0;
  177.  
  178.         printf("Spajam L%d i L%d.\n", a + 1, b + 1);
  179.         output_lists(n, lists, lens);
  180.     }
  181. }
  182.  
  183. int main() {
  184.     int n, lens[MAXN];
  185.     List lists[MAXN];
  186.  
  187.     initialize();
  188.     input(&n, lists, lens);
  189.     output_lists(n, lists, lens);
  190.     huffmann(n, lists, lens);
  191.  
  192.     return 0;
  193. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement