Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 09.02.2011, 20:26   #1 (permalink)
Хелен
Sparkling
 
Аватар для Хелен
 
Регистрация: 29.09.2010
Сообщений: 98
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 93
По умолчанию Программа со стеками.

Программа, формирующая односвязный список из пяти элементов, содержащих число и его текстовое представление. Выполняет вставку и удаление заданного элемента. В качестве ключа используется число.

Программа работает, но есть одно НО. Не вставляет элемент перед первым, т.е. напр. "0" элемент перед "1". Не могу никак додуматься. Толи ещё 1 функция нужна, то ли повернуть проверку счета не с начала в конец, а наоборот.

Код:
program linked_list;
const n = 5;
type	pnode = ^node;
	node = record	   { элемент списка }
		d : word;
		s : string;
		p : pnode;
	end;
var	beg : pnode;   { указатель на начало списка }
	i, key	: word;
	s	: string;
	option	: word;
const	text: array [1 .. n] of string =
			('one', 'two', 'three', 'four', 'five');
procedure add(var beg : pnode; d : word; const s : string);

var p : pnode;	    { указатель на создаваемый элемент }
      t : pnode;            { указатель для просмотра списка }
begin
	new(p);			{ создание элемента }
	p^.d := d; p^.s := s;	{ заполнение элемента }
	p^.p := nil;

	if beg = nil then beg := p	 { список был пуст }
	else begin		 { список не пуст }
 	   t := beg;
	   while t^.p <> nil do   { проход по списку до конца }
		t := t^.p;
	   t^.p := p;  { привязка нового элемента к последнему }
	end
end;
function find(beg : pnode; key : word; var p, pp : pnode) : boolean;
begin
	p := beg;
	while p <> nil do begin			{ 1 }
		if p^.d = key then begin		{ 2 }
			find := true; exit end;
		pp := p;  			{ 3 }
		p := p^.p;			{ 4 }
	end;
	find := false;
end;
procedure insert(beg : pnode; key, d : word; const s : string);
var p       : pnode;    { указатель на создаваемый элемент }
      pkey : pnode;    { указатель на искомый элемент }
      pp     : pnode;    { указатель на предыдущий элемент }

begin
    if not find(beg, key, pkey, pp) then begin
          writeln(' out error');
          exit;
   end;
   new(p); 	       {1}
   p^.d := d; p^.s := s;  {2}
   p^.p := pkey^.p;       {3}
   pkey^.p := p;            {4}
end;
p^.p:=nil;
procedure del(var beg : pnode; key : word);
var p   : pnode;    { указатель на удаляемый элемент }
      pp : pnode;    { указатель на предыдущий элемент }
begin
	if not find(beg, key, p, pp) then begin
		writeln(' delete error'); exit; end;
	if p = beg then
	     beg := beg^.p   { удаление первого элемента }
	else pp^.p := p^.p;
	dispose(p);
end;
procedure print(beg : pnode);
var p : pnode; 	{ указатель для просмотра списка }
begin
	p := beg;
	while p <> nil do begin 	 { цикл по списку }
                writeln(p^.d:3, p^.s); 	{ вывод элемента }
  	   p := p^.p   { переход к следующему элементу списка }
	end;
end;
begin
     for i := 1 to 5 do add(beg, i, text[i]);

     while true do begin
         writeln('1 - past, 2 - delete,3 - out, 4 - exit');
          readln(option);

	case option of
	1: begin					{ вставка }
		writeln('Key for past?');
		readln(key);
		writeln('past element?');
		readln(i); readln(s);
		insert(beg, key, i, s);
	end;
	2: begin					{ удаление }
		writeln('Key for delete?');
		readln(key);
		del(beg, key);
	end;
	3: begin					{ вывод }
		writeln('out list:');
		print(beg);
	end;
	4: exit; 					{ выход }
        end;
       writeln;
    end
end.
Хелен вне форума   Ответить с цитированием

Старый 09.02.2011, 20:26
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Посоветую вам прочитать содержимое данных топиков

Программа для ХР
Программа
Программа
Что за программа?
Программа для 3D

Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 23:28.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.