logo search
TurboProlog / Документация / TOM_2

Обработка списков.

В этом разделе мы дадим более полезный пример, который покажет, как

преобразовать список в массив и обратно.

Программа Си ListToArray принимает список целых чисел, преобразует

его в массив, расположенный в глобальном стеке и возвращает число элемен-

тов. Преобразование выполняется в три этапа:

1. Список просматривается для того, чтобы определить

количество элементов.

2. Отводится память для массива.

3. Список просматривается снова, его элементы переносятся в

массив.

Программа Си ArrayToList принимает целочисленный массив и его размер

как аргументы, затем преобразует их в список целых чисел. Эта программа

делает только один прогон, строя список по мере просмотра массива.

Внешняя процедура inclist показывает, как использовать ListToArray и

ArrayToList. Если задан список целых чисел, то inclist преобразует вход-

ной список в массив, увеличивает число элементов массива на 1, затем пре-

образует массив обратно в список целых чисел.

/*Программа CH22EXO7.PRO*/

project "mycnvrt"

global domains

list = integer*

global predicates

inclist(list, list) - (i,o) language c

goal

inclist([1, 2, 3, 4, 5, 6, 7], L), write(L).

Ниже идет программа Си, определяющая две процедуры Си ListToArray и

ArrayToList и внешний предикат Турбо Пролога inclist.

/*Программа CH22EXO8.C*/:

&define listfno 1

&define nilfno 2

void *alloc_gstack(unsigned);

typedet struct ilist {

unsigned char Functor;

int Value;

struct ilist *Next;

} IntList;

int ListToArray(IntList *List,int **ResultArray)

{ /*Convert a list to an array placed on the global stack*/

IntList *SaveList = List;

int *Array;

int i = o;

/*Счетчик количества элементов в списке*/

for(i=o; List->Functor==listfno; List=List->Next)

i++;

Array = alloc_gstack(i*sizeof(int)); /* Определение

необходимой памяти*/

List = SaveList; /* Пересылка элементов из списка в

массив */

for(i=o; List->Functor==listfno; List=List->Next)

Array[i++]=List->Value;

*ResultArray=Array;

return(i);

}

ArrayToList(int Array[],int n,IntList **List) /*Преобразование

массива в список*/

{

int i;

for (i=o; i<n; i++) /*Нахождение записи каждого элемента*/

{

IntList *p=*List=alloc_gstack(sizeof(IntList));

p->Functor=listfno;

p->Value=Array(i);

List=&(*List)->Next;

}

{ /*Нахождение последней записи в списке*/

IntList *p=*List=alloc_gstack(sizeof(char));

p->Functor=nilfno;

}

}

inclist_0(IntList *InList,IntList **OutList)

{ /* Увеличение на 1 всех значений в

списке*/

int i, n, *Array;

n=ListToArray(InList,&Array);

for (i=o; i<n; i++) Array[i]++;

ArrayToList(Array,n,OutList);

}