Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по Программированию.doc
Скачиваний:
49
Добавлен:
11.02.2015
Размер:
1.22 Mб
Скачать

Директива #undef

Директива #undef используется для отмены действия директивы #define. Синтаксис этой директивы следующий #undef идентификатор

Директива отменяет действие текущего определения #define для указанного идентификатора. Не является ошибкой использование директивы #undef для идентификатора, который не был определен директивой #define.

Пример:

#undef WIDTH

#undef MAX

Эти директивы отменяют определение именованной константы WIDTH и макроопределения MAX.

Лекция 10. Условные директивы препроцессора

Заголовочный файл также может содержать директивы #include. Поэтому иногда трудно понять, какие же конкретно заголовочные файлы включены в данный исходный текст, и некоторые заголовочные файлы могут оказаться включенными несколько раз. Избежать этого позволяютусловные директивы препроцессора. Рассмотрим пример:

Файл main.cpp

#include <stdio.h>

#include "fm.h"

int main(int argc, char* argv[])

{

int a=1, b=2;

printf("Min from %d and %d is %d\n", a, b, fm(a,b));

getchar();

return 0;

}

Файл fm.h

#ifndef __FM_H

#define __FM_H

int fm(int, int);

#endif

Файл fm.cpp

#include "fm.h"

int fm(int x, int y)

{

return x<y?x:y;

}

Данный проект состоит из трех файлов main.cpp— основной,fm.h — содержащий прототип функцииfm(поиск минимума двух целых чисел),fm.cpp — содержащий определение функцииfm.

В файле fm.hусловная директива#ifndefпроверяет, не было ли значение __FM_Hопределено ранее. (__FM_H– это константа препроцессора; такие константы принято писать заглавными буквами.) Препроцессор обрабатывает следующие строки вплоть до директивы#endif. В противном случае он пропускает строки от#ifndefдо#endif.

Директива #define__FM_Hопределяет константу препроцессора __FM_H. Поместив эту директиву непосредственно после директивы#ifndef, мы можем гарантировать, что содержательная часть заголовочного файлаfm.hбудет включена в исходный текст только один раз, сколько бы раз ни включался в текст сам этот файл.

Примечание: нужно обязательно включить fm.cpp в проект через менеджер проекта (View-Project manager или Ctrl-Alt-F11) или File-New-C_File.

Другие условные директивы — #if, #elif, #else, #ifdef — самостоятельно.

Линейный односвязный список

Если тип определен следующим образом

typedef struct List_Item *List;

struct List_Item

{ int key;

List next;

};

то получается следующая структура данных

Такая структура называется линейным односвязным списком.

Определим некоторые операции с линейными списками.

Файл list.h

#ifndef __LIST_H

#define __LIST_H

typedef struct List_Item *List;

struct List_Item

{ int key;

List next;

};

void PrintList(List); //Печать списка

List InsertBegin(List, int); //Вставка элемента в начало списка

List FindItem(List, int); //Поиск элемента по ключу

void InsertAfter(List, int); //Вставка элемента после заданного

void DeleteAfter(List); //Удаление элемента после заданного

void FreeList(List); //Освобождение памяти

#endif

Реализация (list.cpp)

#include "list.h"

#include "stdio.h"

#include "stdlib.h"

void PrintList(List p)

{

while (p)

{

printf("%d ", p->key);

p=p->next;

}

printf("\n");

};

List InsertBegin(List p, int x)

{

//List q=(List)malloc(sizeof(List_Item));

List q=new List_Item;

q->key=x;

q->next=p;

return q;

};

List FindItem(List p, int x)

{

while (p && p->key!=x)

p=p->next;

return p;

};

void InsertAfter(List p, int x)

{

//List q=(List)malloc(sizeof(List_Item));

List q=new List_Item;

q->key=x;

q->next=p->next;

p->next=q;

};

void DeleteAfter(List p)

{

List q=p->next;

p->next=q->next;

delete q; //free(q);

};

void FreeList(List p)

{

List q;

while (p)

{

q=p;

p=p->next;

delete q; //free(q);

}

};

Тестирование (main.cpp)

#include "list.h"

#include <stddef.h>

#include <stdio.h>

int main(int argc, char* argv[])

{

List p=NULL;

for (int i=1;i<=5;i++)

p=InsertBegin(p,i);

PrintList(p);

List q=FindItem(p, 3);

InsertAfter(q,10);

PrintList(p);

q=FindItem(p, 2);

DeleteAfter(q);

PrintList(p);

FreeList(p);

getchar();

return 0;

}

Результат работы программы:

5 4 3 2 1

5 4 3 10 2 1

5 4 3 10 2