Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*void unisci(char* insieme1, char* insieme2, char* unione);
- * assumendo che le stringhe insieme1 ed insieme2 non contengano caratteri
- * duplicati, calcolare in unione la stringa corrispondente all'unione dei
- * caratteri presenti in insieme1 ed insieme2.
- * Attenzione: l'insieme unione non deve contenere duplicati. */
- //funzione ausiliaria che mi serve
- void remove_duplicates(char *str){
- int tail=1;//coda
- int i,j;
- if(str==NULL)
- return; //se e' un puntatore nullo allora termina
- char *tmp=str;//tmp punta alla prima cella della stringa
- while(*tmp){
- tmp++; //finche tmp non trova il carattere di terminazione
- //fallo scorrere in avanti
- }
- //ora mi calcolo la lunghezza della stringa, facendo la differenza
- //tra il puntatore che punta all'ultimo carattere e il nome della stringa
- //che di suo rappresenta il primo elemento della stringa, cioe rappresenta il puntatore
- //al primo carattere (stiamo parlando del nome della stringa)
- int len=tmp-str;//ottenuto la lunghezza
- if(len<2)//se la lunghezza e' minore di due allora, la nostra stringa
- //ha solo un carattere e e' impossibile che ci siano elementi ripetuti,
- //quindi termina
- return;
- //altrimenti
- for(i=1;i<len;i++){
- for(j=0;j<tail;j++){
- if(str[i]==str[j]){//ho trovato l'elemento uguale
- //nell'intervallo che va da j a tail
- break;//allora non fare niente
- }
- }
- //dopo il break arrivero' qui
- //se j==tail vuol dire che non ho trovato elementi uguali all'elemento
- //puntato dall'indice i all'interno del mio intervallo
- if(j==tail){//se e' cosi
- str[tail]=str[i];//allora copialo nella mia stringa
- tail++;//aumento l'intervallo , e preparo la posizione
- //per il prossimo numero da scrivere
- }
- }
- str[tail]='\0';
- }
- //funzione unisci
- void unisci(char* insieme1, char* insieme2, char* unione){
- remove_duplicates(insieme1);
- remove_duplicates(insieme2);
- //ora mi sono assicurato che nelle stringhe prese singolarmente
- //non ci sono lettere ripetute all'interno della stessa stringa
- int posizione =0;
- //ora ricopio la prima stringa dentro unione
- while(*insieme1){
- unione[posizione]=*insieme1;
- posizione++;
- insieme1++;
- }
- //ricopio la seconda stringa dentro unione
- while(*insieme2){
- unione[posizione]=*insieme2;
- posizione++;
- insieme2++;
- }
- //le ho ricopiate tutte e due
- //ora metto il carattere di terminazione e tolgo le lettere doppie
- //dalla stringa unione
- unione[posizione]='\0';
- remove_duplicates(unione);
- }
Advertisement
Add Comment
Please, Sign In to add comment