Mralko99

sorted_sequence

Apr 16th, 2018
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.21 KB | None | 0 0
  1. #include "sorted_sequence.h"
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4.  
  5.  
  6.  
  7. // crea una struttura SortedSequence e la inizializza
  8. SortedSequence* SortedSequence_init(){
  9.   SortedSequence* s=(SortedSequence*)malloc(sizeof(SortedSequence));
  10.   s->head=NULL;
  11.   return s;
  12. }
  13.  
  14. // distrugge una struttura sortedSequence e libera la memoria
  15. void SortedSequence_destroy(SortedSequence* s){
  16.   SortedSequenceNode* elem,*succ=s->head;
  17.   free(s);
  18.   while (succ!=NULL){
  19.     elem=succ;
  20.     succ=succ->next;
  21.     free(elem);
  22.   }
  23. }
  24.  
  25. // stampa una sorted sequence
  26. void SortedSequence_print(SortedSequence* s){
  27.   SortedSequenceNode*succ=s->head;
  28.   while (succ!=NULL){
  29.     printf("%d >> ",succ->value);
  30.     succ=succ->next;
  31.   }
  32.   printf("NULL");
  33. }
  34.  
  35. SortedSequenceNode* CreaNodo(int e,SortedSequenceNode* next){
  36.     SortedSequenceNode*a=(SortedSequenceNode*)malloc(sizeof(SortedSequenceNode));
  37.     a->value=e;
  38.     a->next=next;
  39.     return a;
  40. }
  41.  
  42. // inserice un elemento in una sorted sequence
  43. void SortedSequence_insert(SortedSequence* s, SortedSequenceElement e){
  44.   //PRIMO ELEMENTO
  45.   if (s->head==NULL){
  46.     SortedSequenceNode*a=CreaNodo(e,NULL);
  47.     s->head=a;
  48.   }
  49.   //SECONDO ELEMENTO IN POI
  50.   else{
  51.     //CONTROLLA SE È PIU PICCOLO DEL PRIMO
  52.     if(e<s->head->value){
  53.       SortedSequenceNode* a=CreaNodo(e,s->head);
  54.       s->head=a;
  55.     }
  56.     else{  
  57.         SortedSequenceNode*ptr=s->head;
  58.         //VA AVANTI FINO A CHE NON TROVA UN ELEMENTO PIÙ GRANDE O NULLO
  59.         while(ptr->next!=NULL&&e>ptr->next->value){
  60.           ptr=ptr->next;
  61.         }
  62.         //SE IL PROSSIMO ELEMENTO ESISTE
  63.         if (ptr->next!=NULL){
  64.           SortedSequenceNode*a=CreaNodo(e,ptr->next);
  65.           ptr->next=a;
  66.         }
  67.         //SE IL PROSSIMO ELEMENTO È NULL
  68.         else{
  69.           SortedSequenceNode*a=CreaNodo(e,NULL);
  70.           ptr->next=a;
  71.         }
  72.     }
  73.  
  74.    
  75.   }
  76. }
  77.  
  78. // inserice un elemento in una sorted sequence solo se non gia' presente nella sequenza
  79. void SortedSequence_insert_unique(SortedSequence* s, SortedSequenceElement e){
  80. //PRIMO ELEMENTO
  81.   if (s->head==NULL){
  82.     SortedSequenceNode*a=CreaNodo(e,NULL);
  83.     s->head=a;
  84.   }
  85.   //SECONDO ELEMENTO IN POI
  86.   else{
  87.     //CONTROLLA SE È PIU PICCOLO DEL PRIMO
  88.     if(e<s->head->value){
  89.       SortedSequenceNode* a=CreaNodo(e,s->head);
  90.       s->head=a;
  91.     }
  92.     else{  
  93.         SortedSequenceNode*ptr=s->head;
  94.         //VA AVANTI FINO A CHE NON TROVA UN ELEMENTO PIÙ GRANDE O NULLO
  95.         while(ptr->next!=NULL&&e>ptr->next->value){
  96.           ptr=ptr->next;
  97.         }
  98.         //SE IL PROSSIMO ELEMENTO ESISTE
  99.         if (ptr->next!=NULL){
  100.           if (ptr->next->value!=e){
  101.           SortedSequenceNode*a=CreaNodo(e,ptr->next);
  102.           ptr->next=a;}
  103.         }
  104.         //SE IL PROSSIMO ELEMENTO È NULL
  105.         else{
  106.           SortedSequenceNode*a=CreaNodo(e,NULL);
  107.           ptr->next=a;
  108.         }
  109.     }
  110.  
  111.    
  112.   }
  113. }
  114.  
  115. // rimuove l'elemento in posizione pos
  116. void SortedSequence_removeAt(SortedSequence* s, int pos){
  117.   SortedSequenceNode*ptr;
  118.   if (pos==0){
  119.     ptr=s->head->next;
  120.     free(s->head);
  121.     s->head=ptr;
  122.   }
  123.   else {
  124.     ptr=s->head;
  125.     pos--;
  126.     while(pos!=0){
  127.         pos--;
  128.         ptr=ptr->next;
  129.     }
  130.     SortedSequenceNode*ptr2;
  131.     ptr2=ptr->next->next;
  132.     free(ptr->next);
  133.     ptr->next=ptr2;
  134.   }
  135. }
  136.  
  137. // trova la posizione dell'elemento e in s, -1 se non esiste
  138. int SortedSequence_find(SortedSequence* s, SortedSequenceElement e){
  139.  
  140.   if(s->head->value==e)return 0;  
  141.  
  142.   else {
  143.     int index=0;
  144.     SortedSequenceNode*ptr=s->head;
  145.     while(ptr->value!=e&&ptr->next!=NULL){
  146.         index++;
  147.         ptr=ptr->next;
  148.     }
  149.     if (ptr->value!=e)
  150.         return -1;
  151.     return index;
  152.   }
  153. }
Advertisement
Add Comment
Please, Sign In to add comment