請問一個指標的問題 |
答題得分者是:jest0024
|
aip999
初階會員 發表:10 回覆:63 積分:44 註冊:2002-03-29 發送簡訊給我 |
type pObj = ^TObj; TObj = record Next : PObj; ID : DWORD; Name : array[0..12] of char; ... end; var pObjList : pObj; //想要將pObjList中的兩個pObj交換 //是可以只把資料交換 //不過不是可以把pObj所指的記憶體位址跟pObj.Next所指的記憶體位址交換就可以了? //寫法不會寫@@" procedure Swap_pObj(var aObj1,aObj2:pObj); var T :pObj; begin // //請問一下,底下這邊應該要怎麼寫才對? //試了很多寫法 都不正確@@" T:=aObj1; aObj1:=aObj2; aObj2:=T; end; |
jest0024
高階會員 發表:11 回覆:310 積分:224 註冊:2002-11-24 發送簡訊給我 |
引言:這樣沒錯吧?問題在哪!? 學而時習之不亦樂乎!type pObj = ^TObj; TObj = record Next : PObj; ID : DWORD; Name : array[0..12] of char; ... end; var pObjList : pObj; //想要將pObjList中的兩個pObj交換 //是可以只把資料交換 //不過不是可以把pObj所指的記憶體位址跟pObj.Next所指的記憶體位址交換就可以了? //寫法不會寫@@" procedure Swap_pObj(var aObj1,aObj2:pObj); var T :pObj; begin // //請問一下,底下這邊應該要怎麼寫才對? //試了很多寫法 都不正確@@" T:=aObj1; aObj1:=aObj2; aObj2:=T; end; |
jest0024
高階會員 發表:11 回覆:310 積分:224 註冊:2002-11-24 發送簡訊給我 |
引言:學而時習之不亦樂乎!引言:這樣沒錯吧?問題在哪!? 或則?! procedure Swap_pObj(var Obj:pObj); var T :pObj; begin T:=Obj.Next; Obj.Next:=Obj; Obj:=T; end; 學而時習之不亦樂乎!type pObj = ^TObj; TObj = record Next : PObj; ID : DWORD; Name : array[0..12] of char; ... end; var pObjList : pObj; //想要將pObjList中的兩個pObj交換 //是可以只把資料交換 //不過不是可以把pObj所指的記憶體位址跟pObj.Next所指的記憶體位址交換就可以了? //寫法不會寫@@" procedure Swap_pObj(var aObj1,aObj2:pObj); var T :pObj; begin // //請問一下,底下這邊應該要怎麼寫才對? //試了很多寫法 都不正確@@" T:=aObj1; aObj1:=aObj2; aObj2:=T; end; |
aip999
初階會員 發表:10 回覆:63 積分:44 註冊:2002-03-29 發送簡訊給我 |
引言://我用這樣把一個pobj用pObjList串起來 procedure AddObj(var aList,aObj:pObj); begin if aList=nil then begin aList:=aObj end else AddGobj(aList^.Next,aObj); end; //然後想排序那個pObjList所以想寫個把pObjList中的某兩個pObj對調的.. //不過都會出錯... //引言:這樣沒錯吧?問題在哪!? 學而時習之不亦樂乎!type pObj = ^TObj; TObj = record Next : PObj; ID : DWORD; Name : array[0..12] of char; ... end; var pObjList : pObj; //想要將pObjList中的兩個pObj交換 //是可以只把資料交換 //不過不是可以把pObj所指的記憶體位址跟pObj.Next所指的記憶體位址交換就可以了? //寫法不會寫@@" procedure Swap_pObj(var aObj1,aObj2:pObj); var T :pObj; begin // //請問一下,底下這邊應該要怎麼寫才對? //試了很多寫法 都不正確@@" T:=aObj1; aObj1:=aObj2; aObj2:=T; end; |
jest0024
高階會員 發表:11 回覆:310 積分:224 註冊:2002-11-24 發送簡訊給我 |
|
aip999
初階會員 發表:10 回覆:63 積分:44 註冊:2002-03-29 發送簡訊給我 |
引言: 試試這個方法 procedure Swap(var Obj1,Obj2:PObj); var p:PObj; t:TObj; begin //互換記憶體原始位置 t:=Obj1^; Obj1^:=Obj2^ Obj2^:=t; //互換Next指標 p:=Obj1^.Next; Obj1^.Next:=Obj2^.Next; Obj2^.Next:=p; end; 學而時習之不亦樂乎!謝謝你得回應^^ 不過還有點怪怪的說 我把Code貼上來 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type pObj = ^TObj; TObj = record Next : PObj; X,Y : Byte; ID : DWORD; end; TForm1 = class(TForm) ListBox1: TListBox; btAdd: TButton; btSwap: TButton; procedure btAddClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure btSwapClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; pObjList : pObj=nil; implementation {$R *.dfm} function NewGObj:pObj; begin New(Result); Result^.Next := nil; end; procedure AddObj(var aList,aObj:pObj); begin if aList=nil then begin aList:=aObj end else Addobj(aList^.Next,aObj); end; procedure ClearObjList(var aList:pObj); var P: pObj; begin P := aList; while aList <> nil do begin aList := aList^.Next; Dispose(P); P := aList; end; end; procedure PrintList; var P: pObj; begin Form1.ListBox1.Clear; P := pObjList; while P <> nil do begin Form1.ListBox1.Items.Add(IntToStr(P^.ID)); P:=P^.Next; end; end; procedure Swap(var Obj1,Obj2:PObj); var p:PObj; t:TObj; begin //互換記憶體原始位置 t:=Obj1^; Obj1^:=Obj2^; Obj2^:=t; //互換Next指標 p:=Obj1^.Next; Obj1^.Next:=Obj2^.Next; Obj2^.Next:=p; end; procedure TForm1.btAddClick(Sender: TObject); var i : integer; P : pObj; begin for i:=0 to 9 do begin P:=NewGObj; P.ID:=random(100); Addobj(pObjList,P); end; PrintList; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin ClearObjList(pObjList); end; procedure TForm1.btSwapClick(Sender: TObject); var i,T : integer; begin T := GetTickCount; for i:=0 to 100000 do begin Swap(pObjList,pObjList.Next);//<==這樣會有問題0跟1對換 // Swap(pObjList,pObjList.Next.Next);//<==這樣就不會0跟2對換 end; Caption:=Caption ',' IntToStr(GetTickCount-T); end; end. |
jest0024
高階會員 發表:11 回覆:310 積分:224 註冊:2002-11-24 發送簡訊給我 |
|
aip999
初階會員 發表:10 回覆:63 積分:44 註冊:2002-03-29 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |