2017-02-04 97 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); 
} 
相关问题