搜索重复信息的算法

algorithm to search for duplicated information?

本文关键字:算法 信息 搜索      更新时间:2023-10-16

我正在编写一个程序,提示用户输入的信息是重复的。但是Dev-C++一直告诉我"class Student"没有名为"p"的成员,所以我猜算法或代码有问题,请查看:

学生.h

#ifndef STUDENT_H_
#define STUDENT_H_
#include "Person.h"
class Student: public Person {
    int ent_year;
    string major;
    public:
        Student *next;
        Student ();
        Student (int i_pid, string i_fname, string i_dob, string i_addr, int i_ent_year, string i_major);
        void Show ();
        void Set_ent_year (int i_ent_year);
        void Set_major(string i_major);
        int Get_ent_year();
        string Get_major();
};
#endif

StudentList.h

 #ifndef STUDENTLIST_H_
    #define STUDENTLIST_H_
    #include "Student.h"
    class StudentList {
        private:
            Student *head, *tail;
        public:
            Student p;
            Student *next;
            StudentList ();
            void SList_Init ();
            void AddTail (Student *p);
            void SubString (string s);
            void ListShow ();
            void ReadFile ();
            void findID();
            void findName();
            void findDOB();
            void findAddr();
            void findMajor();
            void findEY();
            void changeName();
            void changeDOB();
            void changeAddr();
            void changeMajor();
            void changeEY();
            void Add_Student ();
            bool is_duplicate(Student t);
    };
    void Open_file (string file_name);
    void Close_file ();
    #endif

.cpp文件

bool equalStudent(Student s1, Student s2) 
{
    return (s1.Get_ent_year() == s2.Get_ent_year())
            && ((s1.Get_addr()).compare(s2.Get_addr()) == 0)
            && ((s1.Get_dob()).compare(s2.Get_dob()) == 0)
            && ((s1.Get_fname()).compare(s2.Get_fname()) == 0)
            && ((s1.Get_major()).compare(s2.Get_major()) == 0);
}

bool is_duplicate(Student s1) {
    Student *head;
    Student *h1 = head;
    while (h1 != NULL) {
        if (equalStudent(h1->p, s1)) {
            return true;
        }
        h1 = h1->next;
    }
    return false;
}
void StudentList:: Add_Student () 
{
    int new_pid, new_ent_year;
    string new_fname, new_dob, new_addr, new_major;
    cout << endl << "Enter student information:" << endl;
    cout << "Full name: "; cin.ignore(1); getline (cin,new_fname);
    cout << "Date of birth: "; getline (cin,new_dob);
    cout << "Address: "; getline (cin,new_addr);
    cout << "Entrance year: "; cin >> new_ent_year;
    cout << "Major: "; cin.ignore(1); getline (cin,new_major);
bool duplicate = is_duplicate(new_pid, new_ent_year, new_fname, new_dob, new_addr, new_major); // call function to check for duplicate info
if (duplicate) {
    string proceed;
    cout << "Duplicated! Continue?  Proceed? [y/n] "; cin.ignore(1); getline (cin, proceed);
    if (proceed != "y") {
        return;
    }
}
Student *p = new Student (new_pid, new_fname, new_dob, new_addr, new_ent_year, new_major);
AddTail (p);
f.seekg(0, ios::end);
f << endl << new_pid << ":" << new_fname << ":" << new_dob << ":" << new_addr << ":" << new_ent_year << ":" << new_major;
}

以下是整个错误信息:

In function 'bool is_duplicate(Student)':
[Error] 'class Student' has no member named 'p'
In member function 'void StudentList::Add_Student()':
[Error] no matching function for call to 'StudentList::is_duplicate(int&, int&, std::string&, std::string&, std::string&, std::string&)'
[Note] candidate is:
In file included from StudentList.cpp
[Note] bool StudentList::is_duplicate(Student)
[Note] candidate expects 1 argument, 6 provided

我认为您应该将is_duplicate更改为

bool StudentList::is_duplicate(Student s1) { //this is a class member function, hence the StudentList::
    Student *h1 = head; //starting with the head of the list, just 1 variable is enough to iterate
    while (h1 != NULL) {
        //comparing current student with s1
        if (equalStudent(*h1, s1)) {
            return true;
        }
        h1 = h1->next;
    }
    return false;
}

还要注意你的函数定义。虽然您的Add_Student是正确定义的(void StudentList::Add_Student()(,但其余函数缺少StudentList::部分,这使得它们只是全局函数,而不是成员函数。

 private:
        Student *head, *tail;
    public:
        Student p;

您的"p"是StudentList类中Student类型的对象。您在代码中所说的是从Student而不是StudentList获取对象"p"。

最重要的是,我不完全确定,但我认为你希望"p"是一个指针,你稍后在你的cpp中定义

bool is_duplicate(Student s1) {
    Student *head;
    Student *h1 = head;
    while (h1 != NULL) {
        if (equalStudent(h1->p, s1)) {
            return true;
        }
        h1 = h1->next;
    }
    return false;
}

问题:通过在方法的作用域中声明重复的Student *head;Student *h1 = head;将把h1初始化为未初始化的局部变量,而不是类成员。