Проблема в следующем. Мне нужно чтобы в 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 который я пытаюсь вызвать сначала принимает указатель на хвост линейного списка, а лишь затем уже на значение которое нужно добавить.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Как считать один байт из файла? Следующий код работает, но некоторые байты пропускаются (0x09, 0x0a, 0x0b, 0x0c, 0x0d) и считывается следующий за ними...