Консультация № 178538
21.05.2010, 14:01
0.00 руб.
0 7 1
Добрый день уважаемые эксперты!
Помогите пожалуйста с задачей,очень очень нужно на зачет!
несколько дней назад отправлял эту задачу,но никто не ответил

Задача:Создать два списка. Выдать списки. Добавить поэлементно элементы второго списка после каждого элемента первого списка. Если во втором списке количество элементов больше, чем количество элементов в первом, оставшиеся элементы не добавлять

p.s.нужно реализовать при помощи указателей и динамических переменных (связное хранение)
нужно получить так: a1, b1, a2, b2
версия паскаля-pascal abc
берутся данные из файла

Извините,что трачу ваше время!

Обсуждение

Неизвестный
22.05.2010, 23:50
общий
Продлил "тот" вопрос. Если никто не возмется, завтра сделаю
давно
Академик
320937
2216
23.05.2010, 00:00
общий
angel.nero:
Добрый вечер! Пока вот. Надеюсь завтра к вечеру закончить. За образец взял пример из задачника Усковой. Как ни странно, в учебной литературе по Pascal (по крайней мере, что просмотрел) нет полностью ни одной программы по односвязным спискам.
Код:
program ListDemo;
type
TElem = integer; { Тип информационной части }
TList = ^TNode;
TNode = record
info: TElem;
next: TList;
end;

procedure ZList_Init(var L: TList);
var
n: TList;
begin
new(n);
n^.next := nil;
l:= n;
end;

procedure BList_AddFirst(var l: TList; e: TElem);
var
n: TList;
begin
new(n);
n^.info := e;
n^.next := L;
L := n;
end;

procedure ZList_AddFirst(L: TList; e: TElem);
var
n: TList;
begin
BList_AddFirst(L^.next, e);
end;

procedure ZList_AddLast(L:TList; e: TElem);
begin
while L^.next <> nil do L:= L^.next;
new(L^.next);
L:=L^.next;
L^.info := e;
L^.next := nil;
end;

procedure Insert_After(L:TList; n: integer; e: TElem);
var
i: integer;
p: TList;
tmp: TList;
begin
i:= 0;
p:= L;
while (i<n) and (p^.next <> nil) do
begin
inc(i);
p:= p^.next;
writeln(i, '=>', p^.info);
end;
if (i<n) then
begin
writeln('неудача');
exit;
end
else if (p^.next = nil) then
begin
new(p^.next);
p:=p^.next;
p^.info := e;
p^.next := nil;
end
else
begin
new(tmp);
tmp^.info := e;
tmp^.next := p^.next^.next;
p^.next := tmp;
writeln('yes');
end;
// ZList_DelItem := found;
end;

function Get_Item(L:TList; n: integer): TElem;
var
i: integer;
p: TList;
begin
i:= 0;
p:= L;
while (i<n) and (p^.next <> nil) do
begin
inc(i);
p:= p^.next;
end;
if (i<n) then
Get_Item := -MaxInt-1
else
Get_Item := p^.info;
end;

function List_Length(L:TList): integer;
var
i: integer;
begin
i:= 0;
L:= L^.next;
while (L <> nil) do
begin
L:= L^.next;
inc(i);
end;
List_Length := i;
end;

function ZList_DelItem(L: TList; e: TElem): boolean;
var
n: TList;
p: TList;
found: boolean;
begin
found := false;
p:= L;
while not found and (p^.next <> nil) do
if p^.next^.info = e
then found := true
else p:= p^.next;
if found then
begin
n:= p^.next;
p^.next := n^.next;
dispose(n);
end;
ZList_DelItem := found;
end;

procedure BList_Print(L:TList);
begin
write('<');
while (L <> nil) do
begin
write(L^.info);
if (L^.next <> nil) then write('.');
L:= L^.next;
end;
writeln('>');
end;

procedure ZList_Print(L: TList);
begin
BList_Print(L^.next);
end;

procedure List_Clear(var L:TList);
var
n: TList;
begin
while (L <> nil) do
begin
n:= L;
L := L^.next;
dispose(n);
end;
end;

const
FirstElem = 4444;
var
a, b: TList;
e: TElem;
i: integer;
begin
ZList_Init(a);
ZList_Init(b);
for i:= 1 to 10 do
begin
ZList_AddLast(a, i*2-1);
write('a=>', List_Length(a));
end;

for i:= 1 to 10 do
ZList_AddLast(b, i*2);

{ ZList_AddFirst(L, FirstElem);}
{ for i:= 1 to 10 do}
{ ZList_AddLast(L, i);}
ZList_Print(a);
insert_after(a,10,4);
ZList_Print(a);
ZList_Print(b);
for i:=1 to 12 do
writeln(Get_Item(a,i));

List_Clear(a);
List_Clear(b);

readln;
end.
давно
Академик
320937
2216
25.05.2010, 22:22
общий
angel.nero:
Добрый вечер! Вы пишете
Цитата: 309917
Помогите изменить программу:
1)Вводить с клавиатуры списки
2)Проверить пустой или не пустой список,если пустой то выдать сообщение


Посмотрите, пожалуйста.
Код:
program p178478;
{ Создать два списка. Выдать списки. Добавить поэлементно элементы второго
списка после каждого элемента первого списка. Если во втором списке количество
элементов больше, чем количество элементов в первом,
оставшиеся элементы не добавлять
}
{ RFPRO, lamed }

// Программирование на языке Pascal. Задачник. Под ред. Усковой О.Ф.
// СПб: Питер, 2003
// В программе рассматриваются списки с заглавным звеном, или, "со сторожем"
// Процедуры ZLIst_Init, ZList_AddLast, BList_Print, ZList_Print, List_Clear
// принадлежат Усковой О.Ф. Глава 15. Задание 1
// Префикс Z относится к обработке с заглавным звеном
// Префикс B - без заглавного звена

const
ERROR = -MaxInt - 1; // Возвращаемая ошибка, если не найден элемент списка
// только для целых чисел
name_a = 'a.dat'; // файлы данных для первого
name_b = 'b.dat'; // и второго списков
type
TElem = integer; // Тип информационной части
TList = ^TNode; // Представление списка
TNode = record // Звено списка
info: TElem; // Информационная часть
next: TList; // Следующий элемент
end;
TElemFile = file of TElem; // Тип файла для хранения информационных частей

procedure Files_Create(name_a, name_b: string);
// Создание файлов
// для удобства тестирования в файл a записываются нечетные числа,
// в файл b - четные
var
i, n: integer;
file_a, file_b : TElemFile;
begin
assign(file_a, name_a);
assign(file_b, name_b);
Randomize;

// Количество элементов задается случайным образом
rewrite(file_a);
for i:= 1 to Random(20)+1 do
write(file_a,i*2-1);
close(file_a);

rewrite(file_b);
for i:= 1 to Random(20)+1 do
write(file_b,i*2);
close(file_b);
end;

procedure ZList_Init(var L: TList);
// Инициализация списка с заглавным звеном
var
n: TList;
begin
new(n);
n^.next := nil;
l:= n;
end;

procedure ZList_AddLast(L:TList; e: TElem);
// Добавление элемента в конец списка с заглавным звеном
begin
while L^.next <> nil do L:= L^.next;
new(L^.next);
L:=L^.next;
L^.info := e;
L^.next := nil;
end;

procedure Insert_After(L:TList; n: integer; e: TElem);
// Вставка элемента в список с заглавным звеном
// после элемента с номером n
var
i: integer;
p: TList;
tmp: TList;
begin
i:= 0;
p:= L;
while (i<n) and (p^.next <> nil) do
begin
inc(i);
p:= p^.next;
end;
if (i<n) then
begin
writeln('неудача');
exit;
end
else if (p^.next = nil) then
begin
new(p^.next);
p:=p^.next;
p^.info := e;
p^.next := nil;
end
else
begin
new(tmp);
tmp^.info := e;
tmp^.next := p^.next;
p^.next := tmp;
end;
end;

function Get_Item(L:TList; n: integer): TElem;
// Получение элемента списка с заглавным звеном по номеру
var
i: integer;
p: TList;
begin
i:= 0;
p:= L;
while (i<n) and (p^.next <> nil) do
begin
inc(i);
p:= p^.next;
end;
if (i<n) then
Get_Item := ERROR
else
Get_Item := p^.info;
end;

function List_Length(L:TList): integer;
// Вычисление длины списка с заглавным звеном
var
i: integer;
begin
i:= 0;
L:= L^.next;
while (L <> nil) do
begin
L:= L^.next;
inc(i);
end;
List_Length := i;
end;

procedure BList_Print(L:TList);
// Печать списка без заглавного звена
begin
write('<');
while (L <> nil) do
begin
write(L^.info);
if (L^.next <> nil) then write('.');
L:= L^.next;
end;
writeln('>');
end;

procedure ZList_Print(L: TList);
// Печать списка c заглавным звеном
begin
BList_Print(L^.next);
end;

procedure List_Clear(var L:TList);
// Удаление списка
var
n: TList;
begin
while (L <> nil) do
begin
n:= L;
L := L^.next;
dispose(n);
end;
end;

procedure FileToList(fname: string; var L: TList);
// Чтение файла в список
var
e: TElem;
f: TElemFile;
begin
assign(f, fname);
if not FileExists(fname) then
exit;
reset(f);
while not eof(f) do
begin
read(f, e);
ZList_AddLast(L, e);
end;
close(f);
end;

procedure KbdToList(var L: TList);
// Чтение с клавиатуры в список
var
e: TElem;
f: TElemFile;
i, n: integer;
begin
write('n=');
readln(n);

if n>=1 then begin
for i:= 1 to n do begin
write('e=');
readln(e);
ZList_AddLast(L,e);
end;
end
else
writeln('Нет данных');
end;

var
a, b: TList; // списки
e: TElem; // элемент типа информационной части
i: integer; // счетчик припроходе по циклу слияния списков
len_a, len_b: integer; // длина первого списка

begin // главная программа
//// Files_Create(name_a, name_b);

ZList_Init(a);
writeln('Ввод списка a');
KbdToList(a);
//// FileToList(name_a, a);

ZList_Init(b);
writeln('Ввод списка b');
KbdToList(b);
//// FileToList(name_b, b);


len_a := List_Length(a);
len_b := List_Length(b);
if (len_a=0) or (len_b=0) then begin
if (len_a=0) then
writeln('Список a пуст');
if (len_b=0) then
writeln('Список b пуст');
end
else begin
writeln('Начальные значения');
write('a=>');
ZList_Print(a);

write('b=>');
ZList_Print(b);

len_a := List_length(a);
i:= 1;
e:= Get_Item(b,i);
while (i<=len_a) and (e <> ERROR) do begin
Insert_After(a,2*i-1,e);
inc(i);
e:= Get_Item(b,i);
end;

writeln('После вставки');
write('a=>');
ZList_Print(a);
end;

List_Clear(a);
List_Clear(b);

end.

Неизвестный
26.05.2010, 21:05
общий
lamed:
Добрый вечер!
вроде всё так!Если честно то я некоторое так и не понимаю,зачем нам заглавные звенья итд???
давно
Академик
320937
2216
26.05.2010, 22:43
общий
angel.nero:
Доброй ночи! Не я их придумал. Какие-то операции проще, например, добавление, удаление. Не надо выяснять каждый раз: а не первое ли это звено. Можете посмотреть примеры, кстати, у Пильщикова и у той же Усковой.
Неизвестный
27.05.2010, 03:08
общий
lamed:
Доброй!
Пильщиков сборник задач и упражнений,вроде так книга называется?
давно
Академик
320937
2216
29.05.2010, 08:38
общий
это ответ
Здравствуйте, angel.nero! В ответе модификация программы p178478. Предложен другой, более быстрый спсоб вставки элементов второго списка в первый. Кроме того, исключены процедуры BList_. Проверено ABC.
Код:
program p178538;
{ Создать два списка. Выдать списки. Добавить поэлементно элементы второго
списка после каждого элемента первого списка. Если во втором списке количество
элементов больше, чем количество элементов в первом,
оставшиеся элементы не добавлять
}
{ RFPRO, lamed }

// 1.Источник.Программирование на языке Pascal. Задачник. Под ред. Усковой О.Ф.
// СПб: Питер, 2003
// В программе рассматриваются списки с заглавным звеном, или, "со сторожем"
// На основе процедур ZLIst_Init, ZList_AddLast, BList_Print,
// ZList_Print, List_Clear, [1], Глава 15. Задание 1
// Префикс Z относится к обработке с заглавным звеном

const
ERROR = -MaxInt - 1; // Возвращаемая ошибка, если не найден элемент списка
// только для целых чисел
name_a = 'a.dat'; // файлы данных для первого
name_b = 'b.dat'; // и второго списков
type
TElem = integer; // Тип информационной части
TList = ^TNode; // Представление списка
TNode = record // Звено списка
info: TElem; // Информационная часть
next: TList; // Следующий элемент
end;
TElemFile = file of TElem; // Тип файла для хранения информационных частей

procedure Files_Create(name_a, name_b: string);
// Создание файлов
// для удобства тестирования в файл a записываются нечетные числа,
// в файл b - четные
var
i, n: integer;
file_a, file_b : TElemFile;
begin
assign(file_a, name_a);
assign(file_b, name_b);
Randomize;

// Количество элементов задается случайным образом
rewrite(file_a);
for i:= 1 to Random(20)+1 do
write(file_a,i*2-1);
close(file_a);

rewrite(file_b);
for i:= 1 to Random(20)+1 do
write(file_b,i*2);
close(file_b);
end;

procedure ZList_Init(var L: TList);
// Инициализация списка с заглавным звеном
var
n: TList;
begin
new(n);
n^.next := nil;
l:= n;
end;

procedure ZList_AddLast(L:TList; e: TElem);
// Добавление элемента в конец списка с заглавным звеном
begin
while L^.next <> nil do L:= L^.next;
new(L^.next);
L:=L^.next;
L^.info := e;
L^.next := nil;
end;

procedure Insert_List(L1, L2:TList; var code: integer);
// Вставка элемента в список с заглавным звеном
// после элемента с номером n
var
p1, p2: TList;
tmp: TList;
begin
p1:= L1^.next;
p2 := L2^.next;
if (p1 = nil) or (p2 = nil) then
begin
code := -1;
exit;
end
else
begin
while (p1 <> nil) and (p2 <> nil) do
begin
new(tmp);
tmp^.info := p2^.info;
tmp^.next := p1^.next;
p1^.next := tmp;
p2 := p2^.next;
p1 := tmp^.next;
end;
if (p1 = nil) and (p2 = nil) then
code := 0
else
code := 1;
end
end;

function List_Length(L:TList): integer;
// Вычисление длины списка с заглавным звеном
var
i: integer;
begin
i:= 0;
L:= L^.next;
while (L <> nil) do
begin
L:= L^.next;
inc(i);
end;
List_Length := i;
end;

procedure ZList_Print(L: TList);
// Печать списка c заглавным звеном
begin
write('<');
L := L^.next;
while (L <> nil) do
begin
write(L^.info);
if (L^.next <> nil) then write('.');
L:= L^.next;
end;
writeln('>');
end;

procedure List_Clear(var L:TList);
// Удаление списка
var
n: TList;
begin
while (L <> nil) do
begin
n:= L;
L := L^.next;
dispose(n);
end;
end;

procedure FileToList(fname: string; var L: TList);
// Чтение файла в список
var
e: TElem;
f: TElemFile;
begin
assign(f, fname);
if not FileExists(fname) then
exit;
reset(f);
while not eof(f) do
begin
read(f, e);
ZList_AddLast(L, e);
end;
close(f);
end;

var
a, b: TList; // списки
code: integer; // код "возврата" процедуры вставки

begin // главная программа
Files_Create(name_a, name_b);

ZList_Init(a);
FileToList(name_a, a);

ZList_Init(b);
FileToList(name_b, b);

writeln('Начальные значения');
write('a=>');
ZList_Print(a);
writeln('Длина = ',List_Length(a));

write('b=>');
ZList_Print(b);
writeln('Длина = ',List_Length(b));

Insert_List(a,b,code);
case code of
-1: writeln('вставка невозможна, по меньшей мере один из списков пуст');
0 : writeln('все элементы использованы');
1 : writeln('не все элементы использованы')
else
writeln('неизвесная ошибка');
end;

writeln('После вставки');
write('a=>');
ZList_Print(a);
writeln('Длина = ',List_Length(a));

List_Clear(a);
List_Clear(b);

readln;
end.


Пример работы
Код:
Начальные значения
a=><1.3.5.7.9.11.13.15.17.19.21.23.25>
Длина = 13
b=><2.4.6.8.10.12.14.16.18.20.22.24>
Длина = 12
не все элементы использованы
После вставки
a=><1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25>
Длина = 25
Форма ответа