我的代码在Qt Creator中工作,但在Cloud9中不起作用



所以我创建了一个链表,应该从文件中打印出姓名、年龄、专业和 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);

最新更新