我正在从事一项工作,涉及创建一个申请人的链接列表(作为类存储),每个申请人都有一个ID,等级,年份和一个数值(分数)。我需要编写一个函数,在此列表中搜索得分最高的申请人并将其返回。我能够找到最高的分数,但是我只会返回该值,而不是该特定申请人的整个类(class)。更改代码后,我现在获得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;
}

并来自“applicant.cpp”
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);
};

问题肯定在我的returnbest函数之内,我不确定在哪里。

最佳答案

由于您似乎不得不编写自己的列表,因此有些提示:

Linkapp似乎是您的类Linkthem的内部细节,因此使其成为私有(private)内部类也不是坏主意。

如果您的列表为空,则returnbest(如果我可以假定类似的实现,则可能是printthem)将失败,并出现分段错误。您需要检查,如果start首先为null:

if(start)
{
    // rest of your code
}
else
{
    // return some appropriate default
    // throw exception
    // or whatever else seems appropriate to you
}

您的获取者/设置者的名字很少见。命名有两种主要变体:

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?写下最佳值(value)之后。这意味着除了默认值以外,您从未分配其他任何值。您必须将fellow = mylist.returnbest();放在输出效果最佳的行之前。但是然后使用fellow而不是best来输出,您可以随意将best设置为returnbest函数中的局部变量...

关于c++ - C++:在链表中查找类的最大值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36997937/

10-12 07:31