Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
!1-25.doc
Скачиваний:
11
Добавлен:
28.10.2018
Размер:
2.62 Mб
Скачать

5.4 Программа, демонстрирующая синхронизацию доступа к глобальному массиву с пом. Мютексов

#include "windows.h"

#include "process.h"

#include "stdio.h"

HANDLE hMutex;

int a[5];

void WorkThread(void * pParam)

{

int i,num;

num=0;

while(true)

{

WaitForSingleObject(hMutex,INFINITE);

for(i=0;i<5;i++)

a[i]=num;

ReleaseMutex(hMutex);

num++;

}

}

void main()

{

hMutex=CreateMutex(NULL,FALSE,NULL);

_beginthread(WorkThread,0,NULL);

while(true)

{

WaitForSingleObject(hMutex,INFINITE);

printf("%d %d %d %d %d\n",a[0],a[1],a[2],a[3],a[4],a[5]);

ReleaseMutex(hMutex);

}

}

5.5

с 192.24.0.0 по 192.31.255.0

ответы:

- 192.24.0.0

- Маска подсети

Переводим из 10ой в 2ую

2410=000110002

3110=000111112

111110002=24810

Маска подсети 255.248.0.0

  • Клиент 1

Начальный IP-адрес-192.24.0.1

Конечный IP-адрес-192.24.7.8

Маска подсети-?

010=000000002

710=000001112

111110002=24810

Маска подсети 255.255.248.0

  • Клиент 2

Начальный IP-адрес-?

Конечный IP-адрес-192.24.31.254

Маска подсети-255.255.240.0

Определяем шаг подсети

24010=111100002

24=16- шаг подсети

32-16=16

Начальный IP-адрес – 192.24.16.1

6.1 Организация линейных списков. Односвязные и двусвязные списки в С++.

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

Для каждого из них, кроме последнего, имеется следующий элемент, и для каждого, кроме первого — предыдущий. Каждый элемент связанного списка , во-первых, хранит какую-то информацию, во-вторых, указывает на следующий за ним или предыдущий элемент.

struct Node

{

int data; //информационное поле, данные, любой порядковый тип

Node *next; //указатель на следующий элемент

};

typedef Node * PNode;

1. Добавление элемента в конец списка.

q – последний элемент.

void Insert_end (PNode &q, int number)

{

Pnode temp_p;

temp_p = new Node; //выделение области памяти

temp_p-> data = number; //заполнение информационного поля

temp_p-> next = NULL;

q-> next = temp_p; //наведение связей

q = temp_p;

} //Insert_end

2. Установить указатель на последний элемент списка.

void Point_end (PNode &q, PNode first)

{

q = first;

while (q->next != NULL) //пока указатель не пуст

q = q->next; //установить на следующий

}

3. Вставить элемент после заданного q.

void Insert_after_q (PNode &q, int number)

{

PNode p;

p=new Node; //выделение области памяти

p->data = number; //заполнение информационного поля

p->next = q->next;

q->next = p; //наведение связей

} //inset_after_q

4. Удалить элемент, стоящий после заданного q.

void Delete_after_q (PNode &q, int &number)

{

PNode p;

p = q-> next;

q-> next = p-> next; //наведение связей

number = p-> data; //сохранение данных

delete p; //освобождение памяти

} //Delete_after_q

int Delete_after_q (PNode &q)

{

PNode p;

p = q-> next;

q-> next = p-> next; //наведение связей

return p-> inf; //сохранение значения удаляемого элемента

delete p; //освобождение памяти

} //Delete_after_q

5. Проверить список на пустоту (first – первый элемент).

bool Empty (PNode first)

{

return (first == NULL); //возвращает true, если список пуст

}

……………………………….

struct Node

{

int data; //информационное поле, данные, любой порядковый тип

Node *next; //указатель на следующий элемент

};

typedef Node * PNode;

Если в записи Node вставить поле-указатель prev на предыдущий элемент списка, то таким образом можно получить так называемый двусвязный список:

struct Node2

{

int inf; //информационное поле, любой порядковый тип

Node2 *prev; //указатель на предыдующий элемент

Node2 *next; //указатель на следующий элемент

}

typedef Node2* PNode2;

1. Вставка элемента.

PNode2 p;

p = new Node2; //p – переменная типа PNode2

p -> next = q -> next;

p -> prev = q;

q -> next -> prev = p; //новый порядок у q^.next

q -> next = p;

q = p;

Опишем функцию вставки элемента в двусвязный список после заданного q.

void Ins_q2(PNode2 &q, int a )

{

PNode2 p;

p = new Node2;

p -> inf = a;

p -> next = q -> next;

p -> prev = q;

q -> next -> prev = p //новый порядок у q^.next

q -> next =p;

q = p; //q – заданный элемент

}

2. Удаление элемента.

p = q -> prev;

p -> next = q -> next;

q -> next -> prev = p;

delete q;

q = p; //предшествующий элемент станет текущим

Опишем функцию удаления текущего элемента двусвязного списка:

Void Del_q2(PNode2 &q, int a )

{

PNode2 p;

p = q -> prev;

a = q -> inf;

p -> next = q ->next;

q -> next -> prev = p;

delete q;

q = p; //предшествующий элемент станет текущим}

}

int Del_q2(Pnode2 &q) //функция вернет символ

{

int a;

PNode2 p;

p = q -> prev;

a = q -> inf;

p -> next = q -> next;

q -> next -> prev = p;

delete q;

q = p; //предшествующий элемент станет текущим

return a;

}

3. Последовательный поиск в списке.

PNode2 q;

bool fsearch;

q = first;

do

{

fsearch = q -> inf > p ->inf; //проверка порядка информационного поля

if (!fsearch) //поиск не увенчался успехом

if (q -> next != NULL) //не последний элемент

q = q -> next;

else fsearch = true; //последний элемент, выход из цикла

else q = q -> prev; //поиск успешен, новое состояние q

} while (!fsearch);

Опишем функцию поиска места для вставляемого элемента двусвязного списка:

void Search_in_list2( PNode2 &q, PNode2 first, int a )

{

bool fsearch;

q = first;

do

{

fsearch = q -> inf > p ->inf; //проверка порядка информационного поля

if (!fsearch) //поиск не увенчался успехом

if (q -> next != NULL) //не последний элемент

q = q -> next;

else fsearch = true; //последний элемент, выход из цикла

else q = q -> prev; //поиск успешен, новое состояние q

} while (!fsearch);

Ins_q2(q, a); //вставка нового элемента после q