Code:

#include<conio.h>
#include<stdio.h>
#include<alloc.h>
#include<math.h>
typedef unsigned int Position;
typedef int ElementType;
typedef struct PhanSo{
   int TuSo, MauSo;
};
typedef struct Node{
   PhanSo P;
   Node*Next;
};
typedef Node*List;
//KHOI TAO 1 NODE
Node*Make_Node(PhanSo A){
   Node*Temp=(Node*)malloc(sizeof(Node));
   Temp->P.TuSo=A.TuSo;
   Temp->P.MauSo=A.MauSo;
   return Temp;
}
//Khoi tao dah sach rong
List MakeNull_List(){
   List Temp=(List)malloc(sizeof(List));
   Temp->Next=NULL;
   return Temp;
}
//Them 1 Node vao danh sach
void Insert (List L,Node*P){
   P->Next=L->Next;
   L->Next=P;
}
//Them 1 Node vao danh sach tai vi tri i
void Insert(List L, Node*P,Position i){
   List Temp=L;
   Position j=1;
   while (j<i&&Temp!=NULL){
      Temp=Temp->Next;
      j++;
   }
   if (i==j)
      Insert(Temp,P);
   else
      printf("Position Not true!");

}
//Kiem tra danh sach rong
char Empty_List(List L){
   return L->Next==NULL;
}
//Xoa 1 Node
void Delete_List(List L){
   Node*P=L->Next;
   L->Next=P->Next;
   free(P);

}
//Xoa 1 Node trong danh sach tai vi tri i
void Delete_List(List L,Position i){
   List Temp=L;
   Position j=1;
   while(j<i && Temp!=NULL){
      Temp=Temp->Next;
      j++;
   }
   if (i==j)
      Delete_List(Temp);
   else
      printf("This position Not True!");
}

//Tim uoc chung lon nhat cua 2 so
int ucln(int a, int b){
   if(a==0) return b;
   if(b==0) return a;
   if(a>b) return ucln(a%b, b);
   else
   return ucln(b%a,a);
}

//Rut gon phan so
Node Rutgonphanso (Node N){
   int k=ucln(abs(N.P.TuSo),abs(N.P.MauSo));
   N.P.TuSo=N.P.TuSo/k;
   N.P.MauSo=N.P.MauSo/k;
   return N;
}

//Tong n phan so trong danh sach
Node Tong(List L, unsigned int n){
   Node c={0,1};
   unsigned int i=0;
   List Temp=L;
   while (i<n && Temp!=NULL ){

   c.P.TuSo=(c.P.TuSo*Temp->Next->P.MauSo)+(Temp->Next->P.TuSo*c.P.MauSo);
   c.P.MauSo=c.P.MauSo*Temp->Next->P.MauSo;
   Temp=Temp->Next;
   i++;
   }
   return Rutgonphanso(c);
}


//Tich n phan so co trongg danh sach
Node Tich_List(List L,unsigned int n){
   Node Temp={1,1};
   List Temp1=L;
   unsigned int i=0;
   while (i<n && Temp1!=NULL){
      //Temp*=Temp1->Next;
      (Temp.P.TuSo)=(Temp.P.TuSo)*(Temp1->Next->P.TuSo);
      (Temp.P.MauSo)=(Temp.P.MauSo)*(Temp1->Next->P.MauSo);
         //Temp=Tich(Temp,Temp1->P);
      Temp1=Temp1->Next;
      i++;

   }
   if(Empty_List(L)) {

      Temp.P.TuSo=0;
      Temp.P.MauSo=1;
      return Temp;
      }

   else
      return Rutgonphanso(Temp);
}

void Bubble_Sort(List &L){
   List j,i=L->Next;
   while (i->Next!=NULL){
      j=i->Next;
      while (j!=NULL){
            int n=(i->P.TuSo)*(j->P.MauSo);
         int m=(j->P.TuSo)*(i->P.MauSo);
         if (n>m){
            PhanSo Temp=i->P;
            i->P=j->P;
            j->P =Temp;
         }
         j=j->Next;
      }
      i=i->Next;
   }
}

List Input_List(unsigned int n){
   List Temp=MakeNull_List();
   Node N;
   unsigned int i=0;
   while (i<n){
   printf("Phan so thu %d",i);
   printf("\n\tTu so: ");
   scanf("%d",&N.P.TuSo);
   printf("\tMau So: ");
   scanf("%d",&N.P.MauSo);
   Insert(Temp,Make_Node(N.P));
   i++;
   }
   return Temp;
}
void Out_List(List L,unsigned int n){
   List Temp=L->Next;
   unsigned int i=0;
   while (i<n && !Empty_List(Temp)){
      printf("%d/%d\t",Temp->P.TuSo,Temp->P.MauSo  );
      Temp=Temp->Next;
      i++;
      }
}

//Chuong trinh chinh
void main(){
   clrscr();
   unsigned int n;
   Position V;
   Node* P;
   printf("Nhap n= ");
   scanf("%d",&n);

   List l=Input_List(n);
   Out_List(l,n);


   printf("\n\nTong cac phan tu trong danh sach: ");
   printf("%d/%d",Tong(l,n).P.TuSo,Tong(l,n).P.MauSo);

   printf("\n\nTich cac phan tu trong danh sach = ");
   printf("%d/%d",Tich_List(l,n).P.TuSo,Tich_List(l,n).P.MauSo);


   printf("\nNhap phan so can chen: ");
   printf("\n\tTu So: ");
   scanf("%d",&(P->P.TuSo));
   printf("\tMau So: ");
   scanf("%d",&(P->P.MauSo));
   printf("\nNhap vi tri can chen:");
   scanf("%d",&V);
   Insert(l,P,V);
   Out_List(l,n+1);




   printf("\n\nXoa danh sach tai vi tri thu 2 :");
   Delete_List(l,2);
   Out_List(l,n);
      /*   printf("\n\nDanh sach sau khi bi xoa: ");
   Delete_List(l);
   Out_List(l,n);

   printf("\n\nBubbleSort: ");
   Bubble_Sort(l);
   Out_List(l,n);*/


   getch();
}