2017-02-04 90 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 - >無論哪個類別成員Iwant

這樣,我可以使用相同的函數來處理所有三個鏈表。正如你可能已經注意到的,在我的linkedlist :: addData函數的開頭使用switch語句,我能夠獲得代碼來處理「哪一個LinkedListHeadIwant」,但對於我來說,我無法設法讓「無論哪個ClassMemberIwant」工作。

這是我已經試過:

char* classMemberSelection = "temp";char* classMemberSelection = "wind"

whicheverLinkedListHeadIwant->classMemberSelection;

但是,編譯器會返回一個錯誤,指出classMemberSelection不是成員。我對如何使第二部分無論我希望是什麼都感到不知所措。

對不起,如果這個問題沒有意義。我竭盡全力儘可能清楚,但我仍然是一個初學者。如果你需要我發佈額外的項目,那麼我很樂意。

+0

這裏有一對夫婦的想法嘗試:A)三個列表。將數據添加到所有三個。然後在添加所有項目後對三個列表進行排序。 B)鏈接列表中的一個插入函數,該插入函數將需要插入的項目作爲參數以及指向三個比較函數中的一個的指針,插入函數用於確定項目必須放置在列表中的哪個位置。 – user4581301

+0

關於爲什麼你所嘗試的操作不起作用的說明:編譯器將所有用於使代碼可讀的漂亮的名稱,順利完成的工作順利完成,並轉換爲偏移量和地址。程序'addData'類似於0xFEDD00D,'selection'是堆棧指針+ 16.「wind」在運行時意味着什麼,編譯器只是一個字符串,而不是變量名。 – 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); 
} 
相關問題