AleksandarArkan

M-unisci due stringhe senza che ci siano caratteri duplicati

Mar 27th, 2015
207
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.54 KB | None | 0 0
  1. /*void unisci(char* insieme1, char* insieme2, char* unione);
  2.  * assumendo che le stringhe insieme1 ed insieme2 non contengano caratteri
  3.  * duplicati, calcolare in unione la stringa corrispondente all'unione dei
  4.  * caratteri presenti in insieme1 ed insieme2.
  5.  * Attenzione: l'insieme unione non deve contenere duplicati. */
  6.  
  7.  //funzione ausiliaria che mi serve
  8. void remove_duplicates(char *str){
  9.     int tail=1;//coda
  10.     int i,j;
  11.    
  12.     if(str==NULL)
  13.         return; //se e' un puntatore nullo allora termina
  14.        
  15.     char *tmp=str;//tmp punta alla prima cella della stringa
  16.    
  17.     while(*tmp){
  18.         tmp++; //finche tmp non trova il carattere di terminazione
  19.         //fallo scorrere in avanti
  20.     }
  21.    
  22.     //ora mi calcolo la lunghezza della stringa, facendo la differenza
  23.     //tra il puntatore che punta all'ultimo carattere e il nome della stringa
  24.     //che di suo rappresenta il primo elemento della stringa, cioe rappresenta il puntatore
  25.     //al primo carattere (stiamo parlando del nome della stringa)
  26.    
  27.     int len=tmp-str;//ottenuto la lunghezza
  28.    
  29.     if(len<2)//se la lunghezza e' minore di due allora, la nostra stringa
  30.     //ha solo un carattere e e' impossibile che ci siano elementi ripetuti,
  31.     //quindi termina
  32.         return;
  33.        
  34.    
  35.     //altrimenti
  36.     for(i=1;i<len;i++){
  37.             for(j=0;j<tail;j++){
  38.                 if(str[i]==str[j]){//ho trovato l'elemento uguale
  39.                     //nell'intervallo che va da j a tail
  40.                     break;//allora non fare niente
  41.                 }
  42.             }
  43.             //dopo il break arrivero' qui
  44.             //se j==tail vuol dire che non ho trovato elementi uguali all'elemento
  45.             //puntato dall'indice i all'interno del mio intervallo
  46.             if(j==tail){//se e' cosi
  47.                 str[tail]=str[i];//allora copialo nella mia stringa
  48.                 tail++;//aumento l'intervallo , e preparo la posizione
  49.                 //per il prossimo numero da scrivere
  50.             }
  51.     }
  52.     str[tail]='\0';
  53. }
  54.  
  55.  
  56. //funzione unisci
  57.  
  58. void unisci(char* insieme1, char* insieme2, char* unione){
  59.     remove_duplicates(insieme1);
  60.     remove_duplicates(insieme2);
  61.     //ora mi sono assicurato che nelle stringhe prese singolarmente
  62.     //non ci sono lettere ripetute all'interno della stessa stringa
  63.    
  64.     int posizione =0;
  65.     //ora ricopio la prima stringa dentro unione
  66.    
  67.     while(*insieme1){
  68.             unione[posizione]=*insieme1;
  69.             posizione++;
  70.             insieme1++;
  71.     }
  72.    
  73.     //ricopio la seconda stringa dentro unione
  74.    
  75.     while(*insieme2){
  76.             unione[posizione]=*insieme2;
  77.             posizione++;
  78.             insieme2++;
  79.     }
  80.    
  81.     //le ho ricopiate tutte e due
  82.     //ora metto il carattere di terminazione e tolgo le lettere doppie
  83.     //dalla stringa unione
  84.    
  85.     unione[posizione]='\0';
  86.    
  87.     remove_duplicates(unione);
  88.        
  89. }
Advertisement
Add Comment
Please, Sign In to add comment