妳的數組範圍設計太大了,尤其是這個數組的定義:c:array[1..50000,1..50000] of integer; 占了N多內存,程序根本無法運行,所以出現了錯誤216的提示 ,妳應該改為:c:array[1..500,1..500] of integer;才能執行完程序,壹旦妳用到所開的數組C程序馬上崩潰。
如果妳壹定要開array[1..50000,1..50000] 的話有三種辦法:第壹種是換臺超級電腦(玩笑話O(∩_∩)O哈哈~),第二種是用滾動數組,即定義小範圍數組,然後數組開到下限後,倒回[1,1]重新使用數組,此法適用於妳不再需要前面數組數據的情況。第三種是用指針鏈表,具體方法妳可以參照下面:
指針類型
11.1 指針
11.2 單鏈表
11.1 指針
指針是通過地址來訪問變量的壹種特殊的數據類型,屬於動態的數據結構,它可以在需要時產生,用完後則又可以取消或回收,以減少占用的內存空間。指針變量與其他類型的變量不同,它占有的不是數據,而是地址。
由於動態數據結構的變量是在程序執行過程中動態生成的,所以不能預先予以說明,無法預先給這些變量起名字,訪問時也無法通過名字直接輸出或顯示,而只能用指針得到其地址,然後間接訪問。
1、定義指針類型
在Turbo Pascal中,指針變量用來存放某個存儲單元的地址,即指針變量指向某個存儲單元。壹個指針變量僅能指向某壹種類型的存儲單元,這種數據類型是在指針類型的定義中確定的,稱為指針類型的基類型。指針類型定義如下:
類型名=^基類型名;
例如:type q=^integer;
var a,b,c:q;
說明:q是壹指向整型存儲單元的指針類型,其中"^"為指針符。a,b,c均定義為指針變量,分別可以指向壹個整型存儲單元。
上例也可用變量說明為:
var a,b,c:^integer;
指針也可以指向有結構的存儲單元。
例如:type person=record
name:string[10];
sex:(male,female);
age:20..70
end;
var pt:^person;
pt為指向記錄類型person的指針變量。
2、動態變量
應用壹個指針指向的動態存儲單元即動態變量的形式如下:
指針變量名^
例如:p^、q^、r^
指針變量p和它所指向的動態變量p^之間有如下關系:
以下語句把整數5存放到p所指向的動態變量p^中去:
p^:=5;
以下語句把p所指向的p^中的值賦給整型變量i:
i:=p^;
如果指針變量p並未指向任何存儲單元,則可用下列賦值語句:
p:=nil;
其中nil是保留字,表示“空”,相當於C語言裏面的null
3、對動態變量的操作
在Turob Pascal程序中,動態變量不能由var直接定義而是通過調用標準過程new建立的。過程形式為:
new(指針變量名);
如果有下列變量定義語句:
var p:^integer;
僅僅說明了p是壹個指向整型變量單元的指針變量,但這個整型單元並不存在,在指針變量p中還沒有具體的地址值。在程序中必須通過過程調用語句:new(p);才在內存中分配了壹個整型變量單元,並把這個單元的地址放在變量p中,壹個指針變量只能存放壹個地址。在同壹時間內壹個指針只能指向壹個變量單元。當程序再次執行new(p)時,又在內存中新建立了壹個整型變量單元,並把新單元的地址存放在p中,從而丟失了舊的變量單元的地址。
為了節省內存空間,對於壹些已經不使用的現有動態變量,應該使用標準過程dispose予以釋放。過程形式為:dispose(指針變量名);為new(指針變量名)的逆過程,其作用是釋放由指針變量所指向的動態變量的存儲單元。例如在用了new(p)後在調用dispose(p),則指針p所指向的動態變量被撤銷,內存空間還給系統,這時p的值為 nil。
4.需要註意之處
1、P與P^的區別
P是指向該動態變量的指針變量名,P^則稱為動態變量或標誌變量。P的值是P^的首地址,P^的值為與基類型相同的壹個值。
2、定義後及時分配存儲單元
定義了壹個指針變量後,並沒有為該指針分配動態存儲單元,此時的P的值無定義,調用P^則會產生運行錯誤。若想使該指針可用,可以對指針賦值,也可以通過NEW()過程分配存儲單元。
3、使用後及時收回存儲單元
指針使用後,不會自動歸還占用的存儲空間,應及時使用DISPOSE()過程來釋放P^所占用的存儲單元,以免浪費有限的存儲空間.
11.2 單鏈表
單鏈表的數據類型可定義如下:
type dlb=^node;
node=record
data:datatype;
next:dlb;
end;
例1 連續輸入壹序列整數,組成鏈表(並以動態的形式把它們記錄下來),當輸入的數為-1時,停止輸入,然後把輸入的整數按相反的順序輸出.
program lianbiao;
type link=^data;
data=record
num:integer;
next:link;
end;
var p,q:link;
i:integer;
begin
q:=nil;
readln(i);
while i<>-1 do
begin
new(p);
with p^ do
begin
num:=i;
next:=q;
end;
q:=p;
readln(i);
end;
while p<>nil do
begin
write(p^.num:6);
p:=p^.next;
end;
readln;
end.
(That's all,累呀~~~~)