singlepost

Ребят!помогите решить задачку со списками. << На главную или назад  

Задача,в общем-то,не сложная,но косячит немного…
Условие задачи:
Задача-считалка:В кругу стоят n детей.Среди них выбирается водящий.Водящим считается тот,кто останется последним.
Используются кольцевые однонаправленные списки.

uses crt;

type ExO=^sp;
sp=record
data:integer;
next:ExO;
end;

var sBegin,sEnd,Buf:ExO;i,j,x,n:integer;

{процедура вывода списка на экран}
procedure OutSp(sBegin:ExO);
var px:ExO;
begin
writeln('================');
repeat
write(sBegin^.data:4);
sBegin:=sBegin^.next;
until sBegin=sEnd^.next;
writeln;
writeln('================');
end;

{процедура Удаления K-ого элемента.Key – указ на начало}
procedure DelSp(var Key:ExO;k:integer);
var dx,px:ExO;{px-элемент списка,dx-предидущ элемент}
begin
px:=Key;
repeat{определяем К-ый элемент}
for i:=1 to k do begin
dx:=px;{элемент предшествующий К-му}
px:=px^.next;{сам элемент}
end;

dx^.next:=px^.next;{Разрываем связи К-ого элемента}
px:=dx;
until px^.next=px;{??? Условие выхода-если элемент ссылается сам на себя,т.е.остался один}
dispose(px);
end;

procedure FormSp(var sBegin:ExO);
begin
write('4islo:');
readln(x);
if x<>0 thenbegin
new(sBegin);
sBegin^.next:=nil;
sBegin^.data:=x;
sEnd:=sBegin;
end;
end;

procedure AddComp(var sEnd:ExO);
beginwrite('4islo:');
readln(x);
while x<>0 do begin
new(buf);
buf^.next:=nil;
sEnd^.next:=buf;
sEnd:=buf;
sEnd^.data:=x;
write('4islo:');
readln(x);
end;
dispose(buf);
sEnd^.next:=sBegin;
end;

begin
clrscr;
write('Vvedite kol-vo slov:');readln(n);
FormSp(sBegin);
AddComp(sEnd);
writeln('****Spisok****');
OutSp(sBegin);

DelSp(sBegin,n);

OutSp(sEnd);

readkey;
end.

Элементы списка-целые числа(это,в общем-то,не важно),условие заканчивания ввода-0.

вот основная процедурка-то у меня и касячит:
procedure DelSp(var Key:ExO;k:integer);
var dx,px:ExO;{px-элемент списка,dx-предидущ элемент}
begin
px:=Key;
repeat{определяем К-ый элемент}
for i:=1 to k do begin
dx:=px;{элемент предшествующий К-му}
px:=px^.next;{сам элемент}
end;

dx^.next:=px^.next;{Разрываем связи К-ого элемента}
px:=dx;
until px^.next=px;{??? Условие выхода-если элемент ссылается сам на себя,т.е.остался один}
dispose(px);
end;

4 ответов в теме “Ребят!помогите решить задачку со списками.”

  1. 2
    Александр Рулёв ответил:

    так это она и задала)

  2. 1
    Алексей Башкиров ответил:

    фига се… видела бы Зонова С.А….

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.