我正在完成一项涉及创建申请人链接列表(存储为班级)的作业,每个作业都有ID,年级,年份和数值(得分)的值。我需要编写一个函数,在此列表中搜索得分最高的申请人并将其返回。我能够找到最高分,但我只会返回该值,而不是该特定申请人的整个班级。更改我的代码后,我现在获得4个值(ID,年级,年份和分数)中的每一个的输出,但它们都显示0,这是初始化值。这是所有相关的代码。
#include <iostream>
#include <fstream>
#include <iomanip>
#include "applicant.cpp"
using namespace std;
struct Linkapp
{
Applicant person;
Linkapp *next;
};
class Linkthem
{
protected:
Linkapp *start;
public:
Linkthem(void);
void link(Applicant);
void printthem(void);
Applicant returnbest(void);
};
Applicant best;
Linkthem::Linkthem()
{
start = NULL;
};
void
Linkthem::link(Applicant one)
{
Linkapp *p;
p = new Linkapp;
p->person = one;
p->next = start;
start = p;
}
Applicant Linkthem::returnbest (void)
{
Linkapp *travel;
travel = start;
best = travel->person;
while (travel != NULL)
{
if (travel->person.return_value() > best.return_value())
best = travel->person;
travel = travel->next;
}
return best;
}
int
main()
{
ifstream infile;
Applicant fellow;
Linkthem mylist;
int id, yrs;
char knowledge;
cout.setf(ios::fixed);
cout.precision(2);
infile.open("applicnt.dat");
while ( !infile.eof() )
{
infile >> id >> knowledge >> yrs;
fellow.store_id(id);
fellow.store_skill(knowledge);
fellow.store_years(yrs);
mylist.link(fellow);
}
mylist.printthem();
cout << best.return_id() << ' ' << best.return_skill() << ' ';
cout << best.return_years() << ' ' << best.return_value() << endl;
fellow = mylist.returnbest();
return 0;
}
来自&#34; applicant.cpp&#34;
class Applicant
{
protected:
int id;
char skill;
int years;
float value;
void calc_value(void); // <--- NOT for general use, called by return_value
public:
Applicant(void);
void store_id(int);
void store_skill(char);
void store_years(int);
int return_id(void);
char return_skill(void);
int return_years(void);
float return_value(void);
};
问题肯定在于我的回归功能,我只是不确定在哪里。
答案 0 :(得分:2)
刚刚使用了std::max_element
和std::list
(双重链接)或std::forward_list
(单链接),但我可能默认为std::vector
:
std::max_element(begin(list), end(list), [](Applicant const& a, Applicant const& b) {
return (a.return_value() < b.return_value());
});
如果比较函数适用于整个Applicant
类,则为所述类定义operator<
可能是有意义的。
答案 1 :(得分:0)
因为您似乎必须编写自己的列表,所以有一些提示:
Linkapp似乎是你的类Linkthem的内部细节,因此将其作为私有内部类是不错的主意。
如果你的列表是空的,那么returnbest(如果我可以假设类似的实现,则可能是printthem)将失败并出现分段错误。如果start为null,则需要检查:if(start)
{
// rest of your code
}
else
{
// return some appropriate default
// throw exception
// or whatever else seems appropriate to you
}
你的getter / setter有很多不常见的名字。命名有两种主要变体:
int getId(); // or get_id(), but cammel casing is more common these days
void setId(int id);
// vs
int id();
void id(int id);
Applicant best
无需成为全局变量。而是将其作为局部变量放在函数中。
现在你的实际问题:
仔细查看您的主要功能 - 您在哪里首先调用returnbest? 在之后你写出了最好的价值观。这意味着您从未将任何其他值分配给最佳值。您必须先将fellow = mylist.returnbest();
放在输出最佳的行之前。但是然后使用fellow
作为输出而不是最佳,并且您可以在returnbest函数中使best
成为局部变量...
答案 2 :(得分:0)
mylist.printthem();
cout << best.return_id() << ' ' << best.return_skill() << ' ';
cout << best.return_years() << ' ' << best.return_value() << endl;
fellow = mylist.returnbest();
我不知道你在printthem()
成员函数中做了什么,因为你没有提供这个函数的实现,但是我假设你没有设置变量best
。所以,你是打印未设置的变量,可能初始化为零。
你想要做的更有可能:
mylist.printthem();
best = mylist.returnbest();
cout << best.return_id() << ' ' << best.return_skill() << ' ';
cout << best.return_years() << ' ' << best.return_value() << endl;