IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> списки ООП
ssk
сообщение 14.05.2006 11:05
Сообщение #1





Группа: Пользователи
Сообщений: 2
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Кому не трудно помогите, нужно несколько процедур:
1.Для однонапрвленного списка
а) найти наибольший элемент
б) удалить все простые числа
в)найти кол-во четных чисел
г) Вставить новый элемент между двумя равными по значению
2.Для двунаправленного списка
а)найти наибольший элемент(исп наследовательный метод)
б)найти количество четных (исп наследовательный метод)
Выручите пожалуйста, много других еще проблем а голова уже совсем не варит mega_chok.gif

Реализация списка:
Код
type list=^elem;
     elem=record
          inf:integer;
          next,pred:list;
          end;

     sp=object
        l:list;
        procedure init;
        procedure add(x:integer; p: list);
        procedure del(p:list);
        function locate(x:integer):list;
    function retrieve(p:list):integer;
        function end_:list;
        function first:list;
        procedure print;
        end;

    

     sp2=object
        l:list;
        procedure init;
        procedure add(x:integer; p: list);
        procedure del(p:list);
        function locate(x:integer):list;
    function retrieve(p:list):integer;
        function end_:list;
        function first:list;
        procedure print;
        end;

procedure sp.init;
          begin
          new(l);
          l^.inf:=0;
          l^.next:=nil;
          end;

procedure sp.add;
          var t:list;
              begin
              new(p^.next);
              p^.next^.info:=x;
              p^.next^.next:=t;
              end;

procedure sp.del;
begin
p^.next:=p^.next^.next;
end;

function sp.locate;
var p,q:list
begin
p:=l; q:=nil;
while p^.next<>nil do begin
    if p^.inf=x then q:=p;
    p:=p^.next;
    end;
locate:=q;
end;

function sp.retrieve;
var q:list;begin
q:=l;Retrieve:=0;
while q^.next<>nil do begin
    if q^.next=p then Retrieve:=q^.inf;
    q:=q^.next;
    end;
end;

function sp.end_;
var q:list;
begin
q:=l;
while q^.next<> nil do q:=q^.next;
end_:=q;
end;

function sp.first;
begin
first:=l^.next;
end

prosedure sp.print;
var q:list;
begin
q:=l;
while q<>nil do begin
        writeln(q^.info);
        q:=q^.next;
        end;
end;


procedure sp2.init;
          begin
          new(l1);
          l1^.inf:=0;
          l1^.next:=l1;
          l1^.pred:=l1;
          end;

function sp2.locate;
         var p,q:list;
             begin
             p:=l1^.next;
             q:=nil;
             while p<>l1 do begin
                            if p^.inf=x then q:=p;
                            p:=p^.next;
                            end;
             Nmesto:=q;
             end;

rocedure sp2.print;
          var p:list;
              begin
              writeln('Vivod polu4ennogo spiska');
              p:=l1^.next;
              while p<>l1 do begin
                             write(p^.inf,'  ');
                             p:=p^.next;
                             end;
              writeln;
              end;

var s:sp;
  x:integer;
begin
sp.init;
readln (x);
while x <> 0 do begin
        sp.add(x,sp.end_);
        readl(x);
        end;
writeln(sp.retrieve(sp.first));
sp.print;
end.



 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 14.05.2006 12:21
Сообщение #2


Гость






Ну, во-первых, где ты тут увидел реализацию списка? Я же приводил ООП-реализацию в теме
"FAQ: Объектно-ориентированное Программирование" ...

Для односвязных списков твое задание решается вот так:
type
ttype = integer;

ptitem = ^titem;
titem = object
info: ttype;
next: ptitem;

constructor init(x: ttype; nxt: ptitem);
destructor done;
end;

constructor titem.init(x: ttype; nxt: ptitem);
begin
info := x;
next := nxt
end;
destructor titem.done;
begin end;


type
tlist = object
first, last: ptitem;

constructor init;
destructor done;

procedure invert;

procedure append(x: ttype);
procedure insert(x: ttype);

function present(x: ttype): boolean;
function find(x: ttype): ptitem;
function remove(x: ttype): integer;

procedure insert_before(p: ptitem;
x: ttype);
procedure insert_after(p: ptitem;
x: ttype);

function empty: boolean;
procedure print;

private
procedure remove_item(var p: ptitem);
end;


constructor tlist.init;
begin
first := nil; last := nil;
end;
destructor tlist.done;
var p, T: ptitem;
begin
p := first;
while assigned(p) do begin
T := p;
p := p^.next;
dispose(T, done)
end;
end;

function tlist.empty: boolean;
begin
empty := not assigned(first)
end;

{
insert new item to the start of list
}
procedure tlist.insert(x: ttype);
var p: ptitem;
begin
new(p, init(x, first));
if empty then last := p;
first := p
end;

{
append new item to the end of list
}
procedure tlist.append(x: ttype);
var p: ptitem;
begin
new(p, init(x, nil));
if empty then first := p
else last^.next := p;
last := p
end;

procedure tlist.print;
var p: ptitem;
begin
p := first;
write('(list) <');
while assigned(p) do begin
write(p^.info, ' ');
p := p^.next
end;
writeln('>')
end;

procedure tlist.invert;
var p, T: ptitem;
begin
if empty or (not assigned(first^.next)) then exit
else begin
p := nil; last := first;
while assigned(first) do begin
T := first^.next;
first^.next := p;
p := first;
first := T
end;
first := p
end
end;

procedure tlist.insert_before(p: ptitem;
x: ttype);
var T: ptitem;
begin
new(T, init(p^.info, p^.next));
p^.next := T;
p^.info := x
end;
procedure tlist.insert_after(p: ptitem;
x: ttype);
var T: ptitem;
begin
new(T, init(x, p^.next));
p^.next := T
end;

function tlist.find(x: ttype): ptitem;
var
p: ptitem;
ok: boolean;
begin
p := first;
ok := true;
while assigned(p) and ok do
if p^.info = x then ok := false
else p := p^.next;

find := p
end;

function tlist.present(x: ttype): boolean;
begin
present := (find(x) <> nil)
end;


function tlist.remove(x: ttype): integer;
var
T: ptitem;
count: integer;
begin
count := 0;
repeat
T := find(x);
if assigned(T) then begin
remove_item(T);
inc(count)
end
until (T = nil);
remove := count
end;

procedure tlist.remove_item(var p: ptitem);
var r: ptitem;
begin
if p = first then
if first = last then begin
dispose(p);
p := nil; first := nil; last := nil;
exit;
end
else begin
r := first;
first := first^.next;
dispose( r );
p := first;
exit;
end;

r := first;
while r^.next <> p do r := r^.next;
if p = last then last := r;

r^.next := p^.next;
dispose(p);
p := r^.next;

end;

function isPrime(X: integer): boolean;
var i: integer;
begin
isPrime := false;
for i := 2 to trunc(sqrt(x)) do
if x mod i = 0 then exit;
isPrime := true
end;

var
lst_1: tlist;
p: ptitem;
X, count: integer;

begin
lst_1.init;
repeat
readln(X);
if X <> 0 then lst_1.append(X);
until X = 0;
lst_1.print;

{ #1 }
p := lst_1.first; X := - maxInt;
while p <> nil do begin

if p^.info > X then X := p^.info;
p := p^.next;

end;
writeln('max = ', X);

{ #2 }
p := lst_1.first;
while p <> nil do begin

if isPrime(p^.info) then
lst_1.remove_item(p)
else p := p^.next;

end;
lst_1.print;

{ #3 }
p := lst_1.first;
count := 0;
while p <> nil do begin
if not odd(p^.info) then inc(count);
p := p^.next;
end;
writeln(count, ' even numbers in list...');

{ #4 }
p := lst_1.first;
X := 101;
if p <> nil then
while p^.next <> nil do begin

if p^.info = p^.next^.info then lst_1.insert_after(p, X);
p := p^.next;

end;
lst_1.print;

lst_1.done;
end.
(просто оформи нужные фрагменты программы как методы класса TList)

С двусвязными попробуй разобраться сам...
 К началу страницы 
+ Ответить 
ssk
сообщение 14.05.2006 12:41
Сообщение #3





Группа: Пользователи
Сообщений: 2
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


О, огромное спасибо good.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 28.03.2024 13:17
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"