Отказ от ответственности: Это для задания, но я не ищу, чтобы вы, ребята, писали мой код. Я ищу совет о том, что я делаю неправильно, и о точке в правильном направлении.Как передать член класса (переменную?) В функцию?
Файл с форматированными данными (время, температура, скорость ветра). Я должен создать связанный список с тремя разными «цепочками»; каждая цепочка имеет одни и те же данные, но отличается тем, что цепочка со временем будет считывать все данные по временному порядку, цепочка с температурой будет считывать данные в временном порядке, а цепочка с скоростью ветра будет читать данные в последовательности скорости ветра.
Я написал функцию, которая может успешно считывать данные с данного указателя и упорядочить список по времени. Но теперь я хочу использовать эту же функцию для чтения в том же указателе и организации других 2 списков.
Вот соответствующий код:
void datalogger::addData(int timestamp, double temperature, double windspeed){
weatherdata *n;
n = new weatherdata;
n->time = timestamp;
n->temp = temperature;
n->wind = windspeed;
n->next = nullptr;
ll.addData(n, 1);
}
void linkedlist::addData(weatherdata *newData, int selectionNo){
weatherdata *selection;
switch(selectionNo){
//linkedlist: TIME
case 1:
selection = timeHead;
break;
//linkedList: TEMP
case 2:
selection = tempHead;
break;
//linkedList: WIND
case 3:
selection = windHead;
break;
}
int marker = 0;
weatherdata *node;
weatherdata *current;
weatherdata *nextNumber;
node = new weatherdata;
node = newData;
node->next = nullptr;
//very first entry
if (selection == nullptr){
selection = node;
marker = 1;
}
//item should instead be in the first position
if (newData->time < selection->time){
nextNumber = timeHead;
selection = node;
node->next = nextNumber;
}
else {
//traverse the list until we find the correct place to put it in
current = selection;
nextNumber = selection->next;
//while "not yet at the end of the list"
while (nextNumber != nullptr){
//if its the same as another item DELETE
if ((newData->time == current->time) || (newData->time == nextNumber->time)) {
marker = 1;
break;
}
//the new item goes between the current and nextNumber
else if ((current->time < newData->time) && (newData->time < nextNumber->time)){
current->next = node;
node->next = nextNumber;
break;
}
//otherwise increment current and nextNumber for the next comparison
else {
current = nextNumber;
nextNumber = nextNumber->next;
}
}
//item goes at the end of the list
if ((nextNumber == nullptr) && (marker != 1)){
current->next = node;
}
}
switch(selectionNo){
case 1:
timeHead = selection;
break;
case 2:
tempHead = selection;
break;
case 3:
windHead = selection;
break;
}
}
В основном то, что я хочу сделать, это превратить это:
timeHead-> Время
в этом:
whicheverLinkedListHeadIwant -> whicheverClassMemberIwant
Таким образом, я могу использовать одну и ту же функцию для обработки всех трех связанных списков. Как вы могли заметить, используя оператор switch в начале моей функции linkedlist :: addData, я смог получить код для обработки «whicheverLinkedListHeadIwant», но для жизни меня не удастся получить «whicheverClassMemberIwant» до Работа.
Это то, что я пробовал:
char* classMemberSelection = "temp";
или char* classMemberSelection = "wind"
whicheverLinkedListHeadIwant->classMemberSelection;
Но компилятор просто возвращает ошибку о том, что classMemberSelection не является членом. Я не понимаю, как сделать вторую часть в зависимости от того, что я хочу.
Прошу прощения, если этот вопрос не имеет смысла. Я изо всех сил старался быть максимально ясным, но я все еще новичок со всем этим. Если вам нужно, чтобы я разместил дополнительные фрагменты проекта, я был бы рад помочь.
Вот несколько идей, чтобы попробовать: А) три списка. Добавьте данные ко всем трем. Затем сортируйте три списка после добавления всех элементов. B) одна функция вставки в связанном списке, которая принимает в качестве параметров элемент для вставки и указатель на одну из трех функций сравнения, которые функция вставки использует для определения того, где в списке должен быть помещен элемент. – user4581301
Заметка о том, почему вы пытались не работать: все приятные имена, которые вы используете, чтобы сделать ваш код доступным для чтения, хорошая работа на этом, кстати, были удалены компилятором и превращены в смещения и адреса. Для программы 'addData' это что-то вроде 0xFEDD00D, а' selection' - указатель стека + 16. «Ветер» ничего не значит во время выполнения, а для компилятора это просто строка, а не имя переменной. – user4581301
Это выглядит подозрительно: 'node = new weatherdata; node = newData; ' – greatwolf