Назад, на главную

 

Здесь приведены функции для обработки строк. Аналоги для некоторых имеются в стандартных библиотеках языка С.

Скачать файл заголовков(.h), а также библиотеку (.lib).

Структура, описывающая список строк длиной 13 символов (считая завершающий нуль):

 

         struct recoex {

         int act;

         unsigned char string[13];

         };

 

 

            struct List1

            {

            struct recoex memb;

            struct List1 *next;

            };

 

            act - если 0, строчка не будет подсвечена, если 1 - будет.

            string - строка, куда записывается имя файла (например).

 

 

 

 

int cop(struct recoex *sourc,struct recoex *dest)

            Копирует одну структуру в другую (sourc в dest).

            sourc - откуда копируется.

            dest - куда копируется.

 

 

struct List1 *SEEKendStr(struct List1 *Head)

            Возвращает указатель на последний элемент списка.

            Head - указатель на головной (0-й) элемент списка.

 

            struct List1 *SEEKend_1Str(struct List1 *Head1)

            Возвращает указатель на предпоследний элемент списка.

            Если в списке только один элемент, возвращает NULL.

            Head1 - указатель на голову списка.

 

            struct List1 *CRbegStr(struct recoex *sourc1)

            Заполняет 0-й элемент списка (то-есть фактически создает список и возвращает указатель на его начальный элемент).

            sourc1 - откуда берется информация.

 

            int ADDendStr(struct List1 *Head2,struct recoex *sourc2)

            Добавляет элемент в конец существующего списка.

Если не удалось выделить память, возвратит 0, если же все хорошо - 1.

            Head2 - указатель на головной элемент списка.

            sourc2 - откуда берется информация.

 

 

void DELendStr(struct List1 *Head5)

            Удаляет элемент из конца существующего списка.

            Head5 - Указатель на голову списка.

 

            int READonPosStr(struct List1 *Head3,int Pos,struct recoex *res)

            Читает элемент списка с заданным номером (нумерация идет с нуля).

            Если мы хотим прочитать элемент за концом списка, то функция возвратит 0, в противном случае - единицу.

            Head3 - указатель на голову списка (0-й элемент).

            Pos - номер элемента, который должен быть прочитан.

            res - куда считывать информацию.

 

            void DELallStr(struct List1 *Head3)

            Уничтожает список полностью.

            Head3 - Указатель на голову списка.

 

            int LenStr(struct List1 *Head4)

            Определяет количество элементов в списке.

            Head4 - указатель на голову списка.

 

 

int ADDStr(struct List1 **Head6,struct recoex *sourc6,int Pos)

            Добавляет в список элемент, который встает в заданную позицию (раздвигая остальные элементы).

Если не удалось выделить память, возвратит 0, если же все хорошо - 1.

Если заданная позиция больше, чем длина списка, элемент вставляется в конец списка.

            Head6 - указатель на голову списка.

            sourc6 - источник информации (откуда идет копирование).

            Pos - заданная позиция.

 

            void DELStr(struct List1 **Head7,int Pos7)

            Удаляет элемент из списка в заданной позиции.

            Если позиция задана за концом списка, то удаляется последний элемент.

            Head7 - указатель на голову списка.

            Pos7 - заданная позиция.

 

 

REPStr(struct List1 *Head8,struct recoex *sourc8,int Pos8)

            Заменяет элемент в заданной позиции.

            Если позиция больше, чем длина списка, то заменяется последний элемент.

            Head8 - указатель на голову списка.

            sourc8 - источник информации.

Pos8 - номер (т.е. заданная позиция).

 

            struct List

            {

            int memb;

            struct List *next;

            };

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

 

            struct List *SEEKend(struct List *Head)

            Возвращает указатель на последний элемент списка.

            Head - указатель на головной (0-й) элемент списка.

 

 

struct List *SEEKend_1(struct List *Head)

            Возвращает указатель на предпоследний элемент списка.

            Если в списке только один элемент, возвращает NULL.

            Head - указатель на голову списка.

 

            struct List *CRbeg(int New)

            Заполняет 0-й элемент списка (то-есть фактически создает список и возвращает указатель на его начальный элемент).

            New - вставляемое в список число.

 

            int ADDend(struct List *Head1,int New1)

            Добавляет элемент в конец существующего списка.

Если не удалось выделить память, возвратит 0, если же все хорошо - 1 (единицу).

            Head1 - указатель на головной элемент списка.

            New1 - добавляемое в список число.

 

            void DELend(struct List *Head)

            Удаляет элемент из конца существующего списка.

            Head - Указатель на голову списка.

 

 

int READonPos(struct List *Head2,int Pos,int *res)

            Читает элемент списка с заданным номером (нумерация идет с нуля) и помещает значение по адресу res.

            Если мы хотим прочитать элемент за концом списка, то функция возвратит 0, в противном случае - единицу.

            Head2 - указатель на голову списка (0-й элемент).

            Pos - номер элемента, который должен быть прочитан.

            res - адрес, куда считывать информацию.

 

            void DELall(struct List *Head3)

            Уничтожает список полностью.

            Head3 - Указатель на голову списка.

 

            int Len(struct List *Head4)

            Определяет количество элементов в списке и возвращает его.

            Head4 - указатель на голову списка.

 

 

int ADD(struct List **Head5,int New5,int Pos)

            Добавляет в список элемент, который встает в заданную позицию (раздвигая остальные элементы).

Если не удалось выделить память, возвратит 0, если же все хорошо - 1.

Если заданная позиция больше, чем длина списка, элемент вставляется в конец списка.

            Head5 - указатель на голову списка.

            New5 - источник информации (откуда идет копирование).

            Pos - заданная позиция.

 

            void DEL(struct List **Head5,int Pos)

            Удаляет элемент из списка в заданной позиции.

            Если позиция задана за концом списка, то удаляется последний элемент.

            Head5 - указатель на голову списка.

            Pos - заданная позиция.

 

            REP(struct List *Head5,int New5,int Pos)

            Заменяет элемент в заданной позиции.

            Если позиция больше, чем длина списка, то заменяется последний элемент.

            Head5 - указатель на голову списка.

            New5 - число, которым заменят число в заданной позиции.

Pos - номер (т.е. заданная позиция).

 

 

Набор новых функций, оперирующих со списками специального вида -

 

struct ListP

            {

            char *P;

            long Le;

            struct ListP *next;

            };

 

            P - адрес строки.

            Le - длина строки (с учетом нулевого завершающего байта).

            next - адрес следующего элемента списка.

 

Рисунок:

 

            Эта структура используется, чтобы хранить в виде списка строки, если заранее не известна их длина (допустим строки текстового файла). Под каждую строку выделяется Le байт (сколько надо), а в структуру потом записывается адрес этой строки (то-есть адрес выделенной памяти).

            Членами этого списка в общем случае могут быть не только символьные строки, но и массивы произвольных байт. Для того чтобы читать и записывать подобные массивы  созданы специальные функции (их название обычно заканчивается на 1).

 

 

            struct ListP *SEEKendStrP(struct ListP *Head)

            Возвращает указатель на последний элемент списка.

            Head - указатель на головной (0-й) элемент списка.

 

            struct ListP *SEEKend_1Str(struct ListP *Head1)

            Возвращает указатель на предпоследний элемент списка.

            Если в списке только один элемент, возвращает NULL.

            Head1 - указатель на голову списка.

 

 

struct ListP *CRbegStr(char *source)

            Заполняет 0-й элемент списка информацией из строки, строка заканчивается нулевым байтом (то-есть фактически создает список и возвращает указатель на его начальный элемент).

            source - откуда берется информация.

 

            struct ListP1 *CRbegStr(char *source,int N)

            Заполняет 0-й элемент списка информацией из массива, записывая туда N байт (то-есть фактически создает список и возвращает указатель на его начальный элемент).

            source - откуда берется информация.

            N - число байт переносимых в список.
Подробнее об использовании этой функции и подобных (название оканчивается на 1)

 

            int ADDendStrP(struct ListP *Head2,char *source)

            Добавляет элемент в конец существующего списка.

Если не удалось выделить память, возвратит 0, если же все хорошо - 1.

            Head2 - указатель на головной элемент списка.

 

int ADDendStrP1(struct ListP *Head2,char *source,int N)

            Добавляет элемент в конец существующего списка.

Если не удалось выделить память, возвратит 0, если же все хорошо - 1.

            Head2 - указатель на головной элемент списка.

            source - массив, откуда берется информация.

            N - число байт, переносимых в строку списка.

 

 

 

            void DELendStrP(struct ListP *Head5)

            Удаляет элемент из конца существующего списка.

            Head5 - Указатель на голову списка.

 

            int READonPosStrP(struct ListP *Head3,int Pos,char *dest)

            Читает элемент списка с заданным номером (нумерация идет с нуля).

            Если мы хотим прочитать элемент за концом списка, то функция возвратит 0, в противном случае - единицу.

            Head3 - указатель на голову списка (0-й элемент).

            Pos - номер элемента, который должен быть прочитан.

            res - куда считывать информацию.

 

 

int READonPosStrP1(struct ListP *Head3,int Pos,char *dest,int N)

            Читает элемент списка с заданным номером (нумерация идет с нуля).

            Если мы хотим прочитать элемент за концом списка, то функция возвратит 0, в противном случае - единицу.

            Head3 - указатель на голову списка (0-й элемент).

            Pos - номер элемента, который должен быть прочитан.

            dest - куда считывать информацию.

            N - число байт, переносимых по адресу dest из списка.

 

            void DELallStrP(struct ListP *Head3)

            Уничтожает список полностью.

            Head3 - Указатель на голову списка.

 

            int LenStrP(struct ListP *Head4)

            Определяет количество элементов в списке.

            Head4 - указатель на голову списка.

 

 

int ADDStrP(struct ListP **Head6,char *source,int Pos)

            Добавляет в список элемент, который встает в заданную позицию (раздвигая остальные элементы).

Если не удалось выделить память, возвратит 0, если же все хорошо - 1.

Если заданная позиция больше, чем длина списка, элемент вставляется в конец списка.

            Head6 - указатель на голову списка.

            source - источник информации (откуда идет копирование) - строка, заканчивающаяся нулевым байтом.

            Pos - заданная позиция.

 

            int ADDStrP1(struct ListP **Head6,char *source,int Pos,int N)

            Добавляет в список элемент, который встает в заданную позицию (раздвигая остальные элементы).

Если не удалось выделить память, возвратит 0, если же все хорошо - 1.

Если заданная позиция больше, чем длина списка, элемент вставляется в конец списка.

            Head6 - указатель на голову списка.

            source - источник информации (откуда идет копирование) - массив, не обязательно заканчивающийся нулевым байтом.

            Pos - заданная позиция.

            N - число байт, переносимых в строку списка.

 

void DELStrP(struct ListP **Head7,int Pos7)

            Удаляет элемент из списка в заданной позиции.

            Если позиция задана за концом списка, то удаляется последний элемент.

            Head7 - указатель на голову списка.

            Pos7 - заданная позиция.

 

            REPStrP(struct ListP *Head8,char source,int Pos8)

            Заменяет элемент в заданной позиции.

            Если позиция больше, чем длина списка, то заменяется последний элемент.

            Head8 - указатель на голову списка.

            source - источник информации - строка, заканчивающаяся нулевым байтом.

Pos8 - номер (т.е. заданная позиция).

 

 

REPStrP1(struct ListP *Head8,char source,int Pos8,int N)

            Заменяет элемент в заданной позиции.

            Если позиция больше, чем длина списка, то заменяется последний элемент.

            Head8 - указатель на голову списка.

            source - источник информации - массив, не обязательно заканчивающийся нулевым байтом.

Pos8 - номер (т.е. заданная позиция).

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

 

            int CpListToFileP(struct ListP *Head,char *dest)

            Копирует список в текстовый файл (каждая строка заканчивается символами 13 и 10 - как в системе DOS). Если не удалось выделить память (для своих внутренних целей) - возвращает -1, если все в порядке - возвращает 0.

            Head - указатель на голову списка.

            dest - имя файла.

 

            long READonPosLP(struct ListP *Head,int Pos)

            Возвращает длину строки (с учетом нулевого байта, если он записан в строку), на которую указывает указатель в списке.

 

 

struct ListP *TextFileToList(char *filename1,char *end,long k)

            Создает список из строк текстового файла (считается, что строки текстового файла заканчиваются содержимым строки end, причем это содержимое в список не записывается). Если возвращает NULL, значит была какая-то ошибка (в частности длина строки файла превысила число k).

            filename1 - имя текстового файла.

            end - строка, на которую заканчиваются строки текстового файла.

            k - максимальная длина строки текстового файла.

 

 

            struct ListP *TextFileToList1(char *filename1,char *end,long k)

            Создает список из строк текстового файла (считается, что строки текстового файла заканчиваются содержимым строки end, причем это содержимое в список не записывается). Если возвращает NULL, значит была какая-то ошибка (в частности длина строки файла превысила число k). Более корректно обрабатывает конец текстового файла - если файл заканчивается на 13,10 - новая пустая строка списка после этого не создается.

            filename1 - имя текстового файла.

            end - строка, на которую заканчиваются строки текстового файла.

            k - максимальная длина строки текстового файла.

 

int PAR_s(struct ListP **PP,struct ListP **PPvar1,int k1)

            В каждой строке списка ищет скобки, потом создает переменную __v(номер), вносит ее в список вспомогательных переменных и создает строку, где эта новая переменная приравнивается внутреннему содержимому скобок. Эта строка вставляется в список перед обрабатываемой, а в обрабатываемой скобки заменяются на новую переменную.

            Если в качестве PPvar1 будет фигурировать NULL, то список переменных будет создан.

            Операция повторяется со всеми строками списка (в том числе и с вновь созданными самой функцией), пока не станет нечего обрабатывать.

            Возвращает самый большой номер вспомогательной переменной.

            PP - список обрабатываемых строк.

            PPvar1 - список вспомогательных переменных.

            k1 - номер самой последней из ранее созданных переменных (создаваемые при работе функции переменные будут иметь большие номера).

 

 

int SIGN_s1(struct ListP **PP,struct ListP **PPvar1,struct ListP **PPvar2,int k1,char sign)

            В каждой строке списка ищет знак sign, считая его знаком бинарной операции, а также первый знак =. Если знак = не найден, то возвращает -1. Если знаки +,-,*,/ есть левее знака =, возвращает

-2. Потом она выделяет части строки от = до искомого знака и после искомого знака. Проверяет, входят ли в эти части знаки +,-,*,/. Если да, то функция создает новую переменную __v(номер), вносит ее в список вспомогательных переменных и создает строку, где эта новая переменная приравнивается рассматриваемой части обрабатываемой строки. Эта строка вставляется в список перед обрабатываемой, а в обрабатываемой та самая часть заменяется на новую переменную. Если же знаки не входят в рассматриваемую часть, и эта самая часть не есть число, то создается основная переменная с именем этой части строки и вносится в соответствующий список.

            Возвращает также -6, если перед первым = ничего не стоит, и

-5, если перед первым = стоит число.

            Операция повторяется со всеми строками списка (в том числе и с вновь созданными самой функцией), пока не станет нечего обрабатывать.

            Возвращает самый большой номер вспомогательной переменной.

            PP - список обрабатываемых строк.

            PPvar1 - список вспомогательных переменных.

            PPvar2 - список основных переменных.

            k1 - номер самой последней из ранее созданных переменных (создаваемые при работе функции переменные будут иметь большие номера).

            sign - обрабатываемый знак.

 

 

            int SIGN_s3(struct ListP **PP,struct ListP **PPvar1,int k1,char sign)

            В каждой строке списка ищет знак последний знак sign, проверяет, является ли он знаком унарной операции, а также ищет первый знак =. Если знак = не найден, то возвращает -1. Если знаки +,-,*,/ есть левее знака =, возвращает -2. Потом она выделяет часть строки от искомого знака до конца строки или до следующего знака из набора +,-,*,/. Если необходимо, то функция создает новую переменную __v(номер), вносит ее в список вспомогательных переменных и создает строку, где эта новая переменная приравнивается рассматриваемой части обрабатываемой строки. Эта строка вставляется в список перед обрабатываемой, а в обрабатываемой сам знак и последующая часть строки (до следующего знака) заменяется на новую переменную.

            Операция повторяется со всеми строками списка (в том числе и с вновь созданными самой функцией), пока не станет нечего обрабатывать.

            Возвращает самый большой номер вспомогательной переменной.

            PP - список обрабатываемых строк.

            PPvar1 - список вспомогательных переменных.

            k1 - номер самой последней из ранее созданных переменных (создаваемые при работе функции переменные будут иметь большие номера).

            sign - обрабатываемый знак.

 

int SEARCHlistP(struct ListP *H,char *str,int n0)

            Поиск в списке строки, совпадающей с заданной. Возвращает номер элемента (первого), если он найден. -1 - если элемент не найден. Отрицательное число - отрицательный результат.

            H - список.

            str - строка для сравнения.

            n0 - поиск начнется с этого члена списка.

 

 

            void *GETvarAdr(char *S,struct List *Pvar1,struct ListP *Pvar2,

                                           struct List *Padr1,struct ListP *Padr2)

            Ищет имя переменной S в списках Pvar1 и Pvar2, потом находит в списке Padr1 или, соответственно, Padr2 адрес области памяти, выделенной под эту переменную, и возвращает его. Если переменная не найдена, возвращает NULL.

 

 

int EXECUTE_2(struct ListP *P,struct ListP *Pvar1,struct ListP *Pvar2)

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

            Далее начинает выполнять строки списка P. Считается, что все они уже приведены к простейшему виду. Возвращает -1, если выясняется, что память под переменную не выделена, то-есть ее адрес - NULL.

 

 

 

            int DELsubListP(struct ListP **Head1,int I0,int I1)

            Вырезает члены списка от I0 до I1 включительно. Занятая память освобождается. Возвращает 1 в случае успеха.

            Если I0<0, то удаление членов идет от начала Head1 (то-есть от нулевого члена), а если I1>(число членов в списке-2), то удаляются члены от I0 до последнего.

 

            int DELsubListPtoEnd(struct ListP **Head1,int I0)

            Вырезает члены списка от I0 до конца (включая I0). Возвращает 1 в случае успеха.

            Если I0<0, то удаление членов идет от начала Head1 (то-есть от нулевого члена).

 

            long MemP(struct ListP *Head1,int I0,int I1)

            Определяет размер памяти, занятой членами списка от I0 до I1 включительно. Возвращает -1 в случае если Head1 - NULL.

            Под размером памяти имеется ввиду размер структуры плюс размер строки.

            Если I0<0, то определение размера занятой памяти идет от начала Head1 (то-есть от нулевого члена), а если I1>(число членов в списке-2), то от I0 до последнего.

 

 

            long MemPtoEnd(struct ListP *Head1,int I0)

            Определяет размер памяти, занятой членами списка от I0 до конца списка (включая I0). Возвращает -1 в случае если Head1 - NULL.

            Под размером памяти имеется ввиду размер структуры плюс размер строки.

            Если I0<0, то определение размера занятой памяти идет от начала Head1 (то-есть от нулевого члена).

 

            struct ListP *SEEKMemberP(struct ListP *Head1,int Pos)

            Возвращает адрес члена списка с номером Pos.

            Если номер слишком велик, то возвратится NULL. Если же номер меньше нуля, то возвратится непредсказуемое число.

 

            int SEARCHlistPLast(struct ListP *H,char *str,int N1)

            Ведет поиск строки в списке, совпадающей с str, от 0 до (N1-1)-й строки списка (включительно) и возвращает номер ПОСЛЕДНЕЙ найденной строки. Если N1<0, поиск идет на всем списке (как и если N1 слишком велико больше (длина списка -2)).

            Если строка не найдена, возвратит -1.

 

 

 

            int CpListToFileP(struct ListP *Head,char *dest)

            Копирует список в текстовый файл (каждая строка заканчивается символами 13 и 10 - как в системе DOS). Если не удалось выделить память (для своих внутренних целей) - возвращает -1, если все в порядке - возвращает 0.

            Head - указатель на голову списка.

            dest - имя файла.

 

 

            int ADDListEndP(ctruct ListP *Head1,struct ListP *Head2)

            Прицепляет список Head1 в конец списка Head2. В случае успеха возвращает 1.

            Head1 - указатель на список, который прицепляют.

            Head2 - указатель на список, к которому прицепляют первый список.

 

            int ADDListP(ctruct ListP *Head1,struct ListP *Head2,int I)

            Вставляет список Head1 ПОСЛЕ позиции I в список Head2. Все остальные члены «раздвигаются». В случае успеха возвращает 1. Если засланы значения NULL, возвращается 0.


            int ADDListPbefore(ctruct ListP *Head1,struct ListP **Head2,int I)

            Вставляет список Head1 В ПОЗИЦИЮ I в список Head2. Все остальные члены «раздвигаются». В случае успеха возвращает 1. Если засланы значения NULL, возвращается 0.

 

            struct ListP *CpListP(struct ListP *Head1,int I0,int I1)

            Создает новый список, копируя туда члены списка от I0 до I1 включительно и возвращая указатель на этот новый список.

            Если I0<0, то копирование идет от начала Head1 (то-есть от нулевого члена), а если I1>(число членов в списке-2), то копируются члены от I0 до последнего.

 

 

            struct ListP *CpListPtoEnd(struct ListP *Head1,int I0)

            Создает новый список, копируя туда члены списка от I0 до конца списка I1 (включая I0) и возвращая указатель на этот новый список.

            Если I0<0, то копирование идет от начала Head1 (то-есть от нулевого члена).

 

            int DELsubListP(struct ListP **Head1,int I0,int I1)

            Вырезает члены списка от I0 до I1 включительно. Занятая память освобождается. Возвращает 1 в случае успеха.

            Если I0<0, то удаление членов идет от начала Head1 (то-есть от нулевого члена), а если I1>(число членов в списке-2), то удаляются члены от I0 до последнего.

 

            int DELsubListPtoEnd(struct ListP **Head1,int I0)

            Вырезает члены списка от I0 до конца (включая I0). Возвращает 1 в случае успеха.

            Если I0<0, то удаление членов идет от начала Head1 (то-есть от нулевого члена).

 

 

 

 

 

 

 

Хостинг от uCoz