问题如下。我需要在 TakeElement 方法中使用 m 来获取存储在动态结构中的数字。它是数字本身,而不是它的链接。我怎样才能做到这一点?

#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 方法采用指向线性列表尾部的指针,然后才指向要添加的值。