Sunday, May 15, 2016

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.

1 comments:

  1. a ơi cho e hỏi là em viết 1 hàm tìm kiếm 1 phần tử có giá trị = x, và 1 hàm xóa đi nút chứa phần tử đó, thì có cách nào rút ngắn hàm xóa mà ko cần tìm nút ko ạ( hàm tìm kiếm có kiểu trả về là int)

    ReplyDelete