Mam problem ze swoim programem, a konkretnie z pewnym segmentem odpowiedzialnym za usuwanie powtórek z listy jednokierunkowej. Wklejam poniżej kod, żeby było widać o co chodzi.

#include <stdio.h>
#include <stdlib.h>

typedef struct lista{
       int x;
       struct lista * next;
       } element;

element * dodajliczbe(element * head, int a, int b, int n);
element * usun ( element * head);
void wypisz ( element * head );
int main(int argc, char *argv[])
{
    element * head=NULL;
    dodajliczbe (head, 0, 10, 10);;
    usun(head);
    wypisz (head);
  system("PAUSE");   
  return 0;
}

element * dodajliczbe (element * head, int a, int b, int n){
          int x;
          element * wsk=NULL;
          wsk=(element*)malloc(sizeof(element));
          int i;
          for(i=0; i<n; i++){
          if(head==NULL){
          x=rand()%(b-a+1)+ a;
                         wsk->x=x;
                         printf("%d\n", wsk->x);
                         }
                         else{
                              
                               
                                x=rand()%(b-a+1)+ a;
                                wsk->x=x;
                                wsk->next=head; 
                                printf("%d\n", wsk->x);
                                head=wsk;
                                
                              }
                                
                              
                              } printf("\n druga funkcja\n");
                              
                              return head;
                            
                              }
                              
element * usun ( element * head){

       
       if (head != NULL){ 
        element * tmp1=head;
        element * tmp2=head->next;
        element * tmp3=tmp2;
       
       
       
        for( ;tmp1!=NULL; tmp1=tmp1->next){
          for( ;tmp2!=NULL; tmp2=tmp2->next){  
                           tmp3=tmp2;                       
                            if(tmp1->x == tmp2->x){
                             tmp3=tmp3->next;
                             if(tmp1->next=tmp2)
                             tmp1->next=tmp3;
                             free(tmp2);
                             tmp2=tmp3;   
                                                   
                             }}}}
                            
                            return head;
                            }
                            
        
void wypisz ( element * head ){
     element * tmp=head;
                            while(tmp!=NULL){                
                            printf("%d\t", tmp->x);
                            tmp=tmp->next;
                            }
                            }

nie wiem czy funkcja tworząca listę działa dobrze, bo gdy próbuje tylko wypisać listę drugi raz ( bez funkcji usuń, tylko funkcją wypisz) to wypisuje mi same zera i wpada w jakąś nieskończoną pętle 0_0...proszę o jakąś radę, bo męczę się z tym i nie wiem co jest nie tak. Jeszcze mam takie pytanie, skoro już założyłem ten wątek. Musze zmodyfikować ten program tak aby te liczby, które są generowane były zapisywane do pliku. I mam taki dylemat czy użyć trybu tekstowego czy binarnego? Kiedy lepiej jest stosować jeden, a kiedy drugi? Z góry dziękuje za jakąkolwiek pomoc.