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

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

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

 
 Ответить  Открыть новую тему 
> Списки, Не получается никак!
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


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

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

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


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

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


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





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

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


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

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


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

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

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


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

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


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






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

А вообще, по-моему, тема давно просится в "Задачи", алгоритмами тут уже и не пахнет, пошла чистая реализация...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






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





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

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


Спс, теперь не зацикливается. Но все равно работает не правильно, теперь совершенно непонятным для меня образом... могу скинуть один из результатов
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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, и если равен - то удалить его... Доделай это сам (очень трудно теоретически что-то советовать, не имея под рукой компилятора). По-моему, нигде не ошибся, проверяй...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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

 





- Текстовая версия 2.09.2025 5:17
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name