PDA

View Full Version : giúp với



ptdx3
29-06-2004, 04:11
bài thuộc danh sách liên kết này sai ở đâu vậy?yêu cầu là viết chương trình con nhập và xuất số nguyên.Danh sách liên kết này mình không hiểu lắm bạn co thể chỉ mình những chổ trọng tâm,cần chú ý và kinh nghiệm của bạn không .
CÁM ƠN.

type pt=^ds;
ds=record
sn:integer;
link:pt;
end;
var head:pt;x:ds;
i,n:integer;
procedure nhap(var head:pt;x:ds);
var p:pt;
begin
new(p);
while p<>nil do
begin
p^.sn:=x.sn;
p:=p^.link;
end;
end.
begin
write('nhap vao so phan tu:');readln(n);
head:=nil;
for i:=1 to n do
with x do
begin
write('nhap so nguyen:');readln(sn);
nhap(head;x);
write(x.sn,' ');
end;
readln;
end.

Huynh Phong
29-06-2004, 09:14
cho Head := p; Ok!..................

ptdx3
03-07-2004, 04:37
bài thuộc danh sách liên kết này sai ở đâu vậy?yêu cầu là viết chương trình con nhập và xuất số nguyên.Danh sách liên kết này mình không hiểu lắm bạn co thể chỉ mình những chổ trọng tâm,cần chú ý và kinh nghiệm của bạn không .
CÁM ƠN.

type pt=^ds;
ds=record
sn:integer;
link:pt;
end;
var head:pt;x:ds;
i,n:integer;
procedure nhap(var head:pt;x:ds);
var p:pt;
begin
new(p);
while p<>nil do
begin
p^.sn:=x.sn;
p:=p^.link;
end;
end.
begin
write('nhap vao so phan tu:');readln(n);
head:=nil;
for i:=1 to n do
with x do
begin
write('nhap so nguyen:');readln(sn);
nhap(head;x);
write(x.sn,' ');
end;
readln;
end.




sao lại cần head:=p;

Huynh Phong
04-07-2004, 09:24
{ ====Chương trình này cũng có chức năng tương tự, bạn hãy chạy xem ===}
Uses CRT;
Type
       Integers =Integer;
       Pt = ^Ds;
       Ds = Record
                     sn: integers;
                     Link:Pt;
              end; { end record }
Var
       Head, Linker1, Linker2: Pt;
       IoHead : Boolean;
       x,y      : Byte;
       Ch      : Char;
{ ===================== }
Function MemHeap: Boolean; { thử xem Heap còn đủ cho thủ tục New(Head) hay không }
begin
       if MemAvail>=SizeOf(Head)+SizeOf(Integers) then MemHeap := True else
       MemHeap := False;
end;
{ ==================== }
Procedure NhapSoNguyen(var IoMem:Boolean); Var I: Integers;
begin
       Readln(I);
       if MemHeap then
       begin
              New(Head);
              Head^.Sn := I; Head^.Link := Nil;
              if Linker1<>Nil then Linker2^.Link := Head else Linker1:=Head;
              Linker2 := Head;
              IoMem := True;
       end else
       begin
              Writeln;Write('Khong con du bo nho cho thu tuc New(Head), OK!...');
              IoMem := False;
       end;
end;
{ ==================== }
begin
       ClrScr; Linker1 := Nil; Linker2 := Nil; IoHead := True;
       Writeln('Chuong trinh the hien cac so nguyen dung thu tuc New()...');
       Writeln('Hay nhap so nguyen: '); X := WhereX; Y := WhereY;
       While IoHead do
       begin
              Gotoxy(X,Y); ClrEol; NhapsoNguyen(IoHead);
              if IoHead then
              begin
                     Write('N hap tiep (Y/N)?');
                     Ch := Readkey; Ch := UpCase(Ch);
                     if Not (Ch in ['Y'] ) then IoHead := False else
                     Gotoxy(0 1,WhereY); ClrEol; { xoa cuoi dong }
              end;
       end; { end While }
       { ================== cho hien lai danh sach vua nhap }
       Writeln; Writeln('Danh sach cac so nguyen ma ban vua nhap:');
       Head := Linker1;
       While Head <>Nil do
       begin
              Write(Head^.Sn,' '); Head := Head^.Link;
       end;
       Writeln; Write('An phim bat ki de chuong trinh ket thuc...'); Readkey;
end.
{ ========================= }
Chú ý :
       Bạn khai báo Head^.sn là integer, cho nên phải nhập sn trong giới hạn là Low(Head^.Sn)...High(Head^.Sn), nghĩa là từ -32768..32767 thì chương trình mới chạy đúng. Nếu muốn nhập số cao hơn thì phải khai báo là Real hoặc LongInt (số nguyên dương).
       Bạn hãy dùng thủ tục Mark() và Release() để giải phóng hết ô nhớ sau khi kết thúc chương trình.
       Đây chỉ là danh sách liên kết 1 chiều, nhưng lại theo kiểu FIFO, cái nào nhập vào trước thì lấy ra trước. Tôi còn 1 chiêu nữa thể hiện danh sách 2 chiều, nghĩa là có thể cho hiện ra số đứng trước hoặc số đứng sau nó. Ví dụ:
...... 10 11 12 .....
Bạn đang ở tại vị trí con số 11, bây giờ tôi ấn phím Left, nó hiện ra con 10 hoặc tôi ấn phím right, nó lại hiện ra con 12.
Cái này thì cũng dễ thôi, bạn khai báo trong record:
Pt = ^Ds;
Ds = Record
              Sn : Integers;
              Next : Pt;
              Back : Pt;
       end;
Và sau đó, thể hiện liên kết bằng:
       New(Head);
       Head^.Sn := I;
       Head^.Next := Nil;
       Head^.Back := Linker2;
       if Linker1<>Nil then....
Đoạn sau cũng giống như trên.
{ ===============================}
Chương trình tôi chưa Test thử, nếu có chỗ nào sai thì bạn ngâm kíu chỉnh lại nhé...