Вопрос № 178538: Добрый день уважаемые эксперты! Помогите пожалуйста с задачей,очень очень нужно на зачет! несколько дней назад отправлял эту задачу,но никто не ответил Задача:Создать два списка. Выдать списки. Добавить поэлементно элементы второго списк...
Вопрос № 178538:
Добрый день уважаемые эксперты! Помогите пожалуйста с задачей,очень очень нужно на зачет! несколько дней назад отправлял эту задачу,но никто не ответил
Задача:Создать два списка. Выдать списки. Добавить поэлементно элементы второго списка после каждого элемента первого списка. Если во втором списке количество элементов больше, чем количество элементов в первом, оставшиеся элементы не добавлять
p.s.нужно реализовать при помощи указателей и динамических переменных (связное хранение) нужно
получить так: a1, b1, a2, b2 версия паскаля-pascal abc берутся данные из файла
Отвечает lamed, Профессионал :
Здравствуйте, angel.nero! В ответе модификация программы p178478. Предложен другой, более быстрый спсоб вставки элементов второго списка в первый. Кроме того, исключены процедуры BList_. Проверено ABC.
Код:
program p178538; { Создать два списка. Выдать списки. Добавить поэлементно
элементы второго списка после каждого элемента первого списка. Если во втором списке количество элементов больше, чем количество элементов в первом, оставшиеся элементы не добавлять } { RFPRO, lamed }
// 1.Источник.Программирование на языке Pascal. Задачник. Под ред. Усковой О.Ф. // СПб: Питер, 2003 // В программе рассматриваются списки с заглавным звеном, или, "со сторожем" // На основе процедур ZLIst_Init, ZList_AddLast, BList_Pri
nt, // 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^.in
fo); 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);
Insert_List(a,b,code); case code of -1: writeln('вставка невозможна, по меньшей мере один из списков пуст'); 0 : writeln('все элементы использованы'); 1 : writeln('не все элементы использованы') else writeln('неизвесная ошибка'); 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
Ответ отправил: lamed, Профессионал
Ответ отправлен: 29.05.2010, 08:38
Номер ответа: 261737
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 261737
на номер 1151 (Россия) |
Еще номера »
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.