队列的实现(pascal语言)

dawnhorizon 2002-08-02 06:51:47
先是在unit中定义结构和实现过程:


unit linked;

interface
type
queueptr=^queuenode;
queuenode=record
data:real;
next:queueptr;
end;
linkedquetp=record
front,rear:queueptr;
end;
procedure init_linkedque(var q:linkedquetp);
procedure en_linkedque(var q:linkedquetp;x:real);
procedure dl_linkedque(var q:linkedquetp);
procedure output(var q:linkedquetp);


implementation

procedure init_linkedque(var q:linkedquetp);
begin
new(q.front);
q.rear:=q.front;
q.front^.next:=nil;
end;

procedure en_linkedque(var q:linkedquetp;x:real);
var
p:queueptr;
begin
new(p);
p^.data:=x;
p^.next:=nil; //新的尾结点
q.rear^.next:=p;
q.rear:=p; //插入队尾
end;

procedure dl_linkedque(var q:linkedquetp);
var
s:queueptr;
x:real;
begin
if q.front=q.rear then writeln('NULL') else
begin
s:=q.front^.next;
q.front^.next:=s^.next; //删去队头元素,第一个结点为头结点,不可删
if s^.next=nil then q.rear:=q.front;
x:=s^.data;
dispose(s);
writeln(x);
end;
end;

procedure output(var q:linkedquetp);
var
last:queueptr;
begin
last:=q.front;
while last^.next<>nil do
begin
write(last^.data:6:1);
last^.next:=last^.next^.next;
end;
writeln;
end;

end.



然后试图在主程序中调用:
program Queue;

{$APPTYPE CONSOLE}

uses
SysUtils,
linked in 'linked.pas';
var
qu:linkedquetp;
begin
{ TODO -oUser -cConsole Main : Insert code here }
init_linkedque(qu);
en_linkedque(qu,7);
output(qu);
dl_linkedque(qu);
output(qu);
readln;
readln;
end.


但出错了,不知为何?
...全文
71 点赞 收藏 3
写回复
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzwu 2002-08-03

先向你指出一个明显的错误:

你为队列q设立了front和rear两个指示器,这是对的,但统观你的整个程序,竟没有一处修改过front的值! 这样,指针front的设立,不就等于白设了吗?

当队列头上取去一个元素后,就必须将front及时修改其位置,即后移一节点.

回复
devajasy 2002-08-02
procedure init_linkedque(var q:linkedquetp);
begin
1 new(q.front);
2 q.rear:=q.front;
3 q.front^.next:=nil;
end;
这是有问题的。你应该是在函数调用外就new一个q,然后作为参数传进来。比如在主函数里在create队列是用new(p).然后在调用 init_linkedque(p)
所以你的这个init函数是没有第一行的。这样说不知道你明白没有。

还有你的new(q.front)是错误的,在main函数里是new(p) p为linkedquetp
回复
dawnhorizon 2002-08-02
ft,牛人众多的地方没一个人回答,郁闷四了!
回复
发动态
发帖子
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
社区公告
暂无公告