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

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

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

 
 Ответить  Открыть новую тему 
> Списки, Не получается никак!
Izmort
сообщение 2.06.2009 13:02
Сообщение #1





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

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


предположим, что уже построен и задан указателем P однонаправленный список элементами которого являются целые числа. Написать программу, которая из списка P удаляет все вхождения элемента E.

Подскажите, пожалуйста, как создать список в котором будут оба вида указателей - как E так и P?

Ниже я привел мои "старания", процедура построения списка и выведения на экран.



program S2L2_1 ;


type P_item1 = ^item1;
item1 = record
info : integer;
next : P_item1;
end;

type E_item2 = ^item2;
item2 = record
info : integer;
next : E_item2;
end;

var P_begin,P_temp : P_item1; E_temp: E_item2;
n : integer;


procedure Form;
var element,k : integer;
begin
randomize;
k:=20;
New(P_begin);
element:= random(10);
P_begin^.info := element;
P_begin^.next := nil;
P_temp := P_begin;
k:=k-1;
while k<>0 do
begin
element:=random(50);
new (P_temp^.next);
P_temp := p_temp^.next;
P_temp^.info := element;
P_temp^.next := nil;
element:=random(5);
new (E_temp^.next);
E_temp := E_temp^.next;
E_temp^.info := element;
E_temp^.next := nil;
k:=k-1;
end;
end;

procedure Print;
begin
P_temp := P_begin;
write(' ',P_temp^.info);
P_temp := P_temp^.next;
while E_temp <> nil do
begin
write(' ',P_temp^.info);
P_temp := E_temp^.next;
write(' ',E_temp^.info);
E_temp := P_temp^.next;
end;
writeln;
end;



begin

Form;
Print;
readln;

end.


Это конечно же не работает... Но я уже не знаю что еще можно сделать...
помогите пожалуйста, у меня уже нет сил издеваться над этой задачей...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 2.06.2009 13:44
Сообщение #2


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(Izmort @ 2.06.2009 14:02) *
Подскажите, пожалуйста, как создать список в котором будут оба вида указателей - как E так и P?
Что ты понимаешь под "видом Е"? blink.gif Как я понимаю, есть список целых чисел. Теперь тебе задают некое Е, и нужно убрать все элементы, которые его содержут. Например, Е=25. Ты должен убрать все элементы списка, содержащие число 25.

А как еще это можно понимать?


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Izmort
сообщение 2.06.2009 13:50
Сообщение #3





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

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


Я не знаю... Лично я думал, что есть список, он строиться указателем с именем P, потом в него допустим позапихивали из другого списка, где указатель завется E, тоже какие-то элементы.. и мне надо их удалить... я думаю так, но если мне кто-нить растолкует что я не прав, то соглашусь с иным мнением...

Добавлено через 2 мин.
И тогда вопрос в другом - мне нужно искать элементы, которые содержат инфу, например тот же 25 и удалять их?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 2.06.2009 14:03
Сообщение #4


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(Izmort @ 2.06.2009 14:50) *
И тогда вопрос в другом - мне нужно искать элементы, которые содержат инфу, например тот же 25 и удалять их?
Ну да, наверное. Ну, перечитай еще раз условие:
Цитата(Izmort @ 2.06.2009 14:02) *
удаляет все вхождения элемента E

Видишь? Речь идет не про "список Е", а про "элемент Е". Или я уже не понимаю Russian..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Izmort
сообщение 2.06.2009 14:46
Сообщение #5





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

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


Скорее я его не понимаю...)) Спс за разъяснение) Тогда, по-моему алгоритм сводиться поочередному анализу элементов в списке Р и если очередной элемент равен Е, то его нужно удалить, если я не ошибаюсь.
Вопрос в другом как написать процедуру поочередного анализа элементов?

имхо получатся так:


type P_item = ^item;
item = record
info : integer;
next : P_item;
end;
{Тут строиться список}
var P_begin,P_temp : P_item;
n, e, x : integer;
procedure Form;
var element,k : integer;
begin
randomize;
k:=random(100);
New(P_begin);
element:= random(20);
P_begin^.info := element;
P_begin^.next := nil;
P_temp := P_begin;
k:=k-1;
while k<>0 do
begin
element:=random(10);
new (P_temp^.next);
P_temp := p_temp^.next;
P_temp^.info := element;
P_temp^.next := nil;
k:=k-1;
end;
end;

{Тут мы выводим его на экран}
procedure Print;
begin
P_temp := P_begin;
while P_temp <> nil do
begin
write(' ',P_temp^.info);
P_temp := P_temp^.next;
end;
writeln;
end;

{Удаление Е из списка}
procedure DelE;
begin
writeln('BBedume E');
readln(E);
P_temp := P_begin;
while P_temp <> nil do;
begin
x:=P_temp^.info;
if x=e then P_temp := P_temp^.next;
P_temp^.next := P_temp^.next^.next;
Dispose(P_temp);
else P_temp := p_temp^.next;
end;
end;

begin
Form;
Print;
DelE;
Print;
readln;
end.




только ошибка вылезает в этой строчке else P_temp := p_temp^.next;

Сообщение отредактировано: Izmort - 2.06.2009 14:48
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 2.06.2009 15:12
Сообщение #6


Гость






Цитата
только ошибка вылезает в этой строчке else P_temp := p_temp^.next;
У тебя программа вообще некомпилируемая, до ошибки еще как до луны... Смотри внимательно, в процедуре DelE, где у тебя ветка else, и к чему она относится... Ты Begin/End не забыл часом?

А вообще, по-моему, тема давно просится в "Задачи", алгоритмами тут уже и не пахнет, пошла чистая реализация...
 К началу страницы 
+ Ответить 
Izmort
сообщение 2.06.2009 15:30
Сообщение #7





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

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


Задачи, пусть задачи...

type P_item = ^item;
item = record
info : integer;
next : P_item;
end;
{Тут строиться список}
var P_begin,P_temp : P_item;
n, e, x : integer;
procedure Form;
var element,k : integer;
begin
randomize;
k:=random(100);
New(P_begin);
element:= random(20);
P_begin^.info := element;
P_begin^.next := nil;
P_temp := P_begin;
k:=k-1;
while k<>0 do
begin
element:=random(10);
new (P_temp^.next);
P_temp := p_temp^.next;
P_temp^.info := element;
P_temp^.next := nil;
k:=k-1;
end;
end;

{Тут мы выводим его на экран}
procedure Print;
begin
P_temp := P_begin;
while P_temp <> nil do
begin
write(' ',P_temp^.info);
P_temp := P_temp^.next;
end;
writeln;
end;

{Удаление Е из списка}
procedure DelE;
begin
writeln('BBedume E');
readln(E);
P_temp := P_begin;
while P_temp <> nil do;
begin
x:=P_temp^.info;
if x=e then
Begin
P_temp := P_temp^.next;
P_temp^.next := P_temp^.next^.next;
Dispose(P_temp);
end
else P_temp := p_temp^.next;
end;
end;

begin
Form;
Print;
DelE;
Print;
readln;
end.




тока теперь она виснет, где ошибка? Подскажите плз
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 2.06.2009 15:48
Сообщение #8


Гость






Бррр... Во-первых, ты как-то не очень красиво заполняешь список, можно сделать это проще... А во вторых:
while P_temp <> nil do;
в процедуре DelE... Вот эта точка с запятой - лишняя явно, цикл получается пустой, и условие никогда не выполняется. Вот и зацикливается... Это - навскидку, проверить сейчас негде...
 К началу страницы 
+ Ответить 
Izmort
сообщение 2.06.2009 15:56
Сообщение #9





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

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


Спс, теперь не зацикливается. Но все равно работает не правильно, теперь совершенно непонятным для меня образом... могу скинуть один из результатов
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 2.06.2009 16:12
Сообщение #10


Гость






Смотри... Формируем список так:
procedure Form;
var
k: integer;
p_end: p_item;
begin
randomize;
k:=random(100);
p_begin := nil;

while k > 0 do begin
new(p_temp);
p_temp^.info := random(10);
p_temp^.next := nil;

if p_begin = nil then p_begin := p_temp
else p_end^.next := p_temp;

p_end := p_temp;
k := k - 1;
end;
end;
, удаляем элемент E - вот так:
procedure DelE;
var p: p_item;
begin
writeln('BBedume E');
readln(E);
P_temp := P_begin;
while (p_temp <> nil) and (P_temp^.next <> nil) do
begin
if p_temp^.next^.info=e then Begin
p := p_temp^.next;
p_temp^.next := p^.next;
Dispose(P);
end
else P_temp := p_temp^.next;
end;
end;
Это - почти все, что нужно... После этого надо проверить первый элемент на равенство E, и если равен - то удалить его... Доделай это сам (очень трудно теоретически что-то советовать, не имея под рукой компилятора). По-моему, нигде не ошибся, проверяй...
 К началу страницы 
+ Ответить 
Izmort
сообщение 2.06.2009 18:09
Сообщение #11





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

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


Большое спасибо за помощь!
Вот конечный вариант программы

type P_item = ^item;
item = record
info : integer;
next : P_item;
end;

var P_begin,P_temp : P_item;
e: integer;


procedure Form; {формируем список}
var element,k : integer;
P_end: P_item;
begin
randomize;
k:=random(100);
P_begin := nil;
while k>0 do
begin
new(P_temp);
P_temp^.info := random(10);
P_temp^.next := nil;
if P_begin = nil then P_begin := P_temp
else P_end^.next := P_temp;
P_end := P_temp;
k:=k-1;
end;
end;


procedure Print; {Выводим на экран список}
begin
P_temp := P_begin;
while P_temp <> nil do
begin
write(' ',P_temp^.info);
P_temp := P_temp^.next;
end;
writeln;
end;

procedure DelE; {Удаляем элемент Е}
var P: P_item;
begin
writeln('BBedume E');
readln(E);

P_temp := P_begin;

while (P_temp <> nil) and (P_temp^.next <> nil) do
begin
if P_temp^.next^.info = e then
begin
P := P_temp^.next;
P_temp^.next := P^.next;
Dispose(P);
end
else P_temp := p_temp^.next;
end;
end;

procedure DelEN; {Удаляем из начала, если первый элемент равен Е}
var P: P_item;
begin
P_temp := P_begin;
If P_temp^.info = e then
begin
P := P_begin;
P_begin := P_Begin^.next;
Dispose(P);
end;
end;

begin
Form;
Print;
DelE;
DelEN;
Print;
readln;
end.


Глядишь кому-нибудь пригодиться
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



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