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();
}