C ++:在链表中查找类的最高值

时间:2016-05-03 07:14:37

标签: c++ class linked-list

我正在完成一项涉及创建申请人链接列表(存储为班级)的作业,每个作业都有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);
};

问题肯定在于我的回归功能,我只是不确定在哪里。

3 个答案:

答案 0 :(得分:2)

刚刚使用了std::max_elementstd::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;