Advertisement
Guest User

Untitled

a guest
Nov 28th, 2014
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.08 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #ifndef DEBUG
  5. #define DEBUG(...) printf(__VA_ARGS__)
  6. #endif
  7.  
  8. typedef struct Node {
  9.     int val;
  10.     struct Node *next;
  11. } node;
  12.  
  13. int enqueue(node **head, node **tail, int val) {
  14.     node *new;
  15.     new = (node *) malloc (sizeof(node));
  16.     if(!new) return -1;
  17.  
  18.     new->val = val;
  19.     new->next = NULL;
  20.  
  21.     if(!*head) {
  22.         *head = new;
  23.         *tail = new;
  24.     } else {
  25.         (*tail)->next = new;
  26.         *tail = (*tail)->next;
  27.     }
  28.     return 0;
  29. }
  30.  
  31. int dequeue(node **head, node **tail) {
  32.     node *t;
  33.  
  34.     if(!*head) return -1;
  35.     else if(*head==*tail) *tail = NULL;
  36.  
  37.     DEBUG("Dequeue: %d\n",(*head)->val);
  38.  
  39.     t = (*head)->next;
  40.     free(*head);
  41.     *head = t;
  42.     return 0;
  43. }
  44.  
  45. int print(node *head) {
  46.     node *trenutni;
  47.  
  48.     if(!head) return -1;
  49.  
  50.     for(trenutni=head; trenutni!=NULL; trenutni=trenutni->next)
  51.         printf("%d ", trenutni->val);
  52.     return 0;
  53. }
  54.  
  55.  
  56. void proguraj_lista(node **head, node **tail, int broj) {
  57.    
  58.     if (*head==NULL) return;
  59.     else if (*head==*tail) return;
  60.     else if(broj==1) return;
  61.     node *temp, *temp1, *temp2;
  62.     if(broj==2){
  63.         temp=(*head)->next;
  64.         (*head)->next=(*head)->next->next;
  65.         temp->next=*head;
  66.         *head = temp;
  67.     }
  68.     else{
  69.     for(temp = *head; broj>3 && temp != NULL; temp = temp->next) broj--;
  70.     if(temp == NULL) return;
  71.     if(temp->next == NULL) return;
  72.     if(temp->next->next == NULL) return;
  73.     temp1 = temp->next;
  74.     temp2 = temp->next->next;
  75.     temp1->next = temp2->next;
  76.     temp2->next = temp1;
  77.     temp->next = temp2;
  78.     if(temp->next->next->next == NULL) *tail = temp->next->next;
  79.    
  80.     /*
  81.     for(temp=*head, i=3; i<broj; temp=temp->next, i++);
  82.         temp1=temp->next;
  83.         temp2=temp->next->next;
  84.        
  85.         temp->next=temp2;
  86.         temp1->next=temp2->next;
  87.         temp2->next=temp1;     
  88.     }*/
  89.     }
  90. }
  91.  
  92. int main() {
  93.     node *head = NULL;
  94.     node *tail = NULL;
  95.     int menu_choice, val, ret_val, broj;
  96.     char c;
  97.  
  98.     setbuf(stdout, NULL);
  99.     do {
  100.         menu_choice = 0;
  101.         DEBUG("\n1 guranje elementa za jedno mjesto unaprijed (proguraj_lista)");
  102.         DEBUG("\n2 dodaj(enqueue)\n3 brisi (dequeue)\n4 ispis (print)\n5 izlaz\n");
  103.         scanf("%d", &menu_choice);
  104.         switch (menu_choice) {
  105.             case 1:
  106.                 scanf("%d",&broj);
  107.                 proguraj_lista(&head, &tail, broj);
  108.                 break;
  109.             case 2:
  110.                 scanf("%d", &val);
  111.                 ret_val = enqueue(&head, &tail, val);
  112.                 if(ret_val==-1) DEBUG("Alokacija nije uspjela.");
  113.                 break;
  114.             case 3:
  115.                 ret_val = dequeue(&head, &tail);
  116.                 if(ret_val==-1) DEBUG("Red je prazan.");
  117.                 break;
  118.             case 4:
  119.                 ret_val = print(head);
  120.                 if(ret_val==-1) DEBUG("Red je prazan.");
  121.                 break;
  122.             case 5:
  123.                 break;
  124.             default:
  125.                 while((c = getchar()) != '\n' && c != EOF);
  126.         }
  127.     } while(menu_choice!=5);
  128.     return 0;
  129. }
  130.  
  131.  
  132. ///... temp   temp1         ...
  133. ///         temp->next    temp1->next
  134. /// 1 2 3 4 5
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement