DỮ LIỆU KIỂU CON TRỎ - Pdf 70

DỮ LIỆU KIỂU CON TRỎ
I. KHAI BÁO
Type
<Tên kiểu con trỏ> = ^ <Kiểu của biến động>;
Var
<Tên biến>:<Tên kiểu con trỏ>;
Ví dụ 1:
Type
TroNguyen : ^integer;
Var
p, q: TroNguyen;
Sau khai báo này các biến p và q là các biến con trỏ có thể trỏ đến các biến động có
kiểu integer. Chương trình sẽ cấp phát 4 byte cho mỗi biến con trỏ. Còn vùng nhớ của
các biến động chưa được cấp phát.
Ví dụ 2:
Type
TroSv = ^ Sinhvien;
Sinhvien = Record
Hoten: String[20];
Diem: real;
Tiep: TroSv;
End;
Var
p: TroSv;
Trong ví dụ này, p là biến trỏ có thể trỏ đến các bản ghi có kiểu Sinhvien, trong
bản ghi này lại có trường Tiep là một biến trỏ có thể trỏ đến biến động khác cũng có
kiểu Sinhvien.
II. LÀM VIỆC VỚI BIẾN ĐỘNG
2.1. Cấp phát vùng nhớ
Dùng thủ tục New theo cú pháp:
New(<biến trỏ>);

trong danh sách. Danh sách dạng này được gọi là danh sách liên kết đơn.
3.3. Các thao tác thường gặp trên danh sách liên kết đơn
Trong phần này chúng ta giả thiết rằng mỗi nút trong danh sách có hai trường: trường
Info (lưu nội dung của biến động) và trường Next (lưu địa chỉ của nút tiếp theo). ta có
khai báo danh sách như sau
Type TroNut = ^Nut;
Nut = Record
Info: data; {data là kiểu dữ liệu đã định nghĩa trước}
Next: TroNut;
End;
Var First:TroNut;
3.3.1. Khởi tạo danh sách
First:=Nil;
3.3.2. Bổ sung một nút vào đầu danh sách
{1. Tạo ra nút mới}
New(p);
p^.Info:=X;
{2. Bổ sung vào đầu danh sách}
p^.Next:=First;
First:=p;
3.3.3. Bổ sung một nút vào cuối danh sách
Xuất phát danh sách không có nút nào cả. Nút mới thêm vào sẽ nằm cuối danh sách. Khi đó ta cần hai biến
con trỏ First và Last lần lượt trỏ đến các nút đầu và cuối danh sách.
Procedure Khoitao;
var p: TroNut;
Begin
First:= nil; Last:= nil;
While <còn thêm nút mới vào danh sách> do
Begin
New(p);

q^.next := nil;
first := q;
end
else
begin
q^.next:= p^.next;
p^.next:= q;
end;
End;
3.3.6. Xoá một nút khỏi danh sách
Thủ tục sau thực hiện việc xóa một nút trỏ bởi p ra khỏi danh sách.
Procedure Xoa(p);
Var q: TroNut;
Begin
if First = nil then
exit;
if p = First then
First := First^.next
else
begin
q:= First;
While q^.next <> p do
q:= q^.next;
q^.next:= p^.next;
end;
Dispose(p);
End;
BÀI TẬP MẪU
Bài tập 9.1: Trong các bài tập từ 9.1 đến 9.4, dùng danh sách liên kết đơn lưu một dãy
số nguyên. Nút đầu tiên trong danh sách được trỏ bởi First. Cho khai báo mỗi nút trong

readln(n);
{$I+}
kq:= IOResult=0;
if kq then
begin
new(p);
p^.Giatri:=n;
p^.Tiep:=nil;
if first = nil then
first:= p;
else
last^.Tiep:= p;
last:=p;
end;
until not kq;
end;
Procedure In_so_duong;
Var
p: Tronut;
begin
p:= first;
while p <> nil do
begin
if p^.Giatri > 0 then
write(p^.Giatri:8);
p:=p^.Tiep;
end;
end;
Begin
Mark(p);

a. Procedure Insert(var first: TroNut; m: integer) thực hiện việc bổ sung
một nút vào danh sách sao cho tính tăng dần được bảo toàn.
Procedure Insert(var first: TroNut; m: integer);
Var
p,q: Tronut;
begin
new(p);
p^.Giatri:= m;
if (first = nil) or (first^.Giatri < m ) then
begin
p^.Tiep:=nil;
first:= p;
end
else
begin
q:= first;
while (q^.Tiep <> nil) and ((q^.Tiep)^.Giatri < m) do
q:= q^.Tiep;
p^.Tiep:= q^.tiep;
q^.Tiep:= p;
end;
end;
b. Procedure InitList thực hiện việc tạo danh sách có tính chất trên bằng cách
nhập dữ liệu từ bàn phím và quá trinh nhập dừng khi nhấn phím ESC (yêu cầu: sử dụng
thủ tục Insert).
Procedure InitList;
Var
m: integer;
Begin
first:= nil;

while (p <> nil) and (p^.Giatri = 0) do
begin
q^.Tiep:= p^.Tiep;
dispose(p);
p:= q^.Tiep;
end;
end;
e. Function TroMax(First: TroNut): TroNut trả về địa chỉ của nút đầu tiên
đạt giá trị lớn nhất (tính từ đầu danh sách, nếu có, ngược lại hàm trả về giá trị Nil).
Function Tromax(First: TroNut);
var
p.q: Tronut;
m:integer;
begin
if first = nil then
TroMax:= nil
else
begin
p:= first;
m:= p^.Giatri;
q:= p^.Tiep;
while (q <> nil) do
begin
if q^.Giatri > m then
begin
p:= q;
m:= p^.Giatri;
end;
q:= q^.Tiep;
end;


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status