![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() |
Catherinektz |
![]() ![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 40 Пол: Женский Реальное имя: Екатерина Репутация: ![]() ![]() ![]() |
Здравствуйте, мне нужна помощь, я сделала все процедуры (ниже в программе), а процедуру Remove(var x:PNode) не знаю как сделать! Помогите, пожалуйста. В ней нужно удалить текущий элемент x линейного списка.
Program Labal1_2; Сообщение отредактировано: Lapp - 16.03.2012 4:07 |
![]() ![]() |
Федосеев Павел |
![]()
Сообщение
#2
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 298 Пол: Мужской Реальное имя: Федосеев Павел Репутация: ![]() ![]() ![]() |
Здесь в FAQ есть ответ:
Цитата Если следует удалить элемент на который указывается ссылка q, то следует в начале присвоить элементу q^ значение следующего за ним элемента, а затем этот элемент удалить. {удаление элемента q^} Цитата Обратите внимание на то, что удаляемый из списка элемент остается в памяти и к нему имеется доступ к указателю r, так что в дальнейшем этот элемент можно вставить, например, в другой список. Если требуется освободить занимаемую этим элементом память, то следует выполнить: { ... } Dispose( r ); r:=nil; { ... } Сообщение отредактировано: Федосеев Павел - 15.03.2012 19:14 |
Catherinektz |
![]()
Сообщение
#3
|
Новичок ![]() Группа: Пользователи Сообщений: 40 Пол: Женский Реальное имя: Екатерина Репутация: ![]() ![]() ![]() |
Здесь в FAQ есть ответ: {удаление элемента q^} К сожалению не работает, выдает ошибку разыменования нулевого указателя. Я записала так: 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. |
Федосеев Павел |
![]()
Сообщение
#4
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 298 Пол: Мужской Реальное имя: Федосеев Павел Репутация: ![]() ![]() ![]() |
FAQ не идеал, а образец для подражания (почти как "пиратский кодекс")
Сообщение отредактировано: Федосеев Павел - 15.03.2012 22:11 |
Catherinektz |
![]()
Сообщение
#5
|
Новичок ![]() Группа: Пользователи Сообщений: 40 Пол: Женский Реальное имя: Екатерина Репутация: ![]() ![]() ![]() |
FAQ не идеал, а образец для подражания (почти как "пиратский кодекс")
А что такое Assigned (перевод понимаю и знаю), а вот как и для чего нет! В Pascal ABC выдает ошибку |
Федосеев Павел |
![]()
Сообщение
#6
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 298 Пол: Мужской Реальное имя: Федосеев Павел Репутация: ![]() ![]() ![]() |
Sorry, за выпендрёж.
Assign(p) эквивалент p<>nil |
Catherinektz |
![]()
Сообщение
#7
|
Новичок ![]() Группа: Пользователи Сообщений: 40 Пол: Женский Реальное имя: Екатерина Репутация: ![]() ![]() ![]() |
|
Catherinektz |
![]()
Сообщение
#8
|
Новичок ![]() Группа: Пользователи Сообщений: 40 Пол: Женский Реальное имя: Екатерина Репутация: ![]() ![]() ![]() |
А что обозначает эта строчка: x^:=r^;
У меня почему -то удаляет только первый элемент списка. Сообщение отредактировано: Catherinektz - 20.03.2012 10:29 |
IUnknown |
![]()
Сообщение
#9
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Можно посмотреть на окончательный вариант программы? Конкретно - уточни, что именно по-твоему должна делать процедура Remove? И как находится тот элемент, который в Remove передается? И как, наконец, вызывается эта самая Remove...
|
Catherinektz |
![]()
Сообщение
#10
|
Новичок ![]() Группа: Пользователи Сообщений: 40 Пол: Женский Реальное имя: Екатерина Репутация: ![]() ![]() ![]() |
Можно посмотреть на окончательный вариант программы? Конкретно - уточни, что именно по-твоему должна делать процедура Remove? И как находится тот элемент, который в Remove передается? И как, наконец, вызывается эта самая Remove... Procedure Remove(Var x:PNode); Var r:PNode; Begin r:=x^.next; If r<>nil Then Begin x^:=r^; Dispose®; End Else DelLast(x); End; В программе: WriteLn('Удаление текущего элемента x линейного списка:'); Remove(u); PrintList(u); Я думаю, что нужно ввести еще переменную, где будем указывать какой именно элемент в списке, и затем он его будет удалять. Добавлено через 6 мин. Вот вся моя программа: 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; Procedure Remove(Var x:PNode); Var r:PNode; Begin r:=x^.next; If r<>nil Then Begin x^:=r^; Dispose®; End Else DelLast(x); 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('Удаление текущего элемента x линейного списка:'); Remove(u); PrintList(u); WriteLn('Удаление заданного элемента:'); WriteLn('Введите номер элемента'); ReadLn(n); Delete(n,u); PrintList(u); WriteLn('Удаление всего списка:'); Clear(u); PrintList(u); ReadLn; End. |
IUnknown |
![]()
Сообщение
#11
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата WriteLn('Удаление текущего элемента x линейного списка:'); Цитата У меня почему -то удаляет только первый элемент списка. ? Какой же элемент должен удалиться, если процедура получила адрес первого?Цитата Я думаю, что нужно ввести еще переменную, где будем указывать какой именно элемент в списке, и затем он его будет удалять. Почему переменную, а не функцию? Скажем, реализовать функцию Search (которая в списке будет искать первый элемент с заданным значением и возвращать ссылку на него), и вызывать Remove вот так:Remove( Search(u, 6) ); |
Catherinektz |
![]()
Сообщение
#12
|
Новичок ![]() Группа: Пользователи Сообщений: 40 Пол: Женский Реальное имя: Екатерина Репутация: ![]() ![]() ![]() |
То есть, в Remove передается начало списка? Тогда почему тебя это удивляет: ? Какой же элемент должен удалиться, если процедура получила адрес первого? Почему переменную, а не функцию? Скажем, реализовать функцию Search (которая в списке будет искать первый элемент с заданным значением и возвращать ссылку на него), и вызывать Remove вот так: Remove( Search(u, 6) ); А можно мне еще эту функцию написать, а то я только с работы пришла, вообще голова не варит! |
-Федосеев Павел- |
![]()
Сообщение
#13
|
Гость ![]() |
Глянь ещё раз в FAQ. Там есть одноимённая процедура (Search). Переделай её в функцию.
|
![]() ![]() |
![]() |
Текстовая версия | 20.07.2025 2:26 |