所以我创建了一个链表,应该从文件中打印出姓名、年龄、专业和 GPA。
当我在Qt Creator中运行它时,它似乎可以工作,但是当我尝试在cloud9中运行它时,它似乎没有工作。
例如,findStudent 函数没有找到学生 - 而是显示为"未找到学生"。
它似乎也不喜欢我格式化它的方式,节点(名称、年龄、专业、gpa(的所有内容看起来都是相互打印的。
除非我将每个人的信息标记为最右侧,否则它会这样做,但这不是我真正想要的,因为这最终在 cloud9 之外看起来并不那么好。
学生名单.h:
#ifndef STUDENTLIST_H
#define STUDENTLIST_H
#include <iostream>
#include <iomanip>
#include <fstream>
#include <stdlib.h>
using namespace std;
struct StudentNode{
string name;
int age;
string major;
double gpa;
StudentNode *link;
};
void createLinkedList(StudentNode *&head);
void findStudent(StudentNode *&head, string find);
void removeStudent(StudentNode *&head);
double calculateGPA(StudentNode *&head);
void printList(StudentNode *&head);
#endif // STUDENTLIST_H
学生名单.cpp:
#include "studentlist.h"
void createLinkedList(StudentNode *&head){
StudentNode *last = NULL;
StudentNode *newNode = NULL;
fstream inFile;
inFile.open("inFile.txt");
if (inFile.fail()){
cout << "file failed to open" << endl;
exit(1);
}
else{
string newLine;
getline(inFile, newLine);
newNode = new StudentNode;
getline(inFile, newNode->name);
inFile >> newNode->age;
getline(inFile, newLine);
getline(inFile,newNode->major);
inFile >> newNode->gpa;
newNode->link = NULL;
head = newNode;
last = newNode;
while(!inFile.eof()){
getline(inFile, newLine);
getline(inFile, newLine);
newNode = new StudentNode;
getline(inFile, newNode->name);
inFile >> newNode->age;
getline(inFile, newLine);
getline(inFile,newNode->major);
inFile >> newNode->gpa;
newNode->link = head;
head = newNode;
}
}
inFile.close();
}
void findStudent(StudentNode *&head, string find){
StudentNode *current = head;
if(current->link == NULL){
cout << "Student Not Found" << endl;
}
else if(current->name == find){
cout << "Student Found:" << endl;
cout <<left<< setw(15);
cout <<current->name <<setw(7);
cout << current->age<<setw(15);
cout << current->major << setw(4);
cout << current->gpa;
}
else{
findStudent(current->link, find);
}
}
void removeStudent(StudentNode *&head){
StudentNode *temp_ptr;
temp_ptr = head->link;
cout << "Front Node Deleted:" << endl;
cout << left << setw(15);
cout << "Name" <<setw(7) << "Age" <<setw(15)
<< "Major" <<setw(4) << "GPA" <<setw(15) << endl;
cout <<head->name <<setw(7);
cout << head->age<<setw(15);
cout << head->major << setw(4);
cout << head->gpa;
delete head;
head = temp_ptr;
temp_ptr = NULL;
}
double calculateGPA(StudentNode *&head){
StudentNode *current = head;
double calculatedGPA;
int num_students=0;
while(current!= NULL){
calculatedGPA += current->gpa;
current = current->link;
num_students++;
}
cout << fixed << setw(3) << setprecision(2);
return calculatedGPA/num_students;
}
void printList(StudentNode *&head){
StudentNode *current = head;
cout << left << setw(15) << "Name"
<<setw(7)<<"Age" << setw(15)<< "Major"
<< setw(7) << "GPA" << endl;
while(current!= NULL){
cout << setw(15) << current->name<< setw(7);
cout << current->age << setw(15);
cout << current->major << setw(7);
cout << current->gpa << endl;
current = current->link;
}
}
主.cpp:
#include <iostream>
#include "studentlist.h"
using namespace std;
int main(int argc, char *argv[])
{
StudentNode *head;
createLinkedList(head);
printList(head);
cout << endl;
findStudent(head, "Anna White");
cout << endl << endl;
removeStudent(head);
cout << endl << endl;
cout << "Updated Student List: " << endl;
printList(head);
cout << endl;
cout << "GPA: " << calculateGPA(head) << endl;
return 0;
}
QT 输出:
Name Age Major GPA
Paul Johnson 18 Physics 3.7
Anna White 19 English 3.2
John Smith 20 Math 3.5
Anthony Rogers 21 Art 3.1
Cynthia Morris 24 History 3.6
Student Found:
Anna White 19 English 3.2
Front Node Deleted:
Name Age Major GPA
Paul Johnson 18 Physics 3.7
Updated Student List:
Name Age Major GPA
Anna White 19 English 3.2
John Smith 20 Math 3.5
Anthony Rogers 21 Art 3.1
Cynthia Morris 24 History 3.6
GPA: 3.35
Press <RETURN> to close this window...
在 Cloud9 中输出而不重新格式化:
Name Age Major GPA
3.7 cs
3.2 lish
3.5
3.1
3.6
Student Not Found
Front Node Deleted:
Name Age Major GPA
3.7 ysics
Updated Student List:
Name Age Major GPA
3.2 lish
3.5
3.1
3.6
GPA: 3.35
在 Cloud9 中重新格式化输出:
Name Age Major GPA
Paul Johnson 18 Physics 3.7
Anna White 19 English 3.2
John Smith 20 Math 3.5
Anthony Rogers 21 Art 3.1
Cynthia Morris 24 History 3.6
Student Not Found
Front Node Deleted:
Name Age Major GPA
Paul Johnson 18 Physics 3.7
Updated Student List:
Name Age Major GPA
Anna White 19 English 3.2
John Smith 20 Math 3.5
Anthony Rogers 21 Art 3.1
Cynthia Morris 24 History 3.6
GPA: 3.35
FindStudent:
的几个问题
首先,在评估列表中的名称之前,检查当前节点以查看是否位于列表末尾。 这可能是你的错误。 如果列表中只有一个项目,或者开始查找的项目位于列表的末尾,findStudent
将看到节点的链接成员为 null,并在评估之前返回current->name==find
其次,findStudent
是递归的。 如果列表足够大,findStudent
将创建堆栈溢出。(你的程序会崩溃(。
您的代码,带有修复:
StudentNode* findStudent(StudentNode *head, const string& find) {
StudentNode *current = head;
while ((current != NULL) && (current->name != find)) {
current = current->link;
}
if (current != NULL) {
cout << "Student Found:" << endl;
cout <<left<< setw(15);
cout <<current->name <<setw(7);
cout << current->age<<setw(15);
cout << current->major << setw(4);
cout << current->gpa;
}
else {
cout "Student not found" << endl;
}
return current;
}
您遇到的另一个错误:
double calculateGPA(StudentNode *&head){
StudentNode *current = head;
double calculatedGPA; // UNINITIALIZED VARIABLE!
int num_students=0;
while(current!= NULL){
calculatedGPA += current->gpa;
确保将caculatedGPA
初始化为0
double calculatedGPA = 0;
<意见>意见> 第三,所有函数都有列表头作为对指针的引用传递。 按指针或引用传递,但不能同时传递两者。改进的函数签名:
StudentNode* createLinkedList();
StudentNode* findStudent(const string& find);
StudentNode* removeStudent(StudentNode *head); // removes the head and returns the list's new head:
double calculateGPA(StudentNode* head);
void printList(StudentNode* head);