2017-02-04 3 views
0

Отказ от ответственности: Это для задания, но я не ищу, чтобы вы, ребята, писали мой код. Я ищу совет о том, что я делаю неправильно, и о точке в правильном направлении.Как передать член класса (переменную?) В функцию?

Файл с форматированными данными (время, температура, скорость ветра). Я должен создать связанный список с тремя разными «цепочками»; каждая цепочка имеет одни и те же данные, но отличается тем, что цепочка со временем будет считывать все данные по временному порядку, цепочка с температурой будет считывать данные в временном порядке, а цепочка с скоростью ветра будет читать данные в последовательности скорости ветра.

Я написал функцию, которая может успешно считывать данные с данного указателя и упорядочить список по времени. Но теперь я хочу использовать эту же функцию для чтения в том же указателе и организации других 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 не является членом. Я не понимаю, как сделать вторую часть в зависимости от того, что я хочу.

Прошу прощения, если этот вопрос не имеет смысла. Я изо всех сил старался быть максимально ясным, но я все еще новичок со всем этим. Если вам нужно, чтобы я разместил дополнительные фрагменты проекта, я был бы рад помочь.

+0

Вот несколько идей, чтобы попробовать: А) три списка. Добавьте данные ко всем трем. Затем сортируйте три списка после добавления всех элементов. B) одна функция вставки в связанном списке, которая принимает в качестве параметров элемент для вставки и указатель на одну из трех функций сравнения, которые функция вставки использует для определения того, где в списке должен быть помещен элемент. – user4581301

+0

Заметка о том, почему вы пытались не работать: все приятные имена, которые вы используете, чтобы сделать ваш код доступным для чтения, хорошая работа на этом, кстати, были удалены компилятором и превращены в смещения и адреса. Для программы 'addData' это что-то вроде 0xFEDD00D, а' selection' - указатель стека + 16. «Ветер» ничего не значит во время выполнения, а для компилятора это просто строка, а не имя переменной. – user4581301

+0

Это выглядит подозрительно: 'node = new weatherdata; node = newData; ' – greatwolf

ответ

0

Сначала определим три функции, по одному для каждого типа сравнения

bool comparetime(weatherdata * left, 
       weatherdata * right) 
{ 
    return left->time < right->time; 
} 
bool comparetemp(weatherdata * left, 
       weatherdata * right) 
{ 
    return left->temp < right->temp; 
} 
bool comparewind(weatherdata * left, 
       weatherdata * right) 
{ 
    return left->wind < right->wind; 
} 

Все эти ребята делают это сказать вам, если один меньше другого. Теперь мы подправить

void linkedlist::addData(weatherdata *newData, int selectionNo) 

в

void linkedlist::addData(weatherdata *newData, 
         bool (*comparefp)(weatherdata * left, 
              weatherdata * right)) 

взять одну из вышеперечисленных функций в качестве параметра.Далее мы хотим, чтобы найти, где в списке newData идет и вытолкнуть его в:

while (nextNumber != nullptr && comparefp(newData, nextNumber)) 
// keep looking until end of list or we pass the insert location 
{ 
    lastNumber = nextNumber; 
    nextNumber = nextNumber.next; 
} 
// insert into list 
newData.next=nextNumber; 
lastNumber.next=newData; 

и вызова linkedlist::addData

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; 

    // add to each list  
    timelist.addData(n, comparetime); 
    templist.addData(n, comparetemp); 
    windlist.addData(n, comparewind); 
} 
Смежные вопросы