Помогите!

  • Автор темы DartVoron
  • Дата начала
Статус
Закрыто для дальнейших ответов.
D

DartVoron

Гость
#1
Помогите решить задачу по паскалю.

:lol: Разработать алгоритм и программу решения задачи, в которой сформировать односвязный линейный список.
:) Разработать алгоритм и программу решения задачи, в которой сформировать кольцевой односвязный список.

Припод дал задачу, а как ее решать ни словом ни духом не намекнул..
 
D

DartVoron

Гость
#3
А ЧТО ПОЧИТАТЬ, ПОДСКАЖИ , А ТО НЕЧЕГО ЧИТАТЬ, А ЧТО ЕСТЬ ТАМ НЕТ ПРИМЕРОВ ПРОГРАММ. :)
 
H

Hetman

Гость
#4
Умеючи в Интернете можно найти всё:

Организация стека в определенном смысле противоположна организации очереди, поскольку здесь используется доступ по принципу "последней пошел, первый вышел" (такой метод доступа иногда называют методом LIFO). Представим себе стопку тарелок. Нижняя тарел- ка из этой стопки будет использована последней, а верхняя тарелка (которая была установлена в стопку последней) будет использована первой. Стеки широко используются в системном программном обеспечении, включая компиляторы и интерпретаторы.
Исторически сложилось так, что две основные операции для стека - поместить в стек и выбрать из стека - получили название соответственно "затолкнуть" и "вытолкнуть". Поэтому для реализации стека необходимо создать две функции: "posh" (затолкнуть), которая помещает элемент в вершину стека, и "pop" (вытолкнуть), которая выбирает из вершины стека значение. Необходимо также предусмотреть определенную область в памяти, где фактически будет храниться стек. Для этого можно использовать массив или можно выделить область памяти, используя средство динамического распределения памяти, предусмотренное в языке Турбо Паскаль. Как и при работе с очередью при выборке значения из стека элемент будет потерян, если его не сохранить гденибудь в памяти. Ниже приводится общая форма процедур установки в стек и выборки из стека.
const
MAX = 100;
var
stack: array [1..100] of integer;
tos:integer; {помещение объекта в стек}
procedure Push (i:integer);
begin
if tos>=MAX then WriteLn('Стэк пуст')else
begin
stack[tos]:=i;
tos:=tos+1;
end;
end; {конец процедуры помещения объекта в стек}
{ выборка объекта из стека }
function Pop:integer;
begin
tos:=tos-1;
if tos<1 then
begin
WriteLn('Стэк переполнен');
tos:=tos+1;
Pop:=0;
end
else Pop := stack[tos];
end;{конец функции выборки объекта из стека}

Переменная "tos" содержит значение индекса для следующего помещаемого в стек элемента. При реализации этих процедур никогда нельзя забывать о проверке ситуаций переполнения стека и выборки из пустого стека. В приведенных процедурах нулевое значение указателя "tos" означает, что стек пуст, а значение этого указателя, равное или превышающее адрес последней ячейки памяти, где содержится стек, означает заполнение стека. Рис.7 иллюстрирует работу стека.



Операция Содержимое стека
Push(A) A
Push(B) B A
Push&copy; C B A
Pop, выбирается С В А
Push(F) F B A
Pop, выбирается F B A
Pop, выбирается В А
Рор, выбирается А пусто
Рис.7. Работа стека.

Хорошим примером применения стека является калькулятор, который может выполнять четыре действия. Большинство калькуляторов используют стандартную форму выражений, которая носит название инфиксной формы. В общем виде ее можно представить в виде "операнд-оператор-операнд". Например, для прибавления 100 к 200 вы должны ввести число 100, набрать символ сложения, ввести число 200 и нажать клавишу со знаком равенства. Однако, некоторые каль- куляторы применяют другую форму выражений, получившую название постфиксной формы. В этом случае оба операнда вводятся перед вводом оператора. Например, для добавления 100 к 200 при использовании постфиксной формы сначала вводится число 100, затем вводится число 200 и после этого нажимается клавиша со знаком плюс. Введенные операнды помещаются в стек. При вводе оператора из стека выбираются два операнда и результат помещается в стек. При использовании постфиксной формы очень сложные выражения могут легко вычисляться на калькуляторе.
Ниже показана программа для такого калькулятора.
{калькулятор с четырьмя операциями, иллюстрирующий работу}
program four_function_calc;
const
MAX = 100;
var
stack: array [1..100] of integer;
tos:integer;{указатель вершины стека}
a, b:integer;
s:string[80];
{поместить объект в стек}
procedure Push(i:integer);
begin
if tos >= MAX then Writeln('Стек полон') else
begin
stack[tos] :=1;
tos := tos+1;
end;
end;{Push}
{выборка объекта из стека}
function Pop:integer;
begin
tos := tos-1;
if tos < 1 then
begin
Writeln('Стек переполнен')
tos := tos+1;
Pop := 0;
end;
else Pop := stack[tos];
end;{Pop}
begin{калькулятор}
tos := 1;
Writeln('For Function Calculator');
repeat
Write(': '); { вывод приглашения }
Readln(s);
Val(s, a, b) { преобразование строки символов в целое число }
{ считается, что при успешном преобразовании пользователь ввел число, а в противном случае пользователь ввел оператор}
if (b=0) and ((Length(s)>1) or (s[1]<>'-')) then
Push(a);
else
case s[1] of
'+' begin
a := Pop;
b := Pop;
Writeln(a+b);
Push(a+b);
end;
'-' begin
a := Pop;
b := Pop;
Writeln(b+a);
Push(b+a);
end;
'*' begin
a := Pop;
b := Pop;
Writeln(a*b);
Push(a*b);
end;
'/' begin
a := Pop;
b := Pop;
if a=0 then Writeln('делим на ноль') else
begin
Writeln(b div a);
Push(b div a);
end;
end;
'.' begin
a := Pop
Writeln(a);
Push(a);
end;
end;
until UpCase(s[1])='G';
end.

Для того, чтобы посмотреть, что находится в вершине стека, достаточно ввести точку. Хотя данная программа выполняет арифметические действия только с целыми числами, ее легко можно приспособить для чисел с плавающей запятой, изменяя тип данных стека и преобразуя оператор "div" в оператор деления для чисел с плавающей запятой (наклонная черта)..
На оригинал ссылоки нет (сохранился только в кэше google)

Кстати есть и вот такой метериальчик (поиск занял менее 5 минут)
 
D

DartVoron

Гость
#5
:D НУ СПОСИБО ЗА СТЕК, НО ВСЕЖЕ, МНЕ НУЖЕН КОЛЬЦЕВОЙ ОДНОСВЯЗНЫЙ СПИСОК :D А НЕ СТЕК.........
 
G

Guest_Shader88_*

Гость
#6
Вообще советую почитать Н. Вирт "Алгоритмы и структуры данных", так она по моему называется. Их три тома читай все - настоятельно рекомендую.
Одна из Библий программера.

Ответ на вопрос 1:
[codebox]
...
type
{ описание структуры односвязный линейный список }
TList = ^List;
List = record
{ твои данные которые будешь хранить в списке}
Str : String; { например строки}
Next: TList;
end;
{ описание структуры односвязный линейный список }

procedure CreateList(var L: TList);
begin
L := nil;
end;

procedure DeleteList(var L: TList);
var
L1: TList;
begin
if L = nil then exit;
while L <> nil do
begin
L1 := L;
L := L.Next;
Dispose(L1);
end;
end;

{ Добавление в конец списка - например строк}
procedure AddToList(var L: TList; S : String);
var
L1, L2: TList;
begin
L1 := L;
if L1 = nil
then begin
new(L1);
L1.Str := S;
L := L1;
L.Next := nil;
exit;
end;
while L1.Next <> nil do
L1 := L1.Next;

new(L2);
L2.Str := S;
L2.Next := nil;
L1.Next := L2;
end;

{ Вывод списка}
procedure OutList(L: TList);
var
L1: TList;
begin
L1 := L;
while L1 <> nil do
begin
Writeln(L1.Str);
L1 := L1.Next;
end;
end;

var
ListExample: TList;
begin
CreateList(ListExample);
AddToList(ListExample,'abcdef');
AddToList(ListExample,'gh');
OutList(ListExample);
DeleteList(ListExample);
end.
[/codebox]
Проверял работает.

Ответ на вопрос 2:
[codebox]
...
type
{ Описание структуры кольцевой односвязный список}
TList = ^List;
List = record
{ твои данные которые будешь хранить в списке }
Str : String; { например строки }
Next: TList;
end;
{ Описание структуры кольцевой односвязный список}

procedure CreateList(var L: TList);
begin
L := nil;
end;

procedure DeleteList(var L: TList);
var
L1, L2: TList;
begin
if L = nil then exit;
if L.Next = L
then begin
Dispose(L);
exit;
end;
L2 := L;
L := L.Next;
while L <> L2 do
begin
L1 := L;
L := L.Next;
Dispose(L1);
end;
Dispose(L2);
end;

{ Добавление в конец списка - например строк хотя тут это звучит}
procedure AddToList(var L: TList; S : String);
var
L1, L2: TList;
begin
L1 := L;
if L1 = nil
then begin
new(L1);
L1.Str := S;
L := L1;
L.Next := L;
exit;
end;
while L1.Next <> L do
L1 := L1.Next;

new(L2);
L2.Str := S;
L2.Next := L;
L1.Next := L2;
end;

{ Вывод списка }
procedure OutList(L: TList);
var
L1: TList;
begin
if L = nil then exit;
Writeln(L.Str);
L1 := L.Next;
while L1 <> L do
begin
Writeln(L1.Str);
L1 := L1.Next;
end;
end;

var
ListExample: TList;
begin
CreateList(ListExample);
AddToList(ListExample,'asdvgsd');
AddToList(ListExample,'asda');
OutList(ListExample);
DeleteList(ListExample);
end.
[/codebox]

Еще раз рекомендую почитать Вирта. :D


ВСЕМ ЗАВИСТНИКАМ И НЕДОБРОЖЕЛАТЕЛЯМ:)D):

По поводу прог, может быть я где и лоханул :D , но я пытался показать как это делается, а не писал программы на заказ.
 
D

DartVoron

Гость
#7
НУ это и требывалась, Спосибо, а Вирта , случайно нет в электронном виде? :D
 
S

Shader88

Гость
#8
Нет, в электронном нет.
У меня в печатном есть. :)

Так что сам поищи и скачай.

Успехов. :P
 
D

DartVoron

Гость
#9
Может кто знает хороший сайт где есть книги? :)
 
Статус
Закрыто для дальнейших ответов.