Итак, я создал связанный список, который должен распечатать имя, возраст, майор и GPA из файла.
Кажется, он работает, когда я запускаю его в Qt Creator, но когда я пытаюсь запустить его в облаке 9, кажется, что он не работает.
Например, функция findStudent не находит ученика — вместо этого она выглядит как «ученик не найден».
Кажется, мне не нравится то, как я его отформатировал, все, начиная с узлов (name, age, major, gpa), печатается поверх друг друга.
Он делает это до тех пор, пока я не перенесу информацию о каждом из них в крайнее правое положение, но это не совсем то, что я хочу, так как в итоге это выглядит не так хорошо за пределами облака9.
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 FoundFront 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
переформатировал вывод в облаке9:
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 FoundFront 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);
Других решений пока нет …