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

224
16 марта 2018, 14:05

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

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

READ ALSO
Блокировка обьекта

Блокировка обьекта

Как использовать блокировки без создания mutex? Те

173
Нестандартный синтаксис &amp;

Нестандартный синтаксис &

У меня есть два файлсcpp и один заголовочный "

185
Считать один байт из файла

Считать один байт из файла

Как считать один байт из файла? Следующий код работает, но некоторые байты пропускаются (0x09, 0x0a, 0x0b, 0x0c, 0x0d) и считывается следующий за ними...

182