Проблема в следующем. Мне нужно чтобы в m в методе TakeElement попало число которое хранится в динамической структуре. Именно само число, а не ссылку на него. Как это можно сделать?
#pragma once
#include "vset.h"
#include <iostream>
#include <set>
using namespace std;
/*
Собирать множества можно по такому принципу
В случае сложения
Собираем в третье множество сначала первую цепочку, а затем вторую. Далее уничтожаем дубликаты, а затем обновляем индентификаторы.
В случае логическиго И мы
Сравниваем элементы и их IDы. Если они равны, то записываем их в третью цепочку.
В случае разности множеств мы Складываем две цепочки в которых делаем очищение от дубликатов. Затем в Третьей цепочки спускаемся вниз.
Во время спуска будет происходить т.н. перебор по счётчику(Да Долго). То бишь мы берём первый элемент и сравниваем с остальными. Если попались дубликаты, то мы их удаляем.
Затем уничтожаем первый элемент. Обновляем Индентификаторы. Идём сначала и так до тех пор пока не дойдём до конца множества. Флаг конца множества - указатель на следующий элемент равный NULL
*/
vset::SingleList * vset::MakeFirst(int d)
{
SingleList *cRec = new SingleList;
cRec->Data = d; cRec->Id = 0; cRec->next = 0; cRec->prev = 0;
return cRec;
}
void vset::AddElement(vset::SingleList **last, int d)
{
vset::SingleList *cRec = new SingleList;
cRec->Data = d; cRec->next = 0; cRec->prev = *last;
(*last)->next = cRec;
*last = cRec;
RefreshIds(vset::ihead);
}
vset::SingleList * vset::Search(SingleList * const pbeg, int d)
{
SingleList *cRec = pbeg;
while (cRec)
{
if (cRec->Data == d)break;
cRec = cRec->next;
}
return cRec;
}
vset::SingleList * vset::SearchId(SingleList * const pbeg, int id)
{
SingleList *cRec = pbeg;
while (cRec)
{
if (cRec->Id == id)break;
cRec = cRec->next;
}
return cRec;
}
int vset::TakeElement(vset::SingleList *Rec)
{
int m = 0;
m = Rec->Data;
return m;
}
bool vset::Remove(vset::SingleList **head, vset::SingleList **last, int key)//его нужно перегрузить
{
if (SingleList *pkey = Search(*head, key))
{
if (pkey == *head)
{
*head = (*head)->next;
(*head)->prev = 0;
}
else if (pkey == *last)
{
*last = (*last)->prev;
(*last)->next = 0;
}
else {
(pkey->prev)->next = pkey->next;
(pkey->next)->prev = pkey->prev;
}
delete pkey;
return true;
}
return false;
}
bool vset::RemoveId(vset::SingleList **head, vset::SingleList **last, int id)//его нужно перегрузить
{
if (SingleList *pkey = SearchId(*head, id))
{
if (pkey == *head)
{
*head = (*head)->next;
(*head)->prev = 0;
}
else if (pkey == *last)
{
*last = (*last)->prev;
(*last)->next = 0;
}
else {
(pkey->prev)->next = pkey->next;
(pkey->next)->prev = pkey->prev;
}
delete pkey;
return true;
}
return false;
}
void vset::PrintList(vset::SingleList * const head)
{
vset::SingleList *cRec = head;
while (cRec)
{
cout << cRec->Data <<" ";
cRec = cRec->next;
}
}
void vset::DestroyDublicats(vset::SingleList * const head)
{
/*
Берём первый элемент множества и сравниваем с последующими. Найденные дубликаты уничтожаем. Обновляем IDы
*/
vset::SingleList *cRec = head;//cRec - указатель на захваченный элемент множества который мы будем сравнивать с вторым указателем. Сокращение от Current Record
vset::SingleList *tRec = head;//tRec - указатель на сравниваемый элемент множества с которым мы будем сравнивать первый указатель. Сокращение от Temporary Record
while (cRec)
{
while (tRec)
{
if (tRec->next != NULL)
tRec = tRec->next;
else break;
if ((cRec->Data == tRec->Data) && (cRec->Id != tRec->Id))
{
int tId = tRec->Id;
vset::RemoveId(&ihead, &ilast, tId);
break;
}
}
tRec = head;
if (cRec->next != NULL)
cRec = cRec->next;
else break;
}
RefreshIds(ihead);
}
vset vset::Combine(vset::SingleList * const head, class vset &sSet)
{
this->cRec1 = head;
this->cRec2 = sSet.ihead;
vset nSet(cRec1->Data);
cRec1->next;
int num = 0;
num = TakeElement(cRec1);
while (cRec1)
{
nSet.AddElement(num);
}
}
void vset::PrintIds(vset::SingleList * const head)
{
vset::SingleList *cRec = head;
while (cRec)
{
cout << cRec->Id << " ";
cRec = cRec->next;
}
}
void vset::RefreshIds(vset::SingleList * const head)
{
int Id = 0;
vset::SingleList *cRec = head;
while (cRec)
{
cRec->Id = Id;
Id++;
cRec = cRec->next;
}
}
vset::vset()
{
SingleList *ihead = MakeFirst(0);
SingleList *ilast = ihead;
}
vset::vset(int d)
{
ihead = MakeFirst(d);
ilast = ihead;
}
vset::~vset()
{
}
Решение моей проблемы кроется в моей собственной невнимательности. Метод AddElement который я пытаюсь вызвать сначала принимает указатель на хвост линейного списка, а лишь затем уже на значение которое нужно добавить.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Как считать один байт из файла? Следующий код работает, но некоторые байты пропускаются (0x09, 0x0a, 0x0b, 0x0c, 0x0d) и считывается следующий за ними...