基本上我正在尝试使这个功能起作用,它在功能上是一个链表但是带有名为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;
}
有没有人对此有任何见解?我一直在扯掉我的头发,并且在我的智慧结束时为什么它是空的。我无法找到我在其他任何主题中理解的答案,这是我的最后手段。如果有人可以提供帮助,我会永远感激。
答案 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;