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

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

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

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Линейные Списки., Скопировать в один список элементы двух списков.
lopata
сообщение 16.12.2009 22:51
Сообщение #1


Пионер
**

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

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


Только не позорьте. ;)
Вообще как бы программа преобразовывает строки в списки . То есть "Дом" становиться списком "Д" "О" "М".
Вот у меня функция для преобразования строки в список:

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;



Подскажите что не правильно? не могу проверить правильно или нет, так как не понимаю как мне вызывать эту функцию.
Очень нуждаюсь в помощи.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 16.12.2009 23:44
Сообщение #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
сообщение 17.12.2009 0:07
Сообщение #3


Пионер
**

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

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


все. поняла. спасибо. можешь пожалуйста посмотреть процедуру:
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;

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 17.12.2009 0:16
Сообщение #4


Гость






Ну, посмотрел... И что? Я бы сделал по-другому:
   current := cl;
   while current <> nil do begin
      temp := current; // запомнили
      current := current^.next; // продвинулись дальше
      dispose(temp); // удалили
   end;
   cl := current; // фактически: CL := nil
 К началу страницы 
+ Ответить 
lopata
сообщение 17.12.2009 0:17
Сообщение #5


Пионер
**

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

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


у меня возник вопрос : почему в самом начале функции ей присвается указатель?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 17.12.2009 0:18
Сообщение #6


Гость






Это не ей... Это результат, который она вернет. А вернуть она должна начало первого списка...
 К началу страницы 
+ Ответить 
lopata
сообщение 17.12.2009 2:10
Сообщение #7


Пионер
**

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

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


Блин.. А если я захочу скажем удалить из первого списка первый элемент?
получается что в склеином списке его тоже не будет...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 17.12.2009 2:42
Сообщение #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
сообщение 17.12.2009 2:53
Сообщение #9


Пионер
**

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

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


У меня само задание это побороть ограниче типа стринг, переделывай его в списки, и использовать данные процедуры и функции :
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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 17.12.2009 3:04
Сообщение #10


Гость






Ты об этом говоришь ТЕПЕРЬ? Ну, извини, меня задания "по частям" не очень интересуют... Вернее, не интересуют вообще. Дальше - без меня...
 К началу страницы 
+ Ответить 
lopata
сообщение 17.12.2009 3:08
Сообщение #11


Пионер
**

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

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


Ну Извини. Меня интересовало как склеить списки.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
lopata
сообщение 17.12.2009 23:20
Сообщение #12


Пионер
**

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

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


Вот такая вот у меня получилась функция для склеивания списков..:

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;


 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
lopata
сообщение 18.12.2009 11:03
Сообщение #13


Пионер
**

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

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


yahoo!.gif ponyala i rayobralas' so spiskami) i teper' ochen' dovol'na soboj)

Сообщение отредактировано: lopata - 18.12.2009 11:05
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 18.12.2009 12:16
Сообщение #14


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

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

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


Цитата(lopata @ 18.12.2009 11:03) *
yahoo!.gif ponyala i rayobralas' so spiskami) i teper' ochen' dovol'na soboj)
типа другие тут ни при чем..


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


Пионер
**

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

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


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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 18.12.2009 12:46
Сообщение #16


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

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

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


Цитата(lopata @ 18.12.2009 12:31) *
No on predpochel udalit'sya. i vryatli emu teper' nuzhno moe spasibo.
А, вот оно как. Проявил нелояльность - и вышел из господской милости. Типа сам виноват. Ну-ну.

norespect.gif

М
[b]Просьба ознакомиться в Правилами Форума (ссылка вверху страницы). Особенно пункт 6.




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


Пионер
**

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

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


я не о том. мне никто ничего не обязан. и помогать тоже. Но ето сдорово когда действително помогают. Просто так. 
И может ето моя вина что волво <див цласс="qуотетоп">Цитата<див цласс="qуотемаин"> задания "по частям" не очень интересуют... Вернее, не интересуют вообще.
он ясно дал понять " отвали" и поетому думаю ему мое спасибо не нужно.


Сообщение отредактировано: lopata - 18.12.2009 12:57
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 18.12.2009 13:05
Сообщение #18


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

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

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


Цитата(lopata @ 18.12.2009 12:53) *
on yasno dal ponyat' " otvali" i poetomu dumayu emu moe spasibo ne nuzhno.
"спасибо" говорят разве потому, что оно интересует? Ты рассматриваешь свое спасибо, как нечто нужное тому человеку, который тебе помог?.. Я думал, что спасибо говорят, потому что есть внутреннее желание и даже необходимость поблагодарить человека за помощь.. Что сказать спасибо - это потребность того, кто получил помощь. Я не прав? И потом, я не усмотрел в словах волво отказа от твоей благодарности.. я плохо смотрел?


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


Гость






я ему уже сказала спасибо.
а с тобой строить диалог бесполезно. Так как ты сразу же негативно настроен. И сам у себя в голове сделал какой-то вывод.
всего хорошего.
 К началу страницы 
+ Ответить 
Гость
сообщение 18.12.2009 19:59
Сообщение #20


Гость






P.S. "Сережа молодец"
 К началу страницы 
+ Ответить 

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

 

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