Saturday, May 21, 2016

Chương trình chuyển đổi 1 số nguyên dương sang dạng nhị phân sử dụng ngăn xếp cài đặt bằng danh sách liên kết kép bằng ngôn ngữ C

//Ho va ten: Tran Van Linh
//Msv:581597
//Lop:K58QLTT

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

//Khai bao cau truc
struct node
{
          int infor;
          struct node *left;
          struct node *right;
} *T=NULL;

//khai bao ham
void push(int x);
int pop();
int empty();

//==chuong trinh chinh==
int main()
{
          int n,thuong;
         
          printf("Nhap so nguyen can chuyen sang dang nhi phan:");
          do
          {
                   scanf("%d",&n);
                   if(n<0)
                             printf("\nSo nguyen nhap phai duong,nhap lai: ");
          }while(n<0);
         
          thuong=n;
         
          while(thuong)
          {
                   push(thuong%2);
                   thuong/=2;
          }
         
          printf("\nDang nhi phan cua %d la:",n);
          while(!empty())
                   printf("%d",pop());
          return 0;
}
//==Dinh nghia ham==
void push(int x)
{
          struct node *N;
          N=(struct node*)malloc(sizeof(struct node));
          N->infor=x;
          N->left=NULL;
          N->right=NULL;
         
          //bo sung vao dinh ngan xep
          if(T==NULL)
                   T=N;
          else
          {
                   N->right=T;
                   T->left=N;
                   T=N;
          }
}
//-------------
int pop()
{
          int tg;
          struct node *P;
         
          if(T==NULL)
          {
                   printf("Danh sach rong.!");
                   return 0;
          }
          tg=T->infor;
          P=T;
          if(T->right==NULL) //Trường hợp ds chỉ có 1 nút
          {
                   T=NULL;
          }
          else
          {
                   T=T->right;
                   T->left=NULL;
          }
          free(P);
          return tg;
}
//-------------
int empty()
{
          if(T==NULL)
                   return 1;
          return 0;
}

//-------------

Giải thuật chuyển 1 số nguyên dương sang dạng nhị phân sử dụng ngăn xếp cài đặt bằng danh sách liên kết kép

//Họ Tên: Trần Văn Linh
// Msv:581597
//Lớp:K58QLTT

A.   Giải thuật chương trình chính
Program ChuyenDoiNhiPhan;
1, read(n);
2, while n <> 0 do
    Begin
              Tg:=n mod 2;
              Call Push(Tg);
              n:= n /2;
    end
3, while Empty(T) <>TRUE do write(Pop());
End.

B.   Thủ tục bổ sung vào ngăn xếp cài đặt bằng danh sách liên kết kép
Vào : Ngăn xếp (T,X);
Ra:  Không có;
{Thủ tục này bổ sung phân tử dữ liệu X vào ngăn xếp (T) có T là nút đỉnh ngăn xếp cài đặt bằng danh sách liên kết kép ;}

Procedure       Push(var:T,x)
1,{Tao nút mới }
    new<=AVAIL;
    infor(new):=x;
    left(new):= Ø;
    right(new):= Ø;
2,{ Bổ dung vào ngăn xếp}
If T =Ø then    { trường hợp danh sách rỗng}
    T:= new;
Else
    Begin
              right(new):=T;
              left(T):=new;
              T:=new;
    End
Return

C.   Hàm loại bỏ một phần tử ở đỉnh ngăn xếp
Vào :Ngăn xếp (T);
Ra: Trả phần tử dữ liệu của nút bị loại bỏ.
{Hàm này loại bỏ phần tử của đỉnh ngăn xêp(T) có T là đỉnh ngăn xếp và trả về phần tử loại bỏ;}

Function Pop(var: T)
1,{Kiem tra danh sach rong};
    If T=Ø then begin
                                          Write(‘Danh sach rong.!’);
                                          Return ;
                                 End;
2,{Loại bỏ phần tử đỉnh ngăn xếp}
    Tg:=INFOR(T);
    P:=T;
    If right(T)= Ø  then {Trường hợp danh sách chỉ còn 1 node }
T:= Ø
    Else
              Begin
                       T:=right(T);
                       left(T):= Ø;
              End;
              P=>AVAIL;
3, Pop:=Tg;
Return;

D.   Hàm kiểm tra ngăn xếp rỗng
Vào: ngăn xếp (T);
Ra :TRUE nếu ngăn xếp rỗng , FALSE nếu ngăn xếp chưa rỗng.
{hàm này kiểm tra ngăn xếp rỗng, ngăn xếp được cài đặt bằng danh sách liên kép}

Function  Empty(T)
If T= Ø  then 
Empty:=TRUE;
else
         Empty:=FALSE; 

Friday, May 20, 2016

Chương trình thêm tìm kiếm một mặt hàng sử dụng danh sách liên kết đơn bằng C

//Họ Tên: Trần Văn Linh
// Msv:581597
//Lớp:K58QLTT



#include<stdio.h>


#include<stdlib.h>
#include<string.h>



//==Khai bao cau truc


typedef struct mathang mathang;
struct mathang
{
char maMH[10];//mã mặt hàng
char tenMH[256];//tên mặt hàng
float gia;//Giá của mặt hàng
int soLuong;//Số lượng của mặt hàng
};
typedef struct node node;
struct node
{
mathang infor;
node *link;
}*F=NULL;

//Khai bao ham
void inSert(mathang infor);// Hàm bổ sung một mặt hàng vào ds
void  Search(char maMH[]);//Hàm tìm kiếm một mặt hàng 
void Delete();//Hàm xóa mặt hàng ở cuối ds
void in();//Hàm hiện tất cả các mặt hàng có trong ds

//===Chuong trinh chinh===
int  main()
{
mathang matHang;
char maMH[10];
char tl;



do
{
fflush(stdin);
printf("Nhap ma mat hang: ");
gets(matHang.maMH);
printf("Nhap ten mat hang: ");
gets(matHang.tenMH);
printf("Nhap so luong: ");
scanf("%d",&matHang.soLuong);
printf("Nhap gia: ");
scanf("%f",&matHang.gia);
fflush(stdin);

inSert(matHang);

printf("Co nhap nua khong (c/k):");
scanf("%c",&tl);
}while(tl=='c'||tl=='C');
printf("\n\nDanh sach da nhap la: \n");
in();
Delete();
printf("\n\nDanh sach sau khi xoa: \n");
in();
printf("\n\nNhap ma mat hang ban can tim kiem: ");
scanf("%s",&maMH);
Search(maMH);
return 0;
}
//----Dinh nghia ham----
void inSert(mathang infor)
{
node *N;
N=(node*)malloc(sizeof(node));
N->infor=infor;
N->link=NULL;
//bo sung
N->link=F;
F=N;
}
//-----------------------------------------------
void  Search(char  maMH[])
{
node *P,*Q;
P=F;
mathang tim;
strcpy(tim.maMH,"");
strcpy(tim.tenMH,"");

     //Tìm node có mã mặt hàng là maMH
while(P)
{
if((strcmp(P->infor.maMH,maMH))==0)
{
tim=P->infor;
break;
}
P=P->link;
}

if((strcmp(tim.tenMH,""))==0)
{
printf("Mat hang khong tim thay");
return;
}

printf("Ma mat hang: %s\n",tim.maMH);
printf("Ten ten mat hang: %s\n",tim.tenMH);
printf("Ma so luong: %d\n",tim.soLuong);
printf("Ten gia: %f\n\n",tim.gia);
}
//-----------------------------------------------------------
void Delete()
{
node *P;
node *Q;
P=F;
       //Tìm nút cuối danh sách
while(P)
{
if(P->link==NULL)
break;
Q=P;
P=P->link;
}

if(P)
{
if(P==F)//Trường hợp danh sách chỉ có 1 nút
F=F->link;
else
{
Q->link=P->link;
}
free(P);
}
}
//-------------------------------------------------------------------
void in()
{
node *P;
P=F;
while(P)
{
printf("Ma mat hang: %s\n",P->infor.maMH);
printf("Ten mat hang: %s\n",P->infor.tenMH);
printf("So luong: %d\n",P->infor.soLuong);
printf("Gia: %f\n\n",P->infor.gia);
P=P->link;
}
}



Kết quả khi test chương trình :





Sunday, May 15, 2016

Cài đặt hàng đợi bằng mảng vơi ngôn ngữ C

//Họ và tên:Trần văn Linh
//Msv:581597
//Lớp:K58QLTT

------------------------------------------------------------------------------------------------------------
#include<stdio.h>

enum {size=100};//Kích thước mảng
//Khai bao cau truc
typedef struct ds
{
int a[size];
int R;
int F;
}ds;
//Khai bao ham
void Create(ds *ds);//Hàm khỏi tạo
void CQInsert(ds *ds,int x);//Hàm chèn một phần tử x vào ds
int CQDelete(ds *ds);//Ham xóa bỏ 1 phần tử và trả về phần tử đó
int empty(ds *ds);//Hàm kiểm tra ds rỗng.

//====Chương trình chính====
void main()
{
ds ds;

Create(&ds);//Khởi tạo ds

CQInsert(&ds,1);//Chèn 1 vào ds
CQInsert(&ds,2);//Chèn 2 vào ds
CQInsert(&ds,3);//Chèn 3 vào ds
CQInsert(&ds,4);//Chèn 4 vào ds

       //xóa bỏ từng phần tử trong danh sách và in phần tử đó ra
while(!empty(&ds))
printf("%d\t\t",CQDelete(&ds));
}

//Dinh nghia ham
void Create(ds *ds)
{
ds->F=-1;
ds->R=-1;
}
//-----------------------------------------------------
void CQInsert(ds *ds,int x)
{
        //Kiểm tra ds đầy
if((ds->F==0)&&(ds->R==size-1)||(ds->R+1==ds->F))
{
printf("Danh sach da day.!");
return;
}
        //Thay đổi chỉ số
if(ds->F==-1)
{
ds->F=0;
ds->R=0;
}else if(ds->R==size-1)
                  ds->R=0;
          else
               ds->R++;
        //Bổ sung
ds->a[ds->R]=x;
}
int CQDelete(ds *ds)
{
int tg;
        //Kiểm tra ds rỗng
if(ds->F<0)
{
printf("Ds rong.!");
return 0;
}

tg=ds->a[ds->F];//Phần tử xóa bỏ trả về

       //Thay đổi chỉ số
if(ds->F==ds->R)
{
ds->F=-1;
ds->R=-1;
}
else if(ds->F==size-1)
ds->F=0;
else
               ds->F++;
return tg;
}
//---------------------------
int empty(ds *ds)
{
if(ds->F<0)
return 1;//Rỗng trả về 1
return 0;
}
Kết quả khi chạy chương trình :
  

Cài đặt ngăn xếp bằng mảng với ngông ngữ C

//Họ và tên:Trần văn Linh
//Msv:581597
//Lớp:K58QLTT

--------------------------------------------------------------------------------
#include<stdio.h>

enum {size=100};//Kích thước của mảng
//Khai bao cau truc

typedef struct ds
{
int a[size];
int T;//Chỉ số phần  tử đỉnh ngăn xếp
}ds;
//Khai bao ham
void taoDS(ds *ds);//Hàm khởi tạo danh sách
void push(ds *ds,int x);//Hàm bổ sung vào danh sách
int pop(ds *ds);//Hàm xóa bỏ một phần tử và trả về phần tử bị xóa
int empty(ds *ds);//Hàm kiểm tra danh sách rỗng

//===Chương trình chính==
void main()
{
ds ds;

taoDS(&ds);//Tạo danh sách

push(&ds,1);//Bổ sung 1 vào ds
push(&ds,2);//Bổ sung 2 vào ds
push(&ds,3);//Bổ sung 3 vào ds
push(&ds,4);//Bổ sung 4 vào ds
     
        //Xóa từng phần tử của danh sách và in ra phần tử đó.
while(!empty(&ds))
printf("%d\t\t",pop(&ds));
}
//Dinh nghia ham
void taoDS(ds *ds)
{
ds->T=-1;
}
void push(ds *ds,int x)
{
if(ds->T==size)
{
printf("Danh sach da day.!");
return;
}
ds->T+=1;
ds->a[ds->T]=x;
}
//---------------------------------------------------
int pop(ds *ds)
{
int tg;

if(ds->T<0)
{
printf("Ds rong.!");
return 0;
}
tg=ds->a[ds->T];
ds->T-=1;
return tg;
}
//--------------------------------------
int empty(ds *ds)
{
if(ds->T<0)
return 1;
return 0;
}

Kết quả khi chạy chương trình :