Цель работы: изучить СД типа «линейный список», научиться их программно реализовывать и использовать.
З а д а н и е
1. Для СД типа «линейный список» определить:
1.1. Абстрактный уровень представления СД:
1.1.1. Характер организованности и изменчивости.
1.1.2. Набор допустимых операций.
1.2. Физический уровень представления СД:
1.2.1. Схему хранения.
1.2.2. Объем памяти, занимаемый экземпляром СД.
1.2.3. Формат внутреннего представления СД и способ его интерпретации.
1.2.4. Характеристику допустимых значений.
1.2.5. Тип доступа к элементам.
1.3. Логический уровень представления СД.
Способ описания СД и экземпляра СД на языке программирования.
2. Реализовать СД «линейный список» в соответствии с вариантом индивидуального задания (см. табл.14) в виде модулей на языках Pascal и С.
3. Разработать программы на языках Pascal и С для решения задачи в соответствии с вариантом индивидуального задания (см. табл.14) с использованием модуля, полученного в результате выполнения пункта 2 задания.
Таблица 14
|
|
Варианты индивидуальных заданий
Номер варианта | Номер модуля | Задача |
Окончание табл.14
Задачи
1. Многочлен P(x)=anxn + an-1xn-1 +... + a1x + a0 с целыми коэффициентами можно представить в виде списка, причем если ai = 0, то соответствующее звено не включать в список. Определить логическую функцию РАВНО(p, q), проверяющие на равенство многочлены p и q.
2. Дано натуральное число n целые числа a1,a2,...,an. Требуется получить последовательность x1,y1;x2,y2;...;xk,yk, где x1,...,xk — взятые в порядке следования (слева на право) четные члены последовательности a1,...,an, a y1,...,yk — нечетные члены, к = min(m,l).
3. Дано натуральное число n и целые числа a1,a2,...,an. Вычислить , где среднее арифметическое чисел a1,...,an.
4. Даны натуральные числа k,m,n, последовательности символов s1,...,sk,t1,...,tm,u1,...,un. Получить по одному разу те символы, которые входят во все три последовательности.
5. Многочлен P(x)=anxn + an-1xn- 1+... + a1x + a0 с целыми коэффициентами можно представить в виде списка, причем если ai=0, то соответствующее звено не включать в список. Определить функцию, вычисляющую значения многочлена в точке х.
6. Даны натуральное число n, символы s1,...,sn. Получить символы, принадлежащие последовательности s1,...,sn, которые входят в нее по одному разу.
|
|
7. Многочлен P(x) = anxn + an-1xn- 1+... + a1x + a0 с целыми коэффициентами можно представить в виде списка, причем если ai = 0, то соответствующее звено не включать в список. Определить процедуру, которая стоит многочлен p — сумму многочленов q и r;
8. Многочлен P(x) = anxn + an-1xn-1 +... + a1x + a0 с целыми коэффициентами можно представить в виде списка, причем если ai = 0, то соответствующее звено не включать в список. Определить процедуру ВЫВОД(p,y), которая печатает многочлен р как многочлен от переменной, однобуквенное имя которой является значением литерного параметра y.
9. Многочлен P(x) = anxn + an-1xn-1 +... + a1x + a0 с целыми коэффициентами можно представить в виде списка, причем если ai = 0, то соответствующее звено не включать в список. Определить процедуру, которая строит многочлен р — произведение многочленов q и r.
10. Проверить, удовлетворяют ли элементы списка (базовый тип integer) закону x = f(х0,h), где х — элемент списка,h — шаг, x0 — начальный элемент списка.
Пример: x0 = 5, h = 1. x1 = 6, x2 = 7, x3 = 8... Элементы списка удовлетворяют закону х = f(5,1).
11. Многочлен P(x) = anxn + an-1xn-1 +... + a1x + a0 с целыми коэффициентами можно представить в виде списка, причем если ai = 0, то соответствующее звено не включать в список. Построить многочлен p, являющийся производной многочлена q.
Модули
1. ОЛС в динамической памяти (базовый тип — pointer). Выделение памяти под информационную часть элемента ОЛС и запись в нее значения выполняется до обращения к процедуре PutList. При выполнении процедуры GetList память информационной части элемента не освобождается и ее адрес является выходным параметром.
Спецификация СД на языке Pascal:
Unit List1;
Interface
Const ListOk = 0;
ListNotMem = 1;
ListUnder = 2;
ListEnd = 3;
Type BaseType = Pointer;
PtrEl = ^Element;
Element= Record
Data: BaseType;
Next: PtrEl;
End;
List= Record
Start,Ptr: PtrEl;
N: Word
End;
Var ListError: 0..3;
Procedure InitList(var L:List);
Procedure PutList(var L:List; E:BaseType);
Procedure GetList(var L:List; var E:BaseType);
Procedure ReadList(var L:List; var E:BaseType);
Function FullList(var L:List):boolean;
Function EndList(var L:List):boolean;
Function Count(var L:List):Word;
Procedure BeginPtr(var L:List);
Procedure EndPtr(var L:List);
Procedure MovePtr(var L:List);
Procedure MoveTo(var L:List; N:word);
Procedure DoneList(var L:List);
Procedure CopyList(var L1,L2:List);
Спецификация СД на языке C:
#if!defined(__LIST1_H)
const ListOk = 0;
const ListNotMem = 1;
const ListUnder = 2;
const ListEnd = 3;
typedef void *BaseType;
typedef struct element *ptrel;
typedef struct element {basetype data;
ptrel next;};
typedef struct List {ptrel Start;
ptrel ptr;
unsigned int N}
short ListError;
void InitList(List *L);
void PutList(List *L, BaseType E);
void GetList(List *L, BaseType *E);
void ReadList(List *L,BaseType *E);
int FullList(List *L);
int EndList(List *L);
usigned int Count(List *L);
void BeginPtr(List *L);
void EndPtr(List *L);
void MovePtr(List *L);
void MoveTo(List *L, unsigned int n);
void DoneList(List *L);
void CopyList(List *L1,List *L2);
#endif
2. ОЛС в динамической памяти (базовый тип определяется задачей). Выделение памяти под информационную часть элемента ОЛС и запись в нее значения осуществляется при выполнении процедуры PutList. При выполнении процедуры GetList память, занимаемая элементом, освобождается.
Спецификация СД на языке Pascal:
Unit List2;
Interface
Const ListOk = 0;
ListNotMem = 1;
ListUnder = 2;
ListEnd = 3;
Type BaseType = …; { определить!!!}
PtrEl = ^Element;
Element = Record
Data: BaseType;
Next: PtrEl;
End;
List = Record
Start,Ptr: PtrEl;
N: Word;
End;
Var ListError: 0..3;
Procedure InitList(var L:List);
Procedure PutList(var L:List; E:Basetype);
Procedure GetList(var L:List; var E:BaseType);
Procedure ReadList(var L:List; var E:BaseType);
Function FullList(var L:List):boolean;
Function EndList(var L:List):boolean;
Function Count(var L:List):Word;
Procedure BeginPtr(var L:List);
Procedure EndPtr(var L:List);
Procedure MovePtr(var L:List);
Procedure MoveTo(var L:List; N:word);
Procedure DoneList(var L:List);
Procedure CopyList(var L1,L2:List);
Спецификация СД на языке C:
#if!defined(__LIST2_H)
const ListOk = 0;
const ListNotMem = 1;
const ListUnder = 2;
const ListEnd = 3;
typedef < определить > BaseType;
typedef struct element *ptrel;
typedef struct element {basetype data;
ptrel next;};
typedef struct List {ptrel Start;
ptrel ptr;
unsigned int N}
short ListError;
void InitList(List *L);
void PutList(List *L, BaseType E);
void GetList(List *L, BaseType *E);
void ReadList(List *L,BaseType *E);
int FullList(List *L);
int EndList(List *L);
usigned int Count(List *L);
void BeginPtr(List *L);
void EndPtr(List *L);
void MovePtr(List *L);
void MoveTo(List *L, unsigned int n);
void DoneList(List *L);
void CopyList(List *L1,List *L2);
#endif
3. ОЛС в динамической памяти (базовый тип — pointer). Выделение памяти под информационную часть элемента ОЛС и запись в нее значения происходит при выполнении процедуры PutList. При выполнении процедуры GetList память, занимаемая элементом, освобождается. Размер информационной части элемента задается при инициализации ОЛС и сохраняется в дескрипторе.
|
|
Спецификация СД на языке Pascal:
Unit List3;
Interface
Const ListOk = 0;
ListNotMem = 1;
ListUnder = 2;
ListEnd = 3;
Type BaseType = Pointer;
PtrEl = ^Element;
Element = Record
Data: BaseType;
Next: PtrEl;
End;
List = Record
Start,Ptr: PtrEl;
N: Word; { длина списка }
Size: Word { размер информационной}
End; { части элемента }
Var ListError: 0..3;
Procedure InitList(var L:List; Size:Word);
Procedure PutList(var L:List; var E);
Procedure GetList(var L:List; var E);
Procedure ReadList(var L:List; var E);
Function FullList(var L:List):boolean;
Function EndList(var L:List):boolean;
Function Count(var L:List):Word;
Procedure BeginPtr(var L:List);
Procedure EndPtr(var L:List);
Procedure MovePtr(var L:List);
Procedure MoveTo(var L:List; N:word);
Procedure DoneList(var L:List);
Procedure CopyList(var L1,L2:List);
Спецификация СД на языке C:
#if!defined(__LIST3_H)
const ListOk = 0;
const ListNotMem = 1;
const ListUnder = 2;
const ListEnd = 3;
typedef void* BaseType;
typedef struct element *ptrel;
typedef struct element {basetype data;
ptrel next;};
typedef struct List {ptrel Start;
ptrel ptr;
unsigned int N;//размер списка
unsigned int size;}//размер информационной части элемента
short ListError;
void InitList(List *L);
void PutList(List *L, BaseType E);
void GetList(List *L, BaseType *E);
void ReadList(List *L,BaseType *E);
int FullList(List *L);
int EndList(List *L);
usigned int Count(List *L);
void BeginPtr(List *L);
void EndPtr(List *L);
void MovePtr(List *L);
void MoveTo(List *L, unsigned int n);
void DoneList(List *L);
void CopyList(List *L1,List *L2);
#endif
4. Элементы ОЛС находятся в массиве MemList, расположенном в статической памяти. Базовый тип — pointer. Каждый элемент массива имеет признак того, является ли он элементом ОЛС или «свободен». Выделение памяти под информационную часть элемента ОЛС и запись в нее значения выполняется до обращения к процедуре PutList. При выполнении процедуры GetList память информационной части элементане освобождается и ее адрес является выходным параметром.
Спецификация СД на языке Pascal:
Unit List4;
Interface
Const ListOk = 0;
ListNotMem = 1;
ListUnder = 2;
ListEnd = 3;
SizeList = 100;
Type BaseType = Pointer;
Index = 0..SizeList;
PtrEl = Index;
Element = Record
Data: BaseType;
Next: PtrEl;
Flag: Boolean {TRUE, если элемент}
{принадлежит ОЛС }
End; {FALSE, если “свободен”}
List = Record
Start,Ptr: PtrEl;
|
|
N: Word
End;
Var MemList: array[Index] of Element;
ListError: 0..3;
Procedure InitList(var L:List);
Procedure PutList(var L:List; E:BaseType);
Procedure GetList(var L:List; var E:BaseType);
Function ReadList(var L:List):Pointer;
Function FullList(var L:List):boolean;
Function EndList(var L:List):boolean;
Function Count(var L:List):Word;
Procedure BeginPtr(var L:List);
Procedure EndPtr(var L:List);
Procedure MovePtr(var L:List);
Procedure MoveTo(var L:List; N:word);
Procedure DoneList(var L:List);
Procedure CopyList(var L1,L2:List);
Implementation
Procedure InitMem; forward; {устанавливает Flag каждого элемента в FALSE, вызывается в разделе операторов модуля}
Function EmptyMem: boolean; forward; {возвращает TRUE, если в массиве нет свободных элементов}
Function NewMem: word; forward; {возвращает номер свободного элемента}
Procedure DisposeMem(n:word); forward; {делает n-й элемент массива свободным}
Спецификация СД на языке C:
#if!defined(__LIST4_H)
#define SizeList 100
const ListOk = 0;
const ListNotMem = 1;
const ListUnder = 2;
const ListEnd = 3;
typedef void *BaseType;
typedef unsigned ptrel;
typedef struct element {basetype data;
ptrel next; /*flag=1 если элемент принадлежит ОЛС*/
int flag;}; //flag=0 если свободен
typedef struct List{ptrel Start;
ptrel ptr;
unsigned int N}
element MemList[SizeList];
short ListError;
void InitList(List *L)
void PutList(List *L, BaseType E)
void GetList(List *L, BaseType *E)
void ReadList(List *L,BaseType *E)
int FullList(List *L)
int EndList(List *L)
usigned int Count(List *L)
void BeginPtr(List *L)
void EndPtr(List *L)
void MovePtr(List *L)
void MoveTo(List *L, unsigned int n)
void DoneList(List *L)
void CopyList(List *L1,List *L2)
void InitMem()/*присваивает Flag каждoго элемента в 0*/
int EmptyMem() /*возвращает 1, если в массиве нет свободных элементов*/
unsigned NewMem()//возвращает номер свободного элемента
void DisposeMem(unsigned n) /*делает n-й элемент масcива cвободным*/
#endif
5. Элементы ОЛС находятся в массиве MemList, расположенном в статической памяти. Базовый тип зависит от задачи. «Свободные» элементы массива объединяются в список, на начало которого указывает поле-указатель первого элемента массива. Выделение памяти под информационную часть элемента ОЛС и запись в нее значения происходит при выполнении процедуры PutList. При выполнении
процедуры GetList память, занимаемая элементом, освобождается.
Спецификация СД на языке Pascal:
Unit List5;
Interface
Const ListOk = 0;
ListNotMem = 1;
ListUnder = 2;
ListEnd = 3;
SizeList = 100;
Type BaseType = …; {определить!!!}
Index = 0..SizeList;
PtrEl = Index;
Element = Record Data: BaseType;
Next: PtrEl;
End;
List = Record
Start,Ptr: PtrEl;
N: Word
End;
Var MemList: array[Index] of Element;
ListError: 0..3;
Procedure InitList(var L:List);
Procedure PutList(var L:List; E:BaseType);
Procedure GetList(var L:List; var E:BaseType);
Procedure ReadList(var L:List; var E:BaseType):
Function FullList(var L:List):boolean;
Function EndList(var L:List):boolean;
Function Count(var L:List):Word;
Procedure BeginPtr(var L:List);
Procedure EndPtr(var L:List);
Procedure MovePtr(var L:List);
Procedure MoveTo(var L:List; N:word);
Procedure DoneList(var L:List);
Procedure CopyList(var L1,L2:List);
Implementation
Procedure InitMem; forward; {связывает все элементы массива в список свободных элементов}
Function EmptyMem: boolean; forward; {возвращает TRUE, если в массиве нет свободных элементов}
Function NewMem: word; forward; {возвращает номер свободного элемента и исключает его из ССЭ}
Procedure DisposeMem(n:word); forward; {делает n-й элемент массива
свободным и включает его в ССЭ}
Спецификация СД на языке C:
#if!defined(__LIST5_H)
#define SizeList 100
const ListOk = 0;
const ListNotMem = 1;
const ListUnder = 2;
const ListEnd = 3;
typedef <определить> BaseType;
typedef unsigned ptrel;
typedef struct element {basetype data;
ptrel next; };
typedef struct List {ptrel Start;
ptrel ptr;
unsigned int N}
element MemList[SizeList];
short ListError;
void InitList(List *L)
void PutList(List *L, BaseType E)
void GetList(List *L, BaseType *E)
void ReadList(List *L,BaseType *E)
int FullList(List *L)
int EndList(List *L)
usigned int Count(List *L)
void BeginPtr(List *L)
void EndPtr(List *L)
void MovePtr(List *L)
void MoveTo(List *L, unsigned int n)
void DoneList(List *L)
void CopyList(List *L1,List *L2)
void InitMem()/*присваивает Flag каждoго элемента в 0*/
int EmptyMem() /*возвращает 1, если в массиве нет свободных элементов*/
unsigned NewMem()//возвращает номер свободного элемента
void DisposeMem(unsigned n) /*делает n-й элемент масcива cвободным*/
#endif
6. ПЛС. Массив, на основе которого реализуется ПЛС, находится в статической памяти (базовый тип элемента — pointer). Выделение памяти под информационную часть элемента ПЛС и запись в нее значения происходит при выполнении процедуры PutList. При выполнении процедуры GetList память, занимаемая элементом, освобождается. Размер информационной части элемента задается при инициализации ПЛС и сохраняется в дескрипторе.
Спецификация СД на языке Pascal:
Unit List6;
Interface
Const ListOk = 0;
ListNotMem = 1;
ListUnder = 2;
ListEnd = 3;
Type BaseType = Pointer;
Index = 0..100;
PtrEl = Index;
List = Record
MemList: array[Index] of BaseType;
Ptr: PtrEl;
N: Word; { длина списка }
Size: Word { размер информационной }
End; { части элемента }
Var ListError: 0..3;
Procedure InitList(var L:List; Size:Word);
Procedure PutList(var L:List; var E);
Procedure GetList(var L:List; var E);
Procedure ReadList(var L:List; var E);
Function FullList(var L:List):boolean;
Function EndList(var L:List):boolean;
Function Count(var L:List):Word;
Procedure BeginPtr(var L:List);
Procedure EndPtr(var L:List);
Procedure MovePtr(var L:List);
Procedure MoveTo(var L:List; N:word);
Procedure DoneList(var L:List);
Procedure CopyList(var L1,L2:List);
Спецификация СД на языке C:
#if!defined(__LIST6_H)
#define SizeList 100
const ListOk = 0;
const ListNotMem = 1;
const ListUnder = 2;
const ListEnd = 3;
typedef void *BaseType;
typedef unsigned ptrel;
typedef struct List {basetype MemList[SizeList];
ptrel ptr;
unsigned int N;
unsigned int Size;};
short ListError;
void InitList(List *L)
void PutList(List *L, BaseType E)
void GetList(List *L, BaseType *E)
void ReadList(List *L,BaseType *E)
int FullList(List *L)
int EndList(List *L)
usigned int Count(List *L)
void BeginPtr(List *L)
void EndPtr(List *L)
void MovePtr(List *L)
void MoveTo(List *L, unsigned int n)
void DoneList(List *L)
void CopyList(List *L1,List *L2)
#endif
7. ПЛС. Массив, на основе которого реализуется ПЛС, находится в динамической памяти (базовый тип элемента определяется задачей). Память под массив выделяется при инициализации ПЛС и количество элементов сохраняется в дескрипторе.
Спецификация СД на языке Pascal:
Unit List7;
Interface
Const ListOk = 0;
ListNotMem = 1;
ListUnder = 2;
ListEnd = 3;
Type BaseType = …; {определить!!!}
Index = 0..65520 div sizeof(BaseType);
TMemList = array[Index] of BaseType;
PtrEl = Index;
List = Record
PMemList: ^TmemList;
Ptr: PtrEl;
N: Word; { длина списка }
SizeМем: Word { размер массива }
End;
Var ListError: 0..3;
Procedure InitList(var L:List; SizeMem:Word);
Procedure PutList(var L:List; var E:BaseType);
Procedure GetList(var L:List; var E:BaseType);
Procedure ReadList(var L:List; var E:BaseType);
Function FullList(var L:List):boolean;
Function EndList(var L:List):boolean;
Function Count(var L:List):Word;
Procedure BeginPtr(var L:List);
Procedure EndPtr(var L:List);
Procedure MovePtr(var L:List);
Procedure MoveTo(var L:List; N:word);
Procedure DoneList(var L:List);
Procedure CopyList(var L1,L2:List);
Спецификация СД на языке C:
#if!defined(__LIST7_H)
#define Index 1000
const ListOk = 0;
const ListNotMem = 1;
const ListUnder = 2;
const ListEnd = 3;
typedef <определить> BaseType;
typedef basetype TMemList[Index];
typedef unsigned ptrel;
typedef struct List {TMemList* PMemList;
ptrel ptr;
unsigned int N; // длина списка
unsigned int SizeMem;};// размер массива
short ListError;
void InitList(List *L,unsigned SizeMem)
void PutList(List *L, BaseType E)
void GetList(List *L, BaseType *E)
void ReadList(List *L,BaseType *E)
int FullList(List *L)
int EndList(List *L)
usigned int Count(List *L)
void BeginPtr(List *L)
void EndPtr(List *L)
void MovePtr(List *L)
void MoveTo(List *L, unsigned int n)
void DoneList(List *L)
void CopyList(List *L1,List *L2)
#endif
8. ПЛС. Массив, на основе которого реализуется ПЛС, находится в динамической памяти (базовый тип элемента — Pointer). Память под массив выделяется при инициализации ПЛС и количество элементов сохраняется в дескрипторе. Выделение памяти под информационную часть элемента ПЛС и запись в нее значения происходит при выполнении процедуры PutList. При выполнении процедуры GetList память, занимаемая информационной частью элемента, освобождается. Размер информационной части элемента задается при инициализации ПЛС и сохраняется в дескрипторе.
Спецификация СД на языке Pascal:
Unit List8;
Interface
Const ListOk = 0;
ListNotMem = 1;
ListUnder = 2;
ListEnd = 3;
Type BaseType = Pointer;
Index = 0..65520 div sizeof(BaseType);
TMemList = array[Index] of BaseType;
PtrEl = Index;
List = Record
PMemList: ^TmemList;
Ptr: PtrEl;
N: Word; { длина списка }
SizeМем: Word { размер массива }
SizeEl: Word { размер элемента}
End;
Var ListError: 0..3;
Procedure InitList(var L:List; SizeMem, SizeEl:Word);
Procedure PutList(var L:List; var E);
Procedure GetList(var L:List; var E);
Procedure ReadList(var L:List; var E);
Function FullList(var L:List):boolean;
Function EndList(var L:List):boolean;
Function Count(var L:List):Word;
Procedure BeginPtr(var L:List);
Procedure EndPtr(var L:List);
Procedure MovePtr(var L:List);
Procedure MoveTo(var L:List; N:word);
Procedure DoneList(var L:List);
Procedure CopyList(var L1,L2:List);
Спецификация СД на языке C:
#if!defined(__LIST8_H)
#define SizeList 100
#define Index 1000
const ListOk = 0;
const ListNotMem = 1;
const ListUnder = 2;
const ListEnd = 3;
typedef void *BaseType;
typedef basetype TMemList[Index];
typedef unsigned ptrel;
typedef struct List {TMemList* PMemList;
ptrel ptr;
unsigned int N; // длина списка
unsigned int SizeMem;};// размер массива
short ListError;
void InitList(List *L,unsigned SizeMem)
void PutList(List *L, BaseType E)
void GetList(List *L, BaseType *E)
void ReadList(List *L,BaseType *E)
int FullList(List *L)
int EndList(List *L)
usigned int Count(List *L)
void BeginPtr(List *L)
void EndPtr(List *L)
void MovePtr(List *L)
void MoveTo(List *L, unsigned int n)
void DoneList(List *L)
void CopyList(List *L1,List *L2)
#endif