b.Duyệt có điều kiện:Duyệt qua lần lượt các phần tử trong danh sách với mỗi phần tử đang xét ta sử dụng thông tin của phần tử để giải quyết một số vấn đề như là đếm,liệt kê,thêm,tìm kiếm
Trang 12 Xóa có điều kiện
II Các thao tác trên cây (cây nhị phân,cây tìm kiếm nhị phân,cây tổng quát):
Duyệt
1 Duyệt cơ bản
2 Duyệt có điều kiện
Thêm (chỉ có trên cây nhị phân)
1 Thêm cơ bản
2 Thêm có điều kiện
Xóa (chủ yếu là xóa nút lá)
1 Xóa cơ bản
2 Xóa có điều kiện
III Các thao tác trên đồ thị (đồ thị có hướng,vô hướng):
Cách tổ chức dữ liệu gồm có 2 thành phần như sau:
+một mảng mangpt lưu tất cả các phần tử của danh sách,mỗi phần tử có kiểu là KieuPT +một ô nhớ để lưu số phần tử của mảng và cũng là phần tử cuối cùng của mảng
Trang 2Khai báo danh sách:
Pascal:
Type KieuPT =record
Thuộc tính 1 : kiểu dữ liệu 1 ; Thuộc tính 2 : kiểu dữ liệu 2 ; Thuộc tính 3 : kiểu dữ liệu 3 ;
… Thuộc tính n : kiểu dữ liệu n ; End;
Type DanhSach =record
mangpt :Array[1 Max ] of KieuPT ; soPT :integer;
end;
Java:
class KieuPT
{
private kiểu dữ liệu 1 Thuộc tính 1 ;
private kiểu dữ liệu 2 Thuộc tính 2 ;
private kiểu dữ liệu 3 Thuộc tính 3 ;
private KieuPT mangpt [];
private int soPT ;
…
}
Chú ý:
+ Max số phần tử tối đa của danh sách
+ DanhSach tên danh sách ,ví dụ danh sách sinh viên thì đặt tên là DSSV ,danh sách thuê bao thì đặt tên là DanhBa (hoặc đặt tên là DSTB :danh sách thuê bao),danh sách giáo viên thì đặt tên là DSGV…
Trang 3+ mangpt tên cái mảng lưu danh sách,ở đây ta viết lại cái tên mảng mình đặt ở
+các loại kiểu dữ liệu 1 , kiểu dữ liệu 2, kiểu dữ liệu 3 là các kiểu dữ liệu phù hợp cho từng thuộc tính ,ví dụ : thuộc tính 1 là họ tên thì kiểu dữ liệu 1 là kiểu string (kiểu
chuỗi), thuộc tính 2 là mã số sinh viên thì kiểu dữ liệu 2 là kiểu string (kiểu chuỗi), thuộc tính
3 nếu dùng để lưu trữ số nguyên thì kiểu dữ liệu 3 là kiểu integer (kiểu số nguyên),nếu thuộc tính 4 dùng để lưu trữ điểm trung bình thì kiểu dữ liệu 4 là kiểu real(kiểu số thực ,vì điểm trung bình thường là số có phần lẻ thập phân ví dụ:7.5 ,8.6 …).Tổng quát là tùy vào giá trị cần lưu trữ là chuỗi kí tự thì dùng kiểu string ,nếu lưu trữ số nguyên thì là kiểu integer ,số thực thì là kiểu real
Ví dụ về khai báo tổ chức dữ liệu bằng mảng
Bài 1:Cho danh sách sinh viên,mỗi sinh viên gồm:tên,mã sinh viên,điểm trung bình.Hãy khai báo tổ chức dữ liệu cho danh sách này
o Giải đáp
Mỗi sinh viên gồm 3 thành phần:
+Phần tên thuộc kiểu xâu kí tự
+Phần mã sinh viên thuộc kiểu xâu kí tự
+Phần điểm trung bình thuộc kiểu số thực
Tổ chức dữ liệu danh sách sinh viên bằng mảng gồm 2 thành phần:
+Phần mảng lưu tất cả các phần tử của danh sách,mà mỗi phần tử thuộc kiểu sinh viên
+Một ô nhớ lưu số lượng sinh viên trong danh sách
Trang 4private string ten;
private string masv;
+Phần tên thuộc kiểu xâu kí tự
+Phần giá tiền thuộc kiểu số nguyên
+Phần tác giả là một mảng danh sách các tên tác giả,mỗi tên tác giả thuộc kiểu xâu kí tự
Tổ chức dữ liệu cho danh sách bằng mảng gồm 2 thành phần:
+Phần mảng lưu tất cả các phần tử của danh sách,mà mỗi phần tử là một cuốn sách +Một ô nhớ lưu số lượng cuốn sách trong danh sách
Trang 5private string ten;
private int giaTien;
private string tacGia[];
private int soTacGia;
+Phần mã phòng thuộc kiểu xâu kí tự
+Phần tên người thuê phòng,thuộc kiểu xâu kí tự
+Phần thời gian thuê thuộc kiểu số nguyên
Tổ chức dữ liệu cho danh sách bằng mảng gồm 2 thành phần:
+Phần mảng lưu tất cả các phần tử của danh sách,mà mỗi phần tử là một phòng
+Một ô nhớ lưu số lượng phòng trong danh sách
Khai báo:
Pascal:
const Max_Phong=…;{số lượng phòng tối đa trong danh sách}
TYPE
Trang 6private string maPhong;
private string tenKH;
private int thoiGian;
+Phần tên thuộc kiểu xâu
+Phần số lượng thuộc kiểu số nguyên
+Phần đơn giá thuộc kiểu số nguyên
+Phần thành tiền thuộc kiểu số nguyên
Tổ chức dữ liệu bằng mảng cho mỗi hóa đơn gồm 2 thành phần:
+Phần mảng lưu tất cả các phần tử của danh sách,mà mỗi phần tử là một hàng hóa
+Một ô nhớ lưu số lượng hàng hóa trong danh sách
Trang 7Tổ chức dữ liệu bằng mảng cho danh sách các hóa đơn gồm 2 thành phần:
+Phần mảng lưu tất cả các phần tử của danh sách,mà mỗi phần tử là một hóa đơn +Một ô nhớ lưu số lượng hóa đơn trong danh sách
private string tenHH;
private int soLuong;
private int donGia;
private int thanhTien;
Trang 8Bài 5:Một người có rất nhiều bạn,anh ta có thể liên lạc với những người bạn của mình bằng
số điện thoại,nhưng máy điện thoại của anh ấy thì không thể lưu được nhiều hơn 10 số điện thoại.Cho nên Anh ta quyết định viết một phần mềm trên máy tính để quản lý các số điện thoại tất cả bạn bè.Nhưng anh ấy lại chưa biết làm sao để khai báo tổ chức dữ liệu.Bạn hãy giúp anh ấy khai tổ chức dữ liệu cho phần mềm này nhé
o Giải đáp
Mỗi thuê bao gồm 2 thành phần:
+Phần tên thuê bao thuộc kiểu xâu kí tự
+Phần số điện thoại,thuộc kiểu xâu kí tự
Tổ chức dữ liệu cho danh sách thuê bao bằng mảng gồm 2 thành phần:
+Phần mảng lưu tất cả các phần tử của danh bạ,mà mỗi phần tử là một thuê bao
+Một ô nhớ lưu số lượng thuê bao trong danh bạ
private string tenTB;
private string soDT;
…
Trang 9Chú thích:
- Thao tác: so sánh,kiểm tra
- Thông tin của phần tử:ví dụ tên sinh viên,mã sinh viên,điểm…
Thuật toán:
- Duyệt lần lượt từng phần tử của danh sách từ đầu đến cuối danh sách
+ Thao tác với phần tử đang xét(thăm)
Giải thích thuật toán:Lần lượt xem qua tất cả các phần tử của danh sách,với mỗi phần tử đang xét ta
có thể dùng nó để làm điều kiện cho việc tính toán khác như đếm phần tử,liệt kê,tìm kiếm…
Trang 10b.Duyệt có điều kiện:Duyệt qua lần lượt các phần tử trong danh sách với mỗi phần tử đang xét ta
sử dụng thông tin của phần tử để giải quyết một số vấn đề như là đếm,liệt kê,thêm,tìm kiếm,… Giải thích:Với mỗi một phần tử của danh sách ta sẽ kiểm tra thông tin của phần tử,việc kiểm tra thông tin của phần tử chính là điều kiện duyệt,kết quả duyệt có điều kiện hoàn toàn phụ thuộc vào điều kiện này.Sử dụng thông tin của phần tử để làm điều kiện cho các thao tác đếm,thêm,tìm
kiếm,…
Chú thích:
- Thông tin của phần tử:ví dụ tên sinh viên,mã sinh viên,điểm…
- kiểm tra Thông tin của phần tử :ví dụ kiểm tra tên sinh viên có phải là “Nguyễn Văn A” ,kiểm tra sinh viên có mã sinh viên “1204520” ,hoặc kiểm tra sinh viên có điểm >=7.0
Lưu ý:Nếu vận dụng linh hoạt việc sử dụng thông tin của phần tử làm điều kiện duyệt thì tất cả các bài toán ta đều giải quyết được
Thuật toán:
- Duyệt lần lượt từng phần tử trong danh sách từ đầu đến cuối danh sách
+ Kiểm tra thông tin của phần tử đang xét nếu thỏa mãn điều kiện thì thực hiện công việc như đếm,liệt kê,tìm kiếm,…
Giải thích thuật toán:Với mỗi phần tử trong danh sách ta sẽ kiểm tra thông tin của phần tử nếu thông tin này thỏa mãn điều kiện yêu cầu từ đề bài thì thực hiện việc đếm,liệt kê,hoặc tìm kiếm,…
Cài đặt:
Pascal:
function duyetDK(dk:KieuDK):kiểu trả về;{KieuDK là kiểu dữ liệu của điều kiện}
Trang 11}
Chú ý:hầu hết thao tác duyệt đều là duyệt có điều kiện
Các loại duyệt có điều kiện của danh sách tổ chức bằng mảng:
- Duyệt để liệt kê
+Liệt kê tên của tất cả các sinh viên thì thông tin cần hiển thị là tên sinh viên
+Liệt kê điểm của tất cả các sinh viên thì thông tin cần hiển thị là điểm
Chú ý:các loại liệt kê ở trên là liệt kê không có điều kiện,chủ yếu chúng ta cần quan tâm là liệt kê có điều kiện,ví dụ:liệt kê các sinh viên tên “Nguyễn Văn A”,liệt kê các sinh viên có điểm số lớn hơn a,liệt kê các sinh viên quê ở “Bình Định”
Trang 12Như vậy trong duyệt để liệt kê còn có thêm phần điều kiện,nhưng ta dễ thấy những điều kiện của đề bài sẽ dùng để kiểm tra thông tin của phần tử trong danh sách,nếu thông tin của phần tử phù hợp với điều kiện yêu cầu từ đề bài thì ta sẽ hiển thị thông tin của phần tử đúng với điều kiện đề bài
Thuật toán:
- Duyệt lần lượt từng phần tử trong danh sách từ đầu đến cuối
+ Nếu thông tin của phần tử đang xét phù hợp với yêu cầu đề bài thì hiển thị ra thông tin của phần tử này(theo yêu cầu của đề bài)
}
Ví dụ duyệt để liệt kê:
Bài 1:Cho danh sách sinh viên,mỗi sinh viên gồm:tên,mã sinh viên,điểm trung bình.Hãy khai báo tổ chức dữ liệu cho danh sách này.Sau đó trình bày thuật toán và cài đặt chương trình có chức năng sau a)Liệt kê nhưng sinh viên có họ là X
b)Liệt kê những sinh viên có mã số bắt đầu là y
c)Liệt kê những sinh viên có điểm trung bình >=z
o Giải đáp
Trang 13Phần khai báo tổ chức dữ liệu đã làm ở phần trước,nên ở phần này chỉ tập trung vào trình bày thuật toán và cài đặt chương trình cho từng thuật toán
a)Liệt kê những sinh viên có họ là X
Thuật toán:
- Duyệt lần lượt từng phần tử trong danh sách sinh viên từ đầu đến cuối danh sách
+ Nếu sinh viên đang xét có họ là X thì hiển thị thông tin của sinh viên này
- Duyệt lần lượt từng phần tử trong danh sách sinh viên từ đầu đến cuối danh sách
+ Nếu sinh viên đang xét có mã số bắt đầu là y thì hiển thị thông tin của sinh viên này Cài đặt:
Trang 14Writeln(„ten :‟,ds.sv[i].ten,‟ masv:‟,ds.sv[i].masv,‟ dtb:‟,ds.sv[i].dtb);
- Duyệt lần lượt từng phần tử trong danh sách sinh viên từ đầu đến cuối danh sách
+ Nếu sinh viên đang xét có điểm trung bình >=z thì hiển thị thông tin của sinh viên này Cài đặt:
If(ds.sv[i].dtb>=z) then{nếu sinh viên đang xét có điểm trung bình >=z}
Writeln(„ten :‟,ds.sv[i].ten,‟ masv:‟,ds.sv[i].masv,‟ dtb:‟,ds.sv[i].dtb);
if(sv[i].dtb>=z)//nếu sinh viên đang xét có điểm trung bình >=z
System.out.println(“ten :”+sv[i].ten+” masv:”+sv[i].masv+” dtb:”+sv[i].dtb); }
}
Trang 15Bài 2:Khai báo tổ chức dữ liệu cho một danh sách các cuốn sách,mỗi cuốn sách gồm tên sách,giá tiền,các tác giả(tối đa 5 tên tác giả).Trình bày thuật toán và cài đặt cho các chức năng sau
a)Liệt kê các cuốn sách có giá tiền <=t
b)Liệt kê các cuốn sách có tên tác giả là tg
o Giải đáp
a)Liệt kê các cuốn sách có giá tiền <=t
Thuật toán:
- Duyệt lần lượt từng phần tử trong danh sách cuốn sách từ đầu đến cuối danh sách
+ Nếu cuốn sách đang xét có giá tiền <=t thì hiển thị thông tin của cuốn sách này
Trang 16System.out.print(“ “+cs[i].layTacGia[j]);
} }
}
b)Liệt kê các cuốn sách có tên tác giả là tg
Thuật toán:
- Duyệt lần lượt từng phần tử trong danh sách cuốn sách từ đầu đến cuối danh sách
+ Nếu cuốn sách đang xét có tên tác giả là tg thì hiển thị thông tin của cuốn sách này Cài đặt:
If(ds.cs[i].tacgia[j]=tg) then{nếu cuốn sách đang xét có tác giả là tg thì} Begin
Writeln(„ten :‟,ds.cs[i].ten,‟ gia tien:‟,ds.cs[i].giatien,‟ tac gia:‟);
For j:=1 to ds.cs[i].soTacGia
Write(„ „,ds.cs[i].tacgia[j]);
Break;
End End;
Trang 17break;
} }
- Điều kiện trong câu hỏi này là tên “Nguyễn Văn A” , yêu cầu đề bài là có hay không có =>ta
sẽ duyệt qua tất cả các sinh viên trong danh sách nếu có người tên “Nguyễn Văn A” thì kết quả trả về là true,ngược lại trả về false(khi ta duyệt qua tất cả các phần tử trong danh sách mà không tìm thấy người tên “Nguyễn Văn A” thì trả về kết quả là false)
*Thuật toán:
Duyệt lần lượt từng phần tử của danh sách sinh viên từ đầu đến cuối danh sách
++ Nếu phần tử đang xét có tên là “Nguyễn Văn A” thì kết quả trả về là true,dừng lặp Nếu không tìm thấy thì Trả về false
+ Tìm sinh viên có mã sinh viên là “10233011”,kết quả trả về phần tử chứa sinh viên
- Điều kiện ở đây là mã sinh viên ,yêu cầu đề bài trả về sinh viên tìm được =>ta sẽ xem trong danh sách có mã sinh viên “10233011” hay không,nếu có trả về phần tử sinh viên,ngược lại không tìm được thì trả về null.(khi ta duyệt qua tất cả các phần tử trong danh sách mà không tìm thấy mã sinh viên “10233011” thì trả về kết quả là false)
Duyệt lần lượt từng phần tử của danh sách sinh viên từ đầu đến cuối danh sách
++ Nếu phần tử đang xét có tên là “10233011” thì kết quả trả về là true,dừng lặp
Nếu không tìm thấy thì Trả về false
+ Tìm địa chỉ của sinh viên tên “Nguyễn Văn X”
- Điều kiện ở đây là tên “Nguyễn Văn X”,yêu cầu đề bài là tìm địa chỉ => ta sẽ duyệt qua tất cả các phần tử của danh sách,nếu gặp phần tử có tên “Nguyễn Văn X” thì ta lấy thông tin địa chỉ (kiểu string)của người này.Nếu không tìm được người nào có tên “Nguyễn Văn X” thì kết quả trả về là chuỗi rỗng
Duyệt lần lượt từng phần tử của danh sách sinh viên từ đầu đến cuối danh sách
++ Nếu phần tử đang xét có tên là “Nguyễn Văn X” thì kết quả trả về là địa chỉ của người này,dừng lặp
Nếu không tìm thấy thì Trả về chuỗi rỗng
+ Tìm số điện thoại của người tên X
Trang 18+ Tìm tên của chủ số điện thoại 01263652236
+ Tìm vị trí của sinh viên tên X
o Giải đáp:Điều kiện tìm kiếm là tên của sinh viên,kết quả trả về vị trí của sinh viên này
- Duyệt lần lượt từng phần tử của danh sách từ đầu đến cuối danh sách
+ Nếu phần tử đang xét có tên là X thì trả về vị trí của phần tử đang xét,dừng lặp
- (Không tìm được )trả về -1
Thuật toán (duyệt để tìm kiếm):
- Duyệt lần lượt từng phần tử của danh sách từ đầu đến cuối danh sách
+ Nếu phần tử đang xét có thông tin phù hợp với điều kiện của để bài thì trả về kết quả theo yêu cầu đề bài
- (Không tìm được )trả về false,null, rỗng,hoặc -1(-1 dùng cho tìm kiếm vị trí)
Trang 19} }
return false,null,-1,hoặc rỗng;//không tìm thấy phần tử nào
b)Tìm vị trí sinh viên có điểm trung bình cao nhất
c)Kiểm tra trong danh sách có sinh viên mang mã số z
- Duyệt lần lượt từng phần tử trong danh sách sinh viên từ đầu đến cuối danh sách
+ Nếu sinh viên đang xét có tên là X thì trả về kết quả là vị trí của sinh viên này
tim:=-1;{không tìm thấy sinh viên tên X}
For i:=1 to ds.soSV
Trang 20return i;//tìm thấy sinh viên tên x ở vị trí i }
return -1;//không tìm thấy sinh viên tên x
*Gán max là điểm trung bình của sinh viên này
*Gán vitri là vị trí của sinh viên này
Trang 21{
max:= sv[i].dtb;
vitri:=i;
} }
Trang 22 Duyệt để đếm:Duyệt qua tất cả các phần tử của danh sách,khi xem xét từng phần tử của danh sách ta kiểm tra thông tin của phần tử đó,nếu phù hợp với điều kiện yêu cầu từ đề bài ta
sẽ đếm số phần tử cùng điều kiện của đề bài
Ví dụ:
+ Đếm số người có điểm trung bình trên 5
+ Đếm số người có cùng họ “Nguyễn”
+ Đếm số điện thoại có đầu số 098
+ Đếm số người cùng ở địa chỉ “Quy Nhơn”
+ Đếm số lượng số nhỏ hơn 22 trong một mảng số nguyên
+ Đếm số lượng số lớn hơn 26 nhỏ hơn 45 trong một mảng số nguyên
+ Đếm số sinh viên có điểm trung bình lớn hơn 6.5 nhỏ hơn 8.0
+ Đếm số điện thoại có đầu số 0168 hoặc 0169
+ Đếm số điện thoại có số đuôi là 165
+ Đếm số người cùng họ “Nguyễn” và có điểm trung bình lớn hơn 6.0
+ Đếm số sách lớp 10 và có mệnh giá lớn hơn 25 ngàn
+ Đếm số sách thể loại “truyện tranh” trong thư viện
Chú ý:Trên đây là một số ví dụ về đếm có điều kiện,điều kiện của đề bài có thể là được kết hợp từ nhiều thông tin của phần tử trong danh sách.Với mỗi phần tử trong danh sách ta kiểm tra thông tin của phần tử với điều kiện của đề bài.Kết quả của việc đếm chính là số lượng phần tử có thông tin phù hợp với điều kiện từ đề bài
Thuật toán:
- Duyệt lần lượt từng phần tử của danh sách từ đầu đến cuối danh sách
+ Nếu thông tin của phần tử đang xét phù hợp với điều kiện của đề bài thì tăng biến đếm thêm 1
Trang 23Ví dụ:
Đầu tiên ta ví dụ một danh sách số điện thoại của sinh viên được ghi trên giấy:
Để thêm một số điện thoại vào danh sách thì ta có 2 cách thêm đó là:thêm vào các vị trí đã có số điện thoại hoặc thêm vào cuối danh sách này
Để thêm vào vị trí đã có số điện thoại ta cần có một tờ giấy trắng,tiến hành chép lại các số điện thoại
từ đầu đến vị trí trước vị trí cần thêm trong danh sách cũ vào tờ giấy trắng,sau đó viết tiếp số điện thoại cần thêm vào tờ giấy này,cuối cùng chép các số điện thoại còn lại trong danh sách cũ vào tờ giấy.Minh họa bằng hình ảnh như sau:
Trang 24Ở hình trên ,số điện thoại cần thêm là 0123445566,vị trí cần thêm là vị trí thứ 5(thứ tự bắt đầu từ 1).Đây gọi là thêm vào vị trí thứ k trong danh sách(k € [1,sopt],sopt là số phần tử)
Để thêm một phần tử vào cuối danh sách thì rất dễ dàng ta chỉ cần viết nó vào sau phần tử cuối cùng của danh sách cũ.tức là thêm vào vị trí thứ sopt+1
Danh sách tổ chức bằng mảng trên máy tính có điểm thuận lợi hơn danh sách trên giấy,vì có thể xóa
dữ liệu và ghi mới dữ liệu một cách dễ dàng.Nên việc thêm một phần tử vào danh sách thực hiện dễ dàng hơn mà không cần tạo thêm một danh sách mới như làm việc trên giấy
Thêm vào vị trí k (k€[1 đến sopt],với sopt là số phần tử của danh sách hiện tại):
Công việc thêm sẽ làm như sau:di chuyển các phần tử của danh sách từ vị trí k đến sopt ra sau một
vị trí,sau đó đưa phần tử cần thêm vào vị trí k
Chi tiết hơn cho công việc này là:duyệt lần lượt các phần tử của danh sách từ cuối(vị trí sopt) về vị trí k,dời phần tử đang xét ra sau 1 vị trí
Việc thêm phần tử vào danh sách tổ chức bằng mảng cũng giống như việc một người chen vào hàng người đang mua vé tàu.Khi người này chen vào thì những người phía sau người này buộc lòng phải lùi ra sau thì mới có chỗ đứng.Và trên máy tính việc làm này cũng giống vậy,giống như việc một
………
n.0122564665 n+1.0188656565
0123445566 Sao chép
Sao chép
Phần tử mới
Trang 25người xin vào hàng và được những người khác đồng ý và họ sẽ nhường vị trí này,để có chỗ trống bắt buộc người sau cùng phải lùi ra sau trước tiên,tiếp đến những người khác từ sau trở về trước phải lùi ra sau.Việc làm này tránh người này dẫm lên chân người kia,cũng giống như trong máy tính làm vậy sẽ không bị mất bất cứ một phần tử nào trong danh sách
Thuật toán thêm một phần tử vào vị trí k:
- Duyệt lần lượt từng phần tử trong danh sách từ cuối về vị trí k
+ chuyển phần tử đang xét ra sau 1 vị trí
- Đưa phần tử cần thêm vào vị trí k
Chi tiết hơn:
- Duyệt lần lượt từng phần tử trong danh sách từ vị trí sopt về vị trí k
+ đưa phần tử đang xét ra sau 1 vị trí
- Đưa phần tử cần thêm vào vị trí k
Trang 26Chú ý:Thao tác thêm được mô tả trên đây chỉ còn một điều kiện đơn giản khi thêm điều kiện là vị trí cần thêm trong mảng.Nhưng trong nhiều bài toán thao tác thêm có thể có các điều kiện khác như thêm một phần tử sau phần tử có tên x,hoặc thêm một sinh viên vào sau sinh viên có mã sinh viên y
Thêm có điều kiện ta cũng làm tương tự như thêm vào vị trí k,nhưng lúc này ta chưa biết vị trí cần thêm do đó ta cần phải tìm ra vị trí cần thêm đúng theo yêu cầu đề bài,với vị trí tìm được ta dùng thuật toán thêm phần tử vào vị trí k để giải quyết.Nếu không tìm được vị trí cần thêm thì không thêm phần tử vào danh sách
Ví dụ:
+ Thêm một sinh viên vào sau sinh viên tên x trong danh sách sinh viên
+ Thêm một số điện thoại vào sau số điện thoại y
+ Thêm một môn học vào danh sách môn học của người tên z
+ Nhập điểm môn cấu trúc dữ liệu cho sinh viên có mã số x
Trên đây là một số ví dụ cơ bản cho việc thêm có điều kiện,việc kết hợp nhiều thông tin của phần tử
để tìm được vị trí cần thêm thì việc thêm trở thành thêm có điều kiện
Thuật toán:
- Duyệt lần lượt từng phần tử của danh sách từ đầu đến cuối danh sách
+ Nếu phần tử đang xét thỏa điều kiện đề bài,vị trí của phần tử này gọi là vị trí k,dừng lặp
- Duyệt lần lượt từng phần tử của danh sách từ cuối về vị trí k
+ Chuyển phần tử đang xét ra sau 1 vị trí
- Đưa phần tử cần thêm vào vị trí k
i+1;nếu đề bài yêu cầu thêm vào sau phần tử có điều kiện dk
i;nếu đề bài yêu cầu thêm vào vị trí của phần tử có điều kiện dk break;
end;
end;
k=
Trang 27for i:=sopt downto k do
Thuật toán xóa phần tử ở vị trí thứ k:Chuyển các phần tử từ vị trí sau k đến cuối danh sách lên trước một vị trí.Tức là ta thay thế phần tử thứ k bằng phần tử thứ k+1,phần tử k+1 được thay bằng phần tử k+2,lặp cho đến phần tử thứ sopt-1 được thay bằng phần tử thứ n
- Duyệt lần lượt từng phần tử trong danh sách từ vị trí k đến sopt-1
+ Đặt phần tử đang xét là phần tử liền sau nó
- Giảm số phần tử đi 1
k=
Trang 28có chứa thông tin phù hợp với điều kiện của đề bài ta tiến hành xóa phần tử này
- Có hai loại thao tác xóa:
+ Chỉ xóa một phần tử
+ Xóa nhiều phần tử hoặc tất cả phần tử có cùng điều kiện
Xóa một phần tử theo điều kiện bài toán:Tìm phần tử cần xóa theo điều kiện từ đề bài sau đó tiến hành xóa
Xóa nhiều phần tử theo điều kiện bài toán:Ta có một cách giải quyết đơn giản đó là với mỗi phần tử tìm được ta tiến hành xóa phần tử đó,lặp lại quá trình này cho đến khi không tìm thấy phần tử nào thỏa điều kiện bài toán
Một cách giải quyết tốt hơn đó là với mỗi phần từ cần xóa ta không ghi nó trở lại danh sách,ta chỉ ghi những phần tử không phù hợp với điều kiện bài toán trở lại danh sách.Cách này giống như lập một danh sách mới,do dữ liệu trên máy tính có thể xóa và ghi dễ dàng
Một kỹ thuật để giải quyết việc xóa nhiều phần tử đó là ta dùng một biến giữ vị trí mà ta sẽ ghi phần
tử cần ghi vào vị trí đó,những phần tử nào cần xóa thì bỏ qua.Gọi p là biến lưu vị trí cần ghi,khởi tạo
Trang 29p=0,với mỗi phần tử không thỏa điều kiện xóa thì ta tăng p thêm 1 và ta ghi phần tử này vào vị trí p, nếu gặp phần tử cần xóa thì ta không làm gì cả,sau khi đã duyệt qua hết tất cả phần tử của danh sách thì p chính là số phần tử còn lại sau khi xóa
Thuật toán:
- Gán p=0
- Duyệt lần lượt từng phần tử trong danh sách từ đầu đến cuối danh sách
+ Nếu phần tử đang xét có thông tin không thỏa mãn điều kiện đề bài thì
*Tăng p thêm 1
*Đưa phần tử đang xét vào vị trí p
- Gán số phần tử là p
Ví dụ:Xóa tất cả những số điện thoại có đầu số 0123 trong danh bạ
Điều kiện cần xóa là đầu số 0123,Thuật toán giải quyết như sau:Duyệt lần lượt từng phần tử từ đầu đến cuối danh sách,ghi lại những số điện thoại có đầu số khác 0123
- Gán p=0
- Duyệt lần lượt từng phần tử trong danh bạ từ đầu đến cuối danh bạ
+ Nếu phần tử đang xét có đầu số khác 0123 thì
*Tăng p thêm 1
*Đưa số điện thoại đang xét vào vị trí p
- Gán số phần tử là p
2.Danh sách liên kết đơn:
Tổ chức dữ liệu danh sách liên kết đơn:
Mỗi phần tử trong danh sách liên kết đơn gồm hai thành phần:
+ Phần dữ liệu của từng phần tử trong danh sách,thuộc kiểu KieuPT
+ Phần lienKet là địa chỉ của phần tử mà nó liên kết đến
Một danh sách liên kết đơn gồm một thành phần:
+ Một ô nhớ lưu phần tử đầu của danh sách
Khai báo cho danh sách liên kết đơn:
Pascal:
TYPE
KieuPT =RECORD{khai báo phần dữ liệu}
Thuộc tính 1 : kiểu dữ liệu 1 ;
Thuộc tính 2 : kiểu dữ liệu 2 ;
Thuộc tính 3 : kiểu dữ liệu 3 ;
…
Thuộc tính n : kiểu dữ liệu n ;
Trang 30DSLK =^ PTLK ;
PTLK=record
dulieu:KieuPT;
lienKet : DSLK ; END;
var dau:DSLK;
Chú ý:
+ KieuPT là tên kiểu dữ liệu mình tự định nghĩa ,đặt tên sao cho sát với tên của đối tượng cần lưu trữ của danh sách mình đang làm việc,ví dụ danh sách sinh viên thì đối tượng cần lưu trữ là Sinh Viên suy ra KieuPT là SinhVien
+các loại kiểu dữ liệu 1 , kiểu dữ liệu 2, kiểu dữ liệu 3 là các kiểu dữ liệu phù hợp cho từng thuộc tính ,ví dụ : thuộc tính 1 là họ tên thì kiểu dữ liệu 1 là kiểu string (kiểu
chuỗi), thuộc tính 2 là mã số sinh viên thì kiểu dữ liệu 2 là kiểu string (kiểu chuỗi), thuộc tính
3 nếu dùng để lưu trữ số nguyên thì kiểu dữ liệu 3 là kiểu integer (kiểu số nguyên),nếu thuộc tính 4 dùng để lưu trữ điểm trung bình thì kiểu dữ liệu 4 là kiểu real(kiểu số thực ,vì điểm trung bình thường là số có phần lẻ thập phân ví dụ:7.5 ,8.6 …).Tổng quát là tùy vào giá trị cần lưu trữ là chuỗi kí tự thì dùng kiểu string ,nếu lưu trữ số nguyên thì là kiểu integer ,số thực thì là kiểu real
Java:
class KieuPT
{
private kiểu dữ liệu 1 Thuộc tính 1 ;
private kiểu dữ liệu 2 Thuộc tính 2 ;
private kiểu dữ liệu 3 Thuộc tính 3 ;
Trang 31+ PTLK tên đặt cho kiểu phần tử liên kết
+ KieuPT tên của kiểu dữ liệu cho mỗi phần tử trong danh sách(giống cách đặt tên cho KieuPT ở phần mảng)
+ lienKet tên đặt cho thuộc tính liên kết
+ PTLK tên của kiểu phần tử liên kết đã khai báo trước đó
Ví dụ khai báo danh sách liên kết đơn:
Bài 1:Cho danh sách sinh viên,mỗi sinh viên gồm:tên,mã sinh viên,điểm trung bình.Hãy khai báo tổ chức dữ liệu cho danh sách này
Mỗi sinh viên gồm 3 thành phần:
+Phần tên thuộc kiểu xâu kí tự
+Phần mã sinh viên thuộc kiểu xâu kí tự
+Phần điểm trung bình thuộc kiểu số thực
Tổ chức dữ liệu danh sách sinh viên bằng danh sách liên kết đơn gồm 2 thành phần:
+Phần dữ liệu của mỗi phần tử trong danh sách,thuộc kiểu sinh viên
Trang 32var dau:DSLK;
Java:
class SinhVien
{
private string ten;
private string masv;
+Phần tên sách thuộc kiểu xâu kí tự
+Phần giá tiền thuộc kiểu số nguyên
+Phần tác giả là một mảng tên các tác giả,mỗi tác giả thuộc kiểu xâu kí tự
Tổ chức dữ liệu danh sách cuốn sách bằng danh sách liên kết đơn gồm 2 thành phần: +Phần dữ liệu của mỗi phần tử trong danh sách,thuộc kiểu cuốn sách
Trang 33private string ten;
private int giaTien;
private string tacGia[];
+Phần mã phòng thuộc kiểu xâu kí tự
+Phần tên người thuê thuộc kiểu xâu kí tự
+Phần thời gian thuê thuộc kiểu số nguyên
Tổ chức dữ liệu danh sách phòng bằng danh sách liên kết đơn gồm 2 thành phần:
+Phần dữ liệu của mỗi phần tử trong danh sách,thuộc kiểu phòng
Trang 34private string maPhong;
private string tenKH;
private int thoiGian;
+Phần tên thuộc kiểu xâu
+Phần số lượng thuộc kiểu số nguyên
+Phần đơn giá thuộc kiểu số nguyên
+Phần thành tiền thuộc kiểu số nguyên
Trang 35Tổ chức dữ liệu bằng mảng cho mỗi hóa đơn gồm 2 thành phần:
+Phần mảng lưu tất cả các phần tử của danh sách,mà mỗi phần tử là một hàng hóa
+Một ô nhớ lưu số lượng hàng hóa trong danh sách
Tổ chức dữ liệu bằng danh sách liên kết đơn cho danh sách các hóa đơn gồm 2 thành phần: +Phần dữ liệu của mỗi phần tử trong danh sách,kiểu dữ liệu là hóa đơn
private string tenHH;
private int soLuong;
private int donGia;
private int thanhTien;
Trang 36Tổng quan danh sách liên kết đơn:
+Danh sách liên kết đơn là danh sách mà mỗi phần tử đều có một thành phần lưu giữ vị trí của phần
tử sau nó(vị trí này gọi là thành phần liên kết)
+Danh sách đơn có một ô nhớ lưu giữ phần tử đầu tiên của danh sách
+Phần tử cuối cùng của danh sách liên kết đơn sẽ liên kết đến phần tử rỗng
Thuật toán duyệt trong danh sách liên kết đơn:Gán p là phần tử đầu của danh sách,Lặp trong khi p khác rỗng,chuyển p sang phần tử ngay sau nó
Thuật toán:
- Gán p là phần tử đầu
- Lặp trong khi p khác rỗng
+Thao tác với phần tử p(thao tác:hiển thị,đếm,kiểm tra,so sánh,…)
+Chuyển p sang phần tử ngay sau nó
Giải thích thuật toán:Vì trong mỗi phần tử đều chứa một địa chỉ là vị trí của phần tử phía sau nó.Do
đó khi ta đang ở một phần tử nào đó ta hoàn toàn có thể chuyển sang phần tử sau nó,lặp lại với các phần tử còn lại cho đến khi gặp phần tử rỗng thì ta đã tới thăm tất cả các phần tử của danh sách
Duyệt có điều kiện:Duyệt các phần tử của danh sách nhưng chỉ quan tâm đến những phần tử có chứa thông tin thỏa mãn yêu cầu bài toán.Có nghĩa ta phải đi qua tất cả các phần tử của danh sách nhưng chỉ quan quân đến các phần tử thỏa mãn yêu cầu bài toán
Thuật toán duyệt có điều kiện:Gán p là phần tử đầu,Lặp trong khi p khác rỗng,thao tác với thông tin của phần tử p với điều kiện từ bài toán,chuyển p sang phần tử ngay sau nó
Thuật toán:
- Gán p là phần tử đầu
Trang 37- Lặp trong khi p khác rỗng
+ Nếu thông tin của phần tử p thỏa mãn yêu cầu bài toán thì thực hiện các thao tác với phần
tử này (ví dụ như:đếm,hiển thị,kiểm tra,so sánh,…)
+ Chuyển p sang phần tử ngay sau nó
Giải thích thuật toán:Với mỗi phần tử của danh sách ta kiểm tra thông tin phần tử này ,nếu thỏa mãn yêu cầu đề bài thì thực hiện thao tác trên phần tử này
Ví dụ:hiển thị sinh viên có điểm số lớn hơn 5.0
Điều kiện hiển thị:điểm số lớn hơn 5.0
Thuật toán:
- Gán p là phần tử đầu của danh sách sinh viên
- Lặp trong khi p khác rỗng
+ Nếu dữ liệu điểm của phần tử p lớn hơn 5.0 thì
*Hiển thị dữ liệu của p
+ Chuyển p sang phần tử ngay sau nó
Ví dụ của duyệt có điều kiện:
+ Kiểm tra xem có sinh viên tên x trong danh sách hay không
+ Liệt kê các sinh viên có điểm trung bình lớn hơn 7.5 và nhỏ hơn 8.0
+ Đếm số lượng số điện thoại của người tên x
+ Đếm số sinh viên lớp k36 học môn cấu trúc dữ liệu
+ Đếm số lượng số điện thoại có số đuôi là 123
+ Liệt kê những cuốn sách thể loại toán học
Và rất nhiều những ví dụ liên quan đến duyệt,nhưng mọi chuyện thực sự đơn giản chỉ là việc kết hợp các thông tin của phần tử để tạo ra điều kiện phức tạp hơn,còn thao tác thì chủ yếu là:liệt
kê,đếm,tìm kiếm
Ta nhận thấy thao tác duyệt trên danh sách liên kết đơn cũng tương tự như danh sách tổ chức bằng mảng
Các loại duyệt có điều kiện với danh sách liên kết đơn:
- Duyệt để liệt kê
- Duyệt để tìm kiếm
- Duyệt để đếm
Duyệt để liệt kê:liệt kê ở đây là hiển thị ra những thông tin theo yêu cầu của đề bài
Trang 38Ví dụ:
+Liệt kê sinh viên tức là hiển thị ra tất cả các thông tin về sinh viên như :tên,mã sinh viên,địa
chỉ,điểm,…
+Liệt kê tên của tất cả các sinh viên thì thông tin cần hiển thị là tên sinh viên
+Liệt kê điểm của tất cả các sinh viên thì thông tin cần hiển thị là điểm
Chú ý:các loại liệt kê ở trên là liệt kê không có điều kiện,chủ yếu chúng ta cần quan tâm là liệt kê có điều kiện,ví dụ:liệt kê các sinh viên tên “Nguyễn Văn A”,liệt kê các sinh viên có điểm số lớn hơn a,liệt kê các sinh viên quê ở “Bình Định”
Như vậy trong duyệt để liệt kê còn có thêm phần điều kiện,nhưng ta dễ thấy những điều kiện của đề bài sẽ dùng để kiểm tra thông tin của phần tử trong danh sách,nếu thông tin của phần tử phù hợp với điều kiện yêu cầu từ đề bài thì ta sẽ hiển thị thông tin của phần tử đúng với điều kiện đề bài
Trang 39- Điều kiện trong câu hỏi này là tên “Nguyễn Văn A” , yêu cầu đề bài là có hay không có =>ta
sẽ duyệt qua tất cả các sinh viên trong danh sách nếu có người tên “Nguyễn Văn A” thì kết quả trả về là true,ngược lại trả về false(khi ta duyệt qua tất cả các phần tử trong danh sách mà không tìm thấy người tên “Nguyễn Văn A” thì trả về kết quả là false)
*Thuật toán:
Gán p là phần tử đầu của danh sách
Lặp trong khi p khác rỗng
++ Nếu phần tử p có chứa tên là “Nguyễn Văn A” thì kết quả trả về là true,dừng lặp
++ Chuyển p sang phần tử ngay sau nó
Nếu không có sinh viên nào tên “Nguyễn Văn A” thì Trả về false
+ Tìm sinh viên có mã sinh viên là “10233011”,kết quả trả về phần tử chứa sinh viên
- Điều kiện ở đây là mã sinh viên ,yêu cầu đề bài trả về sinh viên tìm được =>ta sẽ xem trong danh sách có mã sinh viên “10233011” hay không,nếu có trả về phần tử sinh viên,ngược lại không tìm được thì trả về null.(khi ta duyệt qua tất cả các phần tử trong danh sách mà không tìm thấy người tên “10233011” thì trả về kết quả là false)
Gán p là phần tử đầu của danh sách sinh viên
Lặp trong khi p khác rỗng
++ Nếu phần tử p có chứa tên là “10233011” thì kết quả trả về là true,dừng lặp
++ Chuyển p sang phần tử ngay sau nó
Nếu không có sinh viên “Nguyễn Văn A” thì Trả về false
+ Tìm địa chỉ của sinh viên tên “Nguyễn Văn X”
- Điều kiện ở đây là tên “Nguyễn Văn X”,yêu cầu đề bài là tìm địa chỉ => ta sẽ duyệt qua tất cả các phần tử của danh sách,nếu gặp phần tử có tên “Nguyễn Văn X” thì ta lấy thông tin địa chỉ (kiểu string)của người này.Nếu không tìm được người nào có tên “Nguyễn Văn X” thì kết quả trả về là chuỗi rỗng
Trang 40Gán p là phần tử đầu của danh sách sinh viên
Duyệt lần lượt từng phần tử của danh sách sinh viên từ đầu đến cuối danh sách
++ Nếu phần tử p có chứa tên là “Nguyễn Văn X” thì kết quả trả về là địa chỉ của người này,dừng lặp
++ Chuyển p sang phần tử ngay sau nó
Nếu không có sinh viên nào tên “Nguyễn Văn X” thì Trả về chuỗi rỗng
+ Tìm số điện thoại của người tên X
+ Tìm tên của chủ số điện thoại 01263652236
Thuật toán (duyệt để tìm kiếm):
- Gán p là phần tử đầu của danh sách
- Lặp trong khi p khác rỗng
+ Nếu phần tử p có thông tin phù hợp với điều kiện của để bài thì trả về kết quả theo yêu cầu
đề bài
+ Chuyển p sang phần tử ngay sau nó
- (Không tìm được )trả về false,null,hoặc rỗng
Cài đặt:
Pascal:
function timkiem(dk:KieuDK):kiểu trả về;{điều kiện đề bài là dk}
var p:PTLK;{p thuộc kiểu phần tử liên kết}