这是我的第一篇文章。
我试着记住这些说明,但如果我错过了什么,我会提前道歉。
该程序是课堂作业,我们将使用三个不同的链接列表(学生、课程和交易,因为需要更好的词)制作成绩簿。
我发布的块将搜索列表(假设有一个,寻找具有相同信息的现有对象,这就是csearch
函数的作用。
如果没有找到,则创建一个新对象,并着手将其放入列表中,始终位于尾部。
所有这些都有效,直到它到达函数的右大括号,然后它出现分段错误。
我花了一天的大部分时间试图弄清楚为什么会发生这种情况,我希望你能帮助我。
void classes::addcourse(classes section)
{
int courseid;
char title[81];
course *temp= NULL, *search=NULL;
cout<<"Please enter the course id number."<<endl;
cin>>courseid;getchar();
cout<<"Please enter a course name."<<endl;
cin>>title;
search=section.csearch(courseid);
if (search != NULL)
{
cout<<"This course has already been entered."<<endl;
return;
}
temp=new course(courseid);
if (head==NULL)
{
sethead(temp);
settail(temp);
}
tail->setnext(temp);
settail(temp);
section.setcnum(section.getcnum()+1);
cout<<section.getcnum()<<endl;
temp->setname(title);
}
如果有帮助,这里是对象和容器的类定义,它们分别存储在 .h 文件中。
class course {
private:
int cid;
int average;
course *next;
char name[81];
public:
course(int);
void saveyourself(FILE *write);
void loadyourself(FILE *read);
//accessor functions
int getcid() {return cid;}
int getaverage() {return average;}
course* getnext() {return next;}
//mutator functions
void setnext(course *val) {next=val;}
void getname() {cout<<name;}
void setcid (int newcid) {cid=newcid;}
void setaverage (int newav) {average=newav;}
void setname (char word[]) {strcpy(name, word);}
};
class classes {
private:
course *head;
course *tail;
int numcourse;
public:
classes();
~classes();
course* csearch (int course);
void addcourse(classes section);
void classaverage(enrollment semester, classes section);
void save();
void load();
//accessor functions
int getcnum() {return numcourse;}
course* gethead() {return head;}
course* gettail() {return tail;}
//mutator functions
void setcnum(int num) {numcourse=num;}
void sethead(course *val) {head=val;}
void settail(course *val) {tail=val;}
};
如果出现这种情况,我将使用字符数组作为字符串,因为当我厌倦了来回切换时,我最终确定了这一点。
编辑:很抱歉没有添加构造函数,我忘记了它们,它们是:
course::course(int id=-1)
{
cid=id;
average=0;
strcpy(name, "name");
next=NULL;
}
classes::classes()
{
numcourse=0;
head=NULL;
tail=NULL;
}
我一直对未初始化的字符串感到偏执,所以这就是为什么它已经设置为某些东西的原因。我通常将它们初始化为“\0”,但这让我担心文件 I/O。