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

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

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

> Динамические структуры, удаление текущего элемента x линейного списка.
Catherinektz
сообщение 15.03.2012 18:55
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 40
Пол: Женский
Реальное имя: Екатерина

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


Здравствуйте, мне нужна помощь, я сделала все процедуры (ниже в программе), а процедуру Remove(var x:PNode) не знаю как сделать! Помогите, пожалуйста. В ней нужно удалить текущий элемент x линейного списка.

Program Labal1_2;
Uses crt;

Type PNode=^Node;
Node=Record
data:Integer;
next:PNode;
End;

Var u,y:PNode;
n,k:Integer;

Procedure AddFirst(k:Integer; var p:PNode);
var t:PNode;
Begin
New(t);
t^.data:=k;
t^.next:=p;
p:=t;
End;

Procedure InputList(var p:PNode; n:Integer);
Var i,k:Integer;
Begin
For i:=1 To n Do Begin
Write('Введите k:');
ReadLn(k);
AddFirst(k,p)
End;
End;

Procedure PrintList(p:PNode);
Begin while p<>nil Do Begin
Write(p^.data, ' ');
p:=p^.next;
End;
WriteLn;
End;

Procedure DelFirst(var p:PNode);
Var t:PNode;
Begin
t:=p;
p:=p^.next;
dispose(t);
End;

Procedure DelNext(x:PNode);
Var t:PNode;
Begin
t:=x^.next;
x^.next:=t^.next;
dispose(t);
End;

Procedure DelLast(var x:PNode);
Var q:PNode;
Begin
If x^.next=nil Then DelFirst(x) Else Begin
q:=x;
While q^.next^.next<>nil Do q:=q^.next;
DelNext(q);
End;
End;

Procedure Delete(n:Integer; var p:PNode);
Var i,k:Integer;
Var q:PNode;
Begin
If n=1 Then DelFirst(p) Else Begin
q:=p;
For i:=1 To n-2 Do Begin
If q^.next=nil Then Break Else q:=q^.next;
End;

If q^.next<>nil Then DelNext(q) Else WriteLn('Нет столько элеметов в списке');

End;
End;

Procedure Clear(var p:PNode);
Begin
While p<>nil Do DelFirst(p);
End;



Begin
Clrscr;
WriteLn('Тестирование');

Writeln('Введите количество элементов в списке:');
Read(k);
InputList(u,k);
PrintList(u);

WriteLn('Удаление первого элемента:');
DelFirst(u);
PrintList(u);

WriteLn('Удаление элемента следующего за:');
DelNext(u);
PrintList(u);

WriteLn('Удаление последнего элемента:');
DelLast(u);
PrintList(u);

WriteLn('Удаление заданного элемента:');
WriteLn('Введите номер элемента');
ReadLn(n);
Delete(n,u);
PrintList(u);

WriteLn('Удаление всего списка:');
Clear(u);
PrintList(u);

ReadLn;
End.


Сообщение отредактировано: Lapp - 16.03.2012 4:07
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Федосеев Павел
сообщение 15.03.2012 19:12
Сообщение #2


Бывалый
***

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

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


Здесь в FAQ есть ответ:
Цитата
Если следует удалить элемент на который указывается ссылка q, то следует в начале присвоить элементу q^ значение следующего за ним элемента, а затем этот элемент удалить.

{удаление элемента q^}
Procedure Delete(Var q: point);
Var r: point;
Begin
r:=q^.next;
q^:=r^;
r^.Next:=nil;
End;

Цитата
Обратите внимание на то, что удаляемый из списка элемент остается в памяти и к нему имеется доступ к указателю r, так что в дальнейшем этот элемент можно вставить, например, в другой список. Если требуется освободить занимаемую этим элементом память, то следует выполнить:
{ ... }
Dispose( r );
r:=nil;
{ ... }


Сообщение отредактировано: Федосеев Павел - 15.03.2012 19:14
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Catherinektz
сообщение 15.03.2012 20:02
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 40
Пол: Женский
Реальное имя: Екатерина

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


Цитата(Федосеев Павел @ 15.03.2012 20:12) *

Здесь в FAQ есть ответ:

{удаление элемента q^}
Procedure Delete(Var q: point);
Var r: point;
Begin
r:=q^.next;
q^:=r^;
r^.Next:=nil;
End;




К сожалению не работает, выдает ошибку разыменования нулевого указателя. Я записала так:
Procedure Remove(Var x:PNode);
Var r:PNode;
Begin
r:=x^.next;
x^:=r^;
r^.Next:=nil;
{Dispose®;
r:=nil; }
End;

в основной программе:
WriteLn('Удаление:');
Remove(u);
PrintList(u);
End.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Catherinektz   Динамические структуры, удаление текущего элемента x линейного списка.   15.03.2012 18:55
Федосеев Павел   Здесь в FAQ есть ответ: {удаление элемента q^} Pr...   15.03.2012 19:12
Catherinektz   Здесь в FAQ есть ответ: {удаление элемента q^} P...   15.03.2012 20:02
Федосеев Павел   FAQ не идеал, а образец для подражания (почти как ...   15.03.2012 22:01
Catherinektz   FAQ не идеал, а образец для подражания (почти как...   16.03.2012 10:26
Федосеев Павел   Sorry, за выпендрёж. Assign(p) эквивалент p<...   16.03.2012 11:14
Catherinektz   Sorry, за выпендрёж. Assign(p) эквивалент p<...   16.03.2012 11:33
Catherinektz   А что обозначает эта строчка: x^:=r^; У меня поче...   20.03.2012 10:29
IUnknown   Можно посмотреть на окончательный вариант программ...   20.03.2012 11:36
Catherinektz   Можно посмотреть на окончательный вариант програм...   20.03.2012 20:02
IUnknown   То есть, в Remove передается начало списка? Тогда ...   20.03.2012 20:11
Catherinektz   То есть, в Remove передается начало списка? Тогда...   20.03.2012 20:21
-Федосеев Павел-   Глянь ещё раз в FAQ. Там есть одноимённая процедур...   21.03.2012 9:05


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

 



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