Q:

Как получить данные хранящиеся в записи динамической структуры

Проблема в следующем. Мне нужно чтобы в 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()
            {
            }

A:

Решение моей проблемы кроется в моей собственной невнимательности. Метод AddElement который я пытаюсь вызвать сначала принимает указатель на хвост линейного списка, а лишь затем уже на значение которое нужно добавить.

