因此,我创建了一个链接列表,该列表应该从文件中打印出名称,年龄,专业和GPA。
当我在Qt Creator中运行它时似乎正在工作,但是当我尝试在cloud9中运行它时,它似乎没有成功。
例如,findStudent函数找不到学生 - 而是将其作为"未找到学生。"
它似乎也不像我对它进行格式化的方式,节点(名称,年龄,专业,gpa)的所有内容看起来都是在彼此之上打印。
这样做除非我将每个人的信息标记到最右边,但这并不是我想要的,因为最终不会在cloud9之外看起来那么好。
studentlist.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
studentlist.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;
}
}
main.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
答案 0 :(得分:0)
FindStudent:
首先,在评估列表中的名称之前,您要检查当前节点以查看是否在列表末尾。这可能是你的错误。如果列表中只包含一个项目,或者列表末尾的项目begin findStudent
将看到节点的链接成员为空并在评估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;
&lt; views&gt; 第三,所有函数都将列表头作为对指针的引用传递。通过指针或引用,但不是两者。改进的功能签名:
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);