![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
lopata |
![]()
Сообщение
#1
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 99 Пол: Женский Реальное имя: vera Репутация: ![]() ![]() ![]() |
Только не позорьте. ;)
Вообще как бы программа преобразовывает строки в списки . То есть "Дом" становиться списком "Д" "О" "М". Вот у меня функция для преобразования строки в список:
program CharList;
uses
crt;
type
NodePtr = ^Node;
Node = record
next: NodePtr;
ch: char;
end;
CharListPtr = NodePtr;
function CharListOf(s: string): CharListPtr;
var
List: CharListPtr;
prevNode, newNode: NodePtr;
i: integer;
begin
List := nil;
for i := 1 to length(s) do
begin
if (i = 1) then
begin
new(List);
List^.next := nil;
List^.ch := s[i];
prevNode := List;
end
else
begin
New(newNode);
newNode^.ch := s[i];
newNode^.next := nil;
prevNode^.next:= newNode;
prevNode := newNode;
end;
end;
prevNode := nil;
CharListOf := List;
end;
begin
charlistof('hello world!');
end.
Нужно написать функцию FUNCTION CLConcat(cl1, cl2: CharListPtr): CharListPtr; (*returns concatenation of cl1 and cl2 by copying both lists*) вот у меня получилось, но пока только для копирования одного списка:
FUNCTION CLConcat(cl1: CharListPtr): CharListPtr;
var cl3 ,PrevNode, NewNode, current:CharListPtr;
begin
New(cl3);
cl3^.ch := cl1^.ch;
cl3^.next := nil;
prevNode := cl3;
current := cl1;
while current <> nil do
begin
current := current^.next;
new(NewNode);
newNode^.ch := current^.ch;
prevNode^.next:= newNode;
prevNode := newNode;
end;
CLConcat := cl3;
end;
Подскажите что не правильно? не могу проверить правильно или нет, так как не понимаю как мне вызывать эту функцию. Очень нуждаюсь в помощи. |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Цитата вот у меня получилось, но пока только для копирования одного списка: А где у тебя в задании что-то сказано о копировании списков? У тебя стоит задача: есть 2 списка, и надо один приклеить к другому. Так? Это делается в три строки ровно:function CLConcat(List1, List2: CharListPtr): CharListPtr;
begin
CLConcat := List1;
while List1^.next <> nil do List1 := List1^.next;
List1^.next := List2;
end;
Это НЕ сработает только в одном случае, если List1 будет пустым, это надо проверить отдельно, сделай это самостоятельно... |
lopata |
![]()
Сообщение
#3
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 99 Пол: Женский Реальное имя: vera Репутация: ![]() ![]() ![]() |
все. поняла. спасибо. можешь пожалуйста посмотреть процедуру:
PROCEDURE DisposeCharList(VAR cl: CharListPtr);
var
temp, current : NodePtr;
begin
current := cl;
while current <> nil do
begin
temp := current^.next;
dispose(current);
current := temp;
end;
end;
|
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Ну, посмотрел... И что? Я бы сделал по-другому:
current := cl;
while current <> nil do begin
temp := current; // запомнили
current := current^.next; // продвинулись дальше
dispose(temp); // удалили
end;
cl := current; // фактически: CL := nil
|
lopata |
![]()
Сообщение
#5
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 99 Пол: Женский Реальное имя: vera Репутация: ![]() ![]() ![]() |
у меня возник вопрос : почему в самом начале функции ей присвается указатель?
|
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Это не ей... Это результат, который она вернет. А вернуть она должна начало первого списка...
|
lopata |
![]()
Сообщение
#7
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 99 Пол: Женский Реальное имя: vera Репутация: ![]() ![]() ![]() |
Блин.. А если я захочу скажем удалить из первого списка первый элемент?
получается что в склеином списке его тоже не будет... |
volvo |
![]()
Сообщение
#8
|
Гость ![]() |
Тогда тебе нужно именно копирование списка... Тем более, что
Цитата Нужно написать функцию Вот так:FUNCTION CLConcat(cl1, cl2: CharListPtr): CharListPtr; (*returns concatenation of cl1 and cl2 by copying both lists*) program CharList;
type
NodePtr = ^Node;
Node = record
next: NodePtr;
ch: char;
end;
CharListPtr = NodePtr;
procedure AppendToList(Ch: char; var First, Last: CharListPtr);
var p: CharListPtr;
begin
new(p);
p^.ch := ch; p^.next := nil;
if First = nil then First := p
else Last^.next := p;
Last := p;
end;
function CharListOf(s: string): CharListPtr;
var
Head, Tail: CharListPtr;
i: integer;
begin
Head := nil; Tail := nil;
for i := 1 to length(s) do
AppendToList(s[i], Head, Tail);
CharListOf := Head;
end;
function CopyList(L: CharListPtr): CharListPtr;
var Head, Tail: CharListPtr;
begin
Head := nil; Tail := nil;
while L <> nil do begin
AppendToList(L^.ch, Head, Tail); L := L^.next;
end;
CopyList := Head;
end;
function CLConcat(CL1, CL2: CharListPtr): CharListPtr;
var L: CharListPtr;
begin
L := CopyList(CL1);
CLConcat := L;
while L^.next <> nil do L := L^.next;
L^.next := CopyList(CL2);
end;
procedure PrintList(const L: CharListPtr);
begin
if L = nil then writeln
else begin
write(L^.ch:2); PrintList(L^.next);
end;
end;
var
L1, L2: CharListPtr;
LC: CharListPtr;
begin
L1 := CharListOf('hello ');
L2 := CharListOf('world!');
LC := CLConcat(L1, L2);
PrintList(LC);
end.
Попробуй разобраться, как это работает, и для чего введены доп. подпрограммы. Если что непонятно - спрашивай... Упустишь сейчас - потом будет труднее разобраться в работе с указателями... |
lopata |
![]()
Сообщение
#9
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 99 Пол: Женский Реальное имя: vera Репутация: ![]() ![]() ![]() |
У меня само задание это побороть ограниче типа стринг, переделывай его в списки, и использовать данные процедуры и функции :
FUNCTION NewCharList: CharListPtr; (*returns empty char list*) PROCEDURE DisposeCharList(VAR cl: CharListPtr); (*disposes all nodes and sets cl to empty char list*) FUNCTION CLLength(cl: CharListPtr): INTEGER; (*returns number of characters in cl*) FUNCTION CLConcat(cl1, cl2: CharListPtr): CharListPtr; (*returns concatenation of cl1 and cl2 by copying both lists*) FUNCTION CharListOf(s: STRING): CharListPtr;(*returns char list representation of STRING*) FUNCTION StringOf(cl: CharListPtr): STRING; (*returns STRING representation of char list, may result in truncatation*) Вот что сделала : Program CharList;
Uses Wincrt;
TYPE
NodePtr = ^Node;
Node = RECORD
next: NodePtr;
ch: CHAR;
END; (*RECORD*)
CharListPtr = NodePtr;
FUNCTION CharListOf(s: STRING): CharListPtr;
var
List: CharListPtr;
prevNode, newNode: NodePtr;
i: integer;
begin
List := nil;
for i := 1 to length(s) do
begin
if (i = 1) then
begin
new(List);
List^.next := nil;
List^.ch := s[i];
prevNode := List;
end
else
begin
New(newNode);
newNode^.ch := s[i];
newNode^.next := nil;
prevNode^.next:= newNode;
prevNode := newNode;
end;
end;
prevNode := nil;
CharListOf := List;
end;
FUNCTION CLLength(cl: CharListPtr): INTEGER;
var current : NodePtr;
i : integer;
begin
i := 0;
current := cl;
while current <> nil do
begin
i := i + 1;
current := current^.next;
end;
CLLength := i;
end;
FUNCTION StringOf(cl: CharListPtr): STRING;
var current :NodePtr;
s : string;
begin
s := '';
current := cl;
while current <> nil do
begin
s := s + current^.ch;
current := current^.next;
end;
StringOf := s;
end;
PROCEDURE DisposeCharList(VAR cl: CharListPtr);
var
temp, current : NodePtr;
begin
current := cl;
while current <> nil do
begin
temp := current^.next;
dispose(current);
current := temp;
end;
end;
FUNCTION CLConcat(cl1, cl2: CharListPtr): CharListPtr;
begin
CLConcat := cl1;
while cl1^.next <> nil do cl1 := cl1^.next;
cl1^.next := cl2;
end;
begin
end.
Сообщение отредактировано: lopata - 17.12.2009 3:01 |
volvo |
![]()
Сообщение
#10
|
Гость ![]() |
Ты об этом говоришь ТЕПЕРЬ? Ну, извини, меня задания "по частям" не очень интересуют... Вернее, не интересуют вообще. Дальше - без меня...
|
lopata |
![]()
Сообщение
#11
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 99 Пол: Женский Реальное имя: vera Репутация: ![]() ![]() ![]() |
Ну Извини. Меня интересовало как склеить списки.
|
lopata |
![]()
Сообщение
#12
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 99 Пол: Женский Реальное имя: vera Репутация: ![]() ![]() ![]() |
Вот такая вот у меня получилась функция для склеивания списков..:
FUNCTION CLConcat(cl1, cl2: CharListPtr): CharListPtr;
var cl3 ,PrevNode, NewNode, current:CharListPtr;
begin
current := cl1;
prevNode := nil;
while current <> nil do
begin
new(NewNode);
newNode^ := current^;
newNode^.next := nil;
if (prevNode <> nil) then
begin
prevNode^.next:= newNode;
end
else
begin
cl3 := newNode;
end;
prevNode := newNode;
current := current^.next;
end;
current := cl2;
while current <> nil do
begin
new(NewNode);
newNode^ := current^;
newNode^.next := nil;
if (prevNode <> nil) then
begin
prevNode^.next:= newNode;
end
else
begin
cl3 := newNode;
end;
prevNode := newNode;
current := current^.next;
end;
|
lopata |
![]() ![]()
Сообщение
#13
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 99 Пол: Женский Реальное имя: vera Репутация: ![]() ![]() ![]() |
![]() Сообщение отредактировано: lopata - 18.12.2009 11:05 |
Lapp |
![]()
Сообщение
#14
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
![]() -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
lopata |
![]()
Сообщение
#15
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 99 Пол: Женский Реальное имя: vera Репутация: ![]() ![]() ![]() |
cto znachit oastal'nye ne prichem? spasibo konechno volvo, potomu chto srazu ponyat' kak rabotayut Pointers i Listenochen' tyazhelo.
No on predpochel udalit'sya. i vryatli emu teper' nuzhno moe spasibo. |
Lapp |
![]()
Сообщение
#16
|
|||
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
No on predpochel udalit'sya. i vryatli emu teper' nuzhno moe spasibo. А, вот оно как. Проявил нелояльность - и вышел из господской милости. Типа сам виноват. Ну-ну.![]()
-------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
|||
lopata |
![]()
Сообщение
#17
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 99 Пол: Женский Реальное имя: vera Репутация: ![]() ![]() ![]() |
я не о том. мне никто ничего не обязан. и помогать тоже. Но ето сдорово когда действително помогают. Просто так. Сообщение отредактировано: lopata - 18.12.2009 12:57 |
Lapp |
![]()
Сообщение
#18
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
on yasno dal ponyat' " otvali" i poetomu dumayu emu moe spasibo ne nuzhno. "спасибо" говорят разве потому, что оно интересует? Ты рассматриваешь свое спасибо, как нечто нужное тому человеку, который тебе помог?.. Я думал, что спасибо говорят, потому что есть внутреннее желание и даже необходимость поблагодарить человека за помощь.. Что сказать спасибо - это потребность того, кто получил помощь. Я не прав? И потом, я не усмотрел в словах волво отказа от твоей благодарности.. я плохо смотрел?-------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Гость |
![]()
Сообщение
#19
|
Гость ![]() |
я ему уже сказала спасибо.
а с тобой строить диалог бесполезно. Так как ты сразу же негативно настроен. И сам у себя в голове сделал какой-то вывод. всего хорошего. |
Гость |
![]()
Сообщение
#20
|
Гость ![]() |
P.S. "Сережа молодец"
|
![]() ![]() |
![]() |
Текстовая версия | 18.07.2025 10:19 |