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 :

    

Giải thuật thêm,xóa ,tim kiếm một nút vào danh sách liên kết đơn

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

---------------------------------------------------------------------------------
A.Giải thuật thêm một nút vào danh sách liên đơn
Bài này mình sẽ giới thiệu 3 trường hợp bổ sung trong danh sách liên kết đơn.
Mình sẽ dùng 2 biến con trỏ F, R là nút đầu tiên, nút cuối cùng của danh sách.

Lưu ý : new <=AVAIL và P=>AVAIL để biểu thị việc cấp phát và thu hồi bộ nhớ.

TH1. Giải thuật bổ sung vào nút đầu tiên
 - Vào :Phần tử dữ liệu x
 -  Ra: Không có

procedure Insert(F,X)
1,{Tạo nút mới}
      new <=AVAIL;
    infor(new):=X;
    Link(new):=null;
2,{Bổ sung}
   Link(new):=F;
   F:=new;
3,{Kết thúc}
Return.

TH2. Giải thuật bổ sung vào sau nút M
  -Vào :M,X
  -Ra: Không có

procedure Insert(F,M,X)
1,{Tạo nút mới}
      new <=AVAIL;
    infor(new):=X;
    Link(new):=null;
2,{Bổ sung}
 {Trường hợp danh sách rỗng}
  if F=null then
      F:=new;
  else
  begin
        Link(new):=Link(M);
        Link(M):=new;
  end
3,{Kết thúc}
Return.

TH3. Giải thuật bổ sung vào nút cuối cùng

procedure Insert(F,R,M,X)
1,{Tạo nút mới}
      new <=AVAIL;
    infor(new):=X;
    Link(new):=null;
2,{Bổ sung}
 {Trường hợp danh sách rỗng}
  if F=null then
                    begin
                          F:=new;
                          R:=new;
  else
  begin
        Link(R):=new;
        R:=new;
  end
3,{Kết thúc}
Return. 

B. Giải thuật tiềm kiếm một nút trong danh sách liên đơn khi biết trường thông tin.

 Vào :F,thông tin nút cần tìm kiếm 
 Ra: Nút cần tìm kiếm

 Function Search(F,X)
 1{Kiểm tra danh sách rỗng}
   if F=null
   begin
        write('Danh sách rỗng');
        return;{kết thúc}
   end
 2,{Tìm kiếm}
   P:=F;
   while P#null Do
   begin
        if infor(P)=X
         begin
              Q:=P;{nút tìm thấy}
              return;{Dừng vòng lặp,thay cho lệnh break trong C}
        end;
         P=Link(P);
   end
3,{Kiểm tra xem có tồn tại nút cần tìm không?}
 if Q=null
 begin
      write('Không tồn tại nút cần tìm kiếm.!');
      return;{Kết thúc}
 end
else
    Search:=Q;{Trả về nút được tìm thấy}
4,{Kết thúc}
Return.

C. Giải thuật xóa một nút có trường thông tin là x trong danh sách liên kết đơn.
Vào:F,X
Ra: Không có

Procedure    Delete(F,X)
1{Kiểm tra danh sách rỗng}
   if F=null
   begin
        write('Danh sách rỗng');
        return;{kết thúc}
  end
2,{Tìm nút cần xóa}
 P:=F;
 while P# null Do
 begin
       if infor(P)=X then
            return;{Dừng vòng lặp,thay cho lệnh break trong C}
      Q:=P;
      P:=Link(P);{nút cần xóa}
 end
3,{xóa bỏ}
if P # null
begin
     if P=F then
           F=Link(F);
     else
     begin
          Link(Q):=Link(P);
     end
  P=>AVAIL;{Thu hồi bộ nhớ}
end
4,{Kết thúc}
Return.