我的头指针显示为null虽然我明确指定它c ++

时间:2016-11-04 01:28:24

标签: c++ pointers nullptr

基本上我正在尝试使这个功能起作用,它在功能上是一个链表但是带有名为ticket的节点。获取错误“head is nullptr”,即使它输出的是我已分配头部(cout语句被调用)。

无论如何,这是我的flight.cpp

Flight::Flight() {
    head = NULL;
}
Flight::Flight(ticket* input) {
    head = input;
}
void Flight::printTicket() {
    ticket* iterator = head;
    while (iterator->next != NULL) {
        std::cout << iterator->name << std::endl;
    }
}


//00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
ticket* Flight::findSpot(ticket* t) { //returns the ticket before where the new ticket needs to be inserted
    std::string name = t->name;
    ticket* iterator = head;

    while (iterator->next != NULL) {
        if (isBefore(iterator->name, name)) {
            iterator = iterator->next;
        }
        return iterator;
    }
    std::cout << "\nFIND SPOT DID NOT WORK\n";
    return t;
}
void Flight::addTicket(std::string inName) {
    std::cout << "4 ";
    ticket *tmp = ( inName, NULL);
    std::cout << "5 ";
    if (head == NULL) {
        std::cout << "1, ";
        head = tmp;
    }
    else {
        std::cout << "2, ";
        ticket* after = findSpot(tmp);
        ticket* before = after->next;
        after->next = tmp;
        tmp->next = before;
    }
}
//00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000




std::string Flight::tolowercase(std::string input) {
    for (int i = 0; i < input.length(); i++) {
        if (input[i] < 97) {
            input[i] = (input[i] + 32);
        }
    }
    return input;
}
bool Flight::isBefore(std::string input1, std::string input2) {
    input1 = tolowercase(input1);
    input2 = tolowercase(input2);

    for (int i = 0; (i < input1.size() && i < input2.size()); i++) {
        if (input1[i] < input2[i]) return true;
        else if (input2[i] < input1[i]) return false;
    }
    std::cout << "ISBEFORE IS BROKEN";
    return false;
}

Flight.h

struct ticket {
    std::string name = "";
    ticket *next = NULL;
};


class Flight {
private:
    ticket* head;

    ticket* findSpot(ticket* t);

    //converts strings to lower case to allow better comparing
    std::string tolowercase(std::string input);
    bool isBefore(std::string input1, std::string input2);

public:
    Flight();
    Flight(ticket * input);
    void printTicket();
    void addTicket(std::string inName);

};

我的source.cpp

int main() {
    std::cout << "Hey!";
    Flight james = Flight();
    std::cout << "Hahaha!";
    std::string jaaems = "Jaems";
    james.addTicket(jaaems);
    james.addTicket("hahahaha");
    james.addTicket("hopefullythisworks");
    std::cout << "Made it!";
    james.printTicket();


    return 0;
}

有没有人对此有任何见解?我一直在扯掉我的头发,并且在我的智慧结束时为什么它是空的。我无法找到我在其他任何主题中理解的答案,这是我的最后手段。如果有人可以提供帮助,我会永远感激。

1 个答案:

答案 0 :(得分:-1)

初始化ticket的正确方法是:

ticket *tmp = new ticket(inName, NULL);

ticket tmp = ticket(inName, NULL);
head = &tmp;

<强>更新

您需要更改ticket声明以包含构造函数:

struct ticket {
    std::string name;
    ticket *next;
    ticket(std::string aname, ticket *anext) {
       name = aname;
       next = anext;
    } 
};

或者如果你不想添加构造函数,只需像这样初始化它:

ticket tmp = {inName, NULL};
head = &tmp;