Добрый вечер, нужно было написать реализацию вычислений суммы бинарного дерева использую многопоточность ВОт что я написала
Код:
#include "stdafx.h"
#include <iostream>
#include "windows.h"
/*=============================================================================================================
описание данных
==============================================================================================================*/
int sum = 0; //накапливает сумму
struct node //узел дерева
{
int inf;
node *left;
node *right;
};
node *mtx[2];
void insert_node(node * &root, int x) //процедура вставки узла(корень, значение инф поля)
{
if (root == NULL)
{
root = new node;
root->inf = x;
root->left = NULL;
root->right = NULL;
}
else if (x < root->inf) insert_node(root->left, x);
else insert_node(root->right, x);
}
void search(node *root) //процедура печати дерева(корень)
{
if (root != NULL)
{
std::cout << root->inf << " ";
search(root->left);
search(root->right);
}
}
DWORD WINAPI summ(void *data)
{
node * pd = (node*)data;
// node d=*pd;
if (pd!= NULL)
{
sum += pd->inf;
if (pd->left!=NULL) summ(pd->left);
if (pd->right!=NULL) summ(pd->right);
}
return 0;
}
/*void summ(node *root) //процедура подсчета суммы
{
if (root != NULL)
{
sum += root->inf;
summ(root->left);
summ(root->right);
}
}
*/
void main()
{
DWORD id[2]; //массив идентификаторов потоков
HANDLE hThread[2]; //массив указателей потоков
/*=============================================================================================================
инициализция дерева
==============================================================================================================*/
node *root = NULL;
for (int i = 1; i <= 6; i++)
{
srand(20);
insert_node(root, (int)(rand()%4)+i);
}
/*=============================================================================================================
печать списка и подсчет суммы
==============================================================================================================*/
search(root);
//summ(root);
sum=root->inf;
/*=============================================================================================================
работа с потоками
==============================================================================================================*/
if (root->left!=NULL) mtx[0]=root->left;
else mtx[0]=NULL;
if (root->right!=NULL) mtx[1]=root->right;
else mtx[1]=NULL;
for (int j=0;j<2;j++)
{
hThread[j]=CreateThread(NULL,0,summ,&mtx[j],0,&id[j]);
if (hThread[j]==NULL)
{
std::cout<<"Поток № не был создан"<<"error"<<GetLastError();
}
}
WaitForMultipleObjects(2,hThread,true,INFINITE); //ожидание завершения всех потоков
// summ(root->left);
// summ(root->right);
std::cout << std::endl << sum;
getchar();
}
Дело в том что выдается эксепшен, насколько понимаю проблемы начинаются тогда когда одно поддерево пустое. В чем ошибка? и что нужно исправить?