
12_2_списки.ppt
- Количество слайдов: 28
Лекция 12 СПИСКИ Программирование
Структура элемента списка Структура inf; name Type inf= record name: string [20]; size, old: integer; end; Структура Node Link = ^Node; Node = record Data: inf; Next: Link; end; var a: Link; (a: ^Node; ) b: Node; d: inf; size old информация struct inf { char name[20]; int size; int old; }; Data Next элемент struct Node { Node* Next; inf Data; }; Node *a; Node b; inf d;
СТЕК q Var S : Link; Инициализация стека q S=Nil; Добавление элемента в стек q procedure push(var ptr: Link; c: inf); var p: Link; begin P new(p); p^. data: =c; p^. next: =ptr; ptr: =p; end; S Data Next Nil Ptr S информация С иформация Data Next
Добавление в стек S – верхушка стека A – информация procedure push(var ptr: Link; c: inf); var p: Link; begin Тело главной программы S=nil Для I от 1 до 5 Data end; Next Data Ввести A PUSH(S, A) Конец цикла Next Data new(p); p^. data: =c; p^. next: =ptr; ptr: =p; Next Data Next информация Ptr S P Data Next Nil
Удаление из стека procedure Del_El_Stek(var ptr: Link); var p: Link; begin if ptr<>nil then begin p: =ptr; ptr: =ptr^. next; dispose(p) end; P Ptr S Data Next Data Next Nil
Печать стека procedure Print_Stek( ptr: Link); begin while ptr<>nil do begin Print(ptr^. Data) ptr: =ptr^. next; end; S Ptr Data Next Data Next Nil
Задача Прочитать информацию из файла в стек и вывести содержимое стека. Если очередной символ – знак минус, то удалить предыдущую букву из стека
Пример программы program Examp_Stek(input, Output, f); uses crt; Type Tpoint=^Trec. Point; TData=char; Trec. Point=record Next: Tpoint; Letter: Tdata; end; var c: tdata; Top: Tpoint; f: text;
Основные функции работы со стеком Procedure Init. Stek(var s: Tpoint); begin s: =nil end ; procedure push(var ptr: tpoint; c: Tdata); var p: tpoint; begin new(p); p^. letter: =c; p^. next: =ptr; ptr: =p; end; function Pop(var ptr: tpoint): Tdata; var p: tpoint; begin pop: =char(0); if ptr<>nil then begin pop: =ptr^. letter; p: =ptr; ptr: =ptr^. next; dispose(p) end;
Продолжение procedure print. Stek(var ptr: tpoint); var p: tpoint; begin while ptr<>nil do begin write(ptr^. letter); p: =ptr; ptr: =ptr^. next; dispose(p) end;
Продолжение begin initstek(top); Assign(f, 'stek. dat'); reset(f); writeln; while not eof(f) do begin read(f, c); write(c); if c='-' then begin write(' del ', pop(top)) end else Push(top, c) end; writeln; Print. Stek(top); readkey; end.
Результат работы программы Содержимое исходного файла Mamm-a p-Papa 4891254371 Процесс считывания Mamm- del ma p- del p. Papa 4891254371 Распечатка стека 1734521984 apa. P ama. M
Применение стеков для анализа выражений Проверка правильности расстановки скобок. 1 + (a + b) * (2 – (c – d) * (a + b)) 0 1 2 10 1 + a[i+1] * (2 – c[i– 1] * (a[i] + 1)) [] () () ()() [] ()
Двухсвязный кольцевой список Элемент списка Фамилия Имя UP № цеха DOWN Количество изделий INF Задача: Создать таблицу выработки работников завода по цехам. Программа должна позволять: Добавлять и удалять записи Выводить ведомость зарплаты для заданного цеха (зарплата зависит от выработки сотрудника и стоимости изделия)
Структура кольца HEAD DOWN UP INF P P^. UP DOWN INF DOWN UP P^. UP UP P INF DOWN UP P^. DOWN INF P^. DOWN
Двухсвязный кольцевой список UP CONST N_fam=20; n_name=30; INF DOWN Структура данных {типы данных} {строковые для фамилии и имени} t_fam= string[N_fam]; t_name=string[n_name]; {запись из 4 полей - информационный элемент списка} STROKA=RECORD FAM: t_fam; {фамилия} NAME: t_name; {имя} ceh, kol: integer; {номер цеха и количество изделий} END;
Двухсвязный кольцевой список UP VAR INF DOWN Переменные fdan: file of stroka; {двоичный файл для хранения данных } CH: CHAR; HEAD: KOLCO; {указатель на первый элемент списка}
Главная программа BEGIN связь с файлом ASSIGN(FDAN, 'FDAN. DAT'); INIT(HEAD); вызов начального меню REPEAT CH: =MENU 1; CASE CH OF '1': FORMF; {загрузка из файла} '2': FORMM; {новый список} END UNTIL CH='2';
Главная программа (прод) вызов основного меню REPEAT CH: =MENU 2; CASE CH OF '1': INSEPT(HEAD); '2': DELETE; '3': SELECT_PRI; '4': ENDP; END; UNTIL CH='4' END. {добавление записи} {удаление записи} {выборочная печать} {завершение работы}
Вывод первого меню вывод первого меню FUNCTION MENU 1: CHAR; VAR CH: CHAR; BEGIN REPEAT WRITELN(' ВВЕДИТЕ НОМЕР РЕЖИМА'); WRITELN(' 1 ФОРМИРОВАНИЕ ИСХОДНОГО ФАЙЛА'); WRITELN(' 2 РАБОТА С БАЗОЙ ДАННЫХ'); READLN(CH); UNTIL (CH IN ['1', '2']); MENU 1: =CH END;
Вывод основного меню второе меню FUNCTION MENU 2: CHAR; VAR CH: CHAR; BEGIN REPEAT WRITELN(' ВВЕДИТЕ НОМЕР РЕЖИМА'); WRITELN(' 1 ДОБАВЛЕНИЕ ИНФОРМАЦИИ'); WRITELN(' 2 ИСКЛЮЧЕНИЕ ИНФОРМАЦИИ'); WRITELN(' 3 ВЫВОД ИНФОРМАЦИИ НА ЭКРАН'); WRITELN(' 4 КОНЕЦ РАБОТЫ'); READLN(CH); {выводится на экран до тух пор, пока не будет введен один из номеров пунктов меню } UNTIL (CH IN ['1'. . '4']); MENU 2: =CH END;
Инициализация списка HEAD INF DOWN UP с головным пустым элементом PROCEDURE INIT(VAR HEAD: KOLCO); BEGIN NEW(HEAD); HEAD^. UP: =HEAD; HEAD^. DOWN: =HEAD; WITH HEAD^. INF DO BEGIN FAM: =' '; NAME: =' '; ceh: =0; Kol: =0 END;
Вставка элемента (после) HEAD INF DOWN UP DOWN INF DOWN UP UP PROCEDURE INS( INFORM: STROKA; VAR AFTER: KOLCO); VAR P: KOLCO; AFTER BEGIN NEW(P); P^. UP: =AFTER; P^. DOWN: =AFTER^. DOWN; AFTER^. DOWN: =P; P^. DOWN^. UP: =P; P^. INF: =INFORM END;
Удаление элемента из списка INF DOWN UP P HEAD UP PROCEDURE DEL( VAR P: KOLCO); BEGIN { удаление Р из списка } P^. DOWN^. UP: =P^. UP; P^. UP^. DOWN: =P^. DOWN; Dispose(P); {? ? !!!!!!очень аккуратно} END;
Удаление первого элемента HEAD P INF DOWN UP PROCEDURE DEL( VAR P: KOLCO); BEGIN { удаление Р из списка } P^. DOWN^. UP: =P^. UP; P^. UP^. DOWN: =P^. DOWN; Dispose(P); {? ? !!!!!!очень аккуратно} END;
Загрузка файла в список PROCEDURE FORMM; VAR INFORM: STROKA; BEGIN RESET(FDAN); WHILE NOT EOF(FDAN) DO BEGIN READ(FDAN, INFORM); {чтение строки из файла} INS(INFORM, HEAD); {вставка строки в список} VYVOD(INFORM) {отображение на экране} END;
Ввод и добавление информации PROCEDURE INSEPT(VAR P: KOLCO); VAR INFORM: STROKA; BEGIN VVOD(INFORM); {можно организовать поиск записи, после которой вставить следующую} {вставка после P} INS(INFORM, P) END;
Ввод информации с клавиатуры ввод строки списка PROCEDURE VVOD(VAR INFORM: STROKA); BEGIN WITH INFORM DO BEGIN WRITE(' ВВЕДИТЕ ФАМИЛИЮ '); READLN(FAM); WRITE(' ВВЕДИТЕ ИМЯ '); READLN(NAME); WRITE(' ВВЕДИТЕ НОМЕР ЦЕХА '); READLN(CEH); WRITE(' ВВЕДИТЕ КОЛИЧЕСТВО ИЗДЕЛИЙ '); READLN(KOL); END;