大家帮我看看这个指针数组怎么用错了?

Allblus 2005-04-17 08:42:01
type //定义指针变量
pReorder=^recordQQ;
recordQQ=record
Xuhao:integer;
next:pReorder;
end;
-------------------------
var
ReorderArray:array of pReorder;//定义指针数组链表
MaxEnter:integer;
-------------------------
procedure TForm1.QQspeakNum;
var
i:integer;
begin
setlength(ReorderArray,MaxEnter+1);
for i:= 0 to MaxEnter do //首先初始化指针数组链表;
begin
new(ReorderArray[i]);
ReorderArray[i]^.next:=nil;
end;
for i:=0 to QQcount -1 do //为指针数组链表赋值
begin
new(ReorderArray[i]^.next);
ReorderArray[i]:=ReorderArray[i]^.next;
ReorderArray[i]^.Xuhao:=i;
ReorderArray[i]^.next :=nil;
end;
end;
------------------------------
for i:= MaxEnter downto 0 do
begin
while ReorderArray[i].next <> nil do
begin
//这中间的语句竟然没有执行。 ?????????
end;
end;
------------------------------
for i:= 0 to MaxEnter do //FormDestroy中释放内存
begin
while ReorderArray[i]^.next <> nil do
begin
dispose(ReorderArray[i]);
ReorderArray[i]:=ReorderArray[i]^.next;
end;
end;

不知道以上代码错在哪里?望高手指正,谢谢。
...全文
164 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Delphi1985 2005-04-19
  • 打赏
  • 举报
回复
MaxEnter+1的值是多少啊?
Allblus 2005-04-18
  • 打赏
  • 举报
回复

只是我用new分配指针内容后没有释放,不过程序也没有出错。
这样释放指针数组链表为什么错了:
var
i:integer;
begin
for i:= 0 to MaxEnter do
begin
Refi:=ReorderArray[i]^.next ;
while Refi <> nil do
begin
ReorderArray[i]:=Refi^.next;
dispose(Refi);
Refi:=ReorderArray[i]^.next; ////这里错了????
end;
dispose(ReorderArray[i]);
end;
end;
Allblus 2005-04-18
  • 打赏
  • 举报
回复
搞定了:P
addua 2005-04-18
  • 打赏
  • 举报
回复
没必要用指针吧,
Allblus 2005-04-18
  • 打赏
  • 举报
回复
UP
new分配指针内容后不释放可以嗎?
herman~~ 2005-04-17
  • 打赏
  • 举报
回复
学习
Rail100 2005-04-17
  • 打赏
  • 举报
回复
废话,语句1执行了才怪。
既然你的数组ReorderArray[i].next一直为nil,那么while ReorderArray[i].next <> nil do一执行就跳出循环
ntn115 2005-04-17
  • 打赏
  • 举报
回复
mark


g961681 2005-04-17
  • 打赏
  • 举报
回复
释放的问题,我没去解决了
Allblus 2005-04-17
  • 打赏
  • 举报
回复
調用了new可以不調用dispose嗎?
Allblus 2005-04-17
  • 打赏
  • 举报
回复
謝謝,我看看
g961681 2005-04-17
  • 打赏
  • 举报
回复
在我这边调试通过。
大致的意思是,
在窗体创建的时候,创建链。
按button2,取链中所有XuHao数据。放到edit1中!
g961681 2005-04-17
  • 打赏
  • 举报
回复
给你调试了一个非叔祖的qq链。你看看
unit Main;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
PQQRecord = ^TQQRecord;
TQQRecord = record
Xuhao: Integer;
Next: PQQRecord;
end;
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
//ReorderArray: array of pReorder;//定义指针数组链表
FQQS: PQQRecord;
//MaxEnter: Integer;
QQCount: Integer;
public
procedure QQspeakNum;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.QQspeakNum;
var
i: Integer;
pQQ: PQQRecord;
pNewQQ: PQQRecord;
begin
//setlength(ReorderArray,MaxEnter+1);
//for i:= 0 to MaxEnter do //首先初始化指针数组链表;
//begin
// new(ReorderArray[i]);
// ReorderArray[i]^.next:=nil;
//end;
for i := 0 to QQcount -1 do //为指针数组链表赋值
begin
if FQQS = nil then
begin
New(FQQS);
FQQS.Xuhao := i;
FQQS.Next := nil;
Continue;
end;
pQQ := FQQS;
while (pQQ <> nil) and (pQQ.Next <> nil) do
pQQ := pQQ.Next;
new(pNewQQ);
pNewQQ.Xuhao := i;
pNewQQ.next := nil;
pQQ.Next := pNewQQ;
end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
//for i:= MaxEnter downto 0 do
//begin
// while ReorderArray[i].next <> nil do
// begin
// //这中间的语句竟然没有执行。 ?????????
// end;
//end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
p: PQQRecord;
begin
Edit1.Text := '';
p := FQQS;
while p <> nil do
begin
Edit1.Text := Edit1.Text + IntToStr(p^.Xuhao);
p := p^.next;
end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
i: Integer;
begin
//for i:= 0 to MaxEnter do //FormDestroy中释3;放内存
//begin
// while ReorderArray[i]^.next <> nil do
// begin
// dispose(ReorderArray[i]);
// ReorderArray[i]:=ReorderArray[i]^.next;
// end;
//end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
//MaxEnter := 5;
QQCount := 3;
QQspeakNum;
end;

end.
Allblus 2005-04-17
  • 打赏
  • 举报
回复
for i:= 0 to MaxEnter do //首先初始化指针数组链表;
begin
new(ReorderArray[i]); 这应该是必要的吧,定义的头节点
ReorderArray[i]^.next:=nil;
end;

for i:=0 to QQcount -1 do //为指针数组链表赋值
begin
new(ReorderArray[A[i]]^.next); 为数组的相应项添加链表 这里错了吗????
ReorderArray[A[i]]:=ReorderArray[A[i]]^.next;
ReorderArray[A[i]]^.Xuhao:=A[i];
ReorderArray[A[i]]^.next :=nil;
end;
g961681 2005-04-17
  • 打赏
  • 举报
回复
两个new有问题!
Allblus 2005-04-17
  • 打赏
  • 举报
回复
我的目的是用数组链表来排序例如:待排序的数组A[]

i 0 1 2 3 4 5 6

A[i] 2 3 3 5 2 4 1

找出A[i]中最大的即 MaxEnter:= 5

建立数组链表:setlength(ReorderArray,MaxEnter+1);
ReorderArray[2]--〉0--〉4--〉nil
ReorderArray[3]--〉1--〉2--〉nil
ReorderArray[5]--〉3--〉nil
ReorderArray[4]--〉5--〉nil
ReorderArray[1]--〉6--〉nil

ReorderArray[0]--〉nil
这样 for i:= MaxEnter downto 0 do
begin
while ReorderArray[i].next <> nil do
begin
语句1 //读取ReorderArray[i].Xuhao就把数组A[]中的元素排序出来了即:A[3] 〉A[5]……
end;
end;

这样对数组一次扫描就可以按升序或降序排出来了,时间复杂度为O(n)。应该算是快速排序吧。
我在弄数组链表时“语句1” 就没执行,不知道错在哪里?




5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧