C ++链接列表问题

时间:2014-08-01 14:54:27

标签: c++ linked-list

我一直在做一个小小的个人项目,并遇到了障碍。该项目的目的是添加到我的Github,但我已经在上周一直盯着我的代码,无法找到它出错的地方。该项目是对我自己的能力的测试,以及我对C ++中链接列表的理解。在继续之前,这是我的代码

#include <iostream>

using namespace std;

struct payload {
    int ID;
    int x;
    int y;
    string name;
};

struct node {
    node* prev;
    node* next;
    bool isRoot;
    payload data;
};

node* fillStruct(node* tmp);
void print(node* tmp);

int main(void) {
    node* temp;
    node* list;
    node* iterator;

    bool done = false;
    int count = 0;
    char answer;

    do {
        temp = new node();
        temp = fillStruct(temp);
        if (count == 0) {
            list = new node();
            list = temp;
            list->prev = NULL;
            list->next = NULL;
            list->isRoot = true;
        } else {
            list->next = temp;
            temp->prev = list;
            list = new node();
            list = temp;
        }
        count++;

        cout << "Will more elements be added to the list?\n [Y or N]\n";
        cin >> answer;
        switch (answer) {
            case 'y':
            case 'Y':
                break;
            case 'n':
            case 'N':
                list->next = NULL;
                done = true;
                break;
            default:
                break;
        }
    } while (!done);

    while (list->prev != NULL) {
        list = list->prev;
    }

    int identifier = 100;

    while (1) {
        list->data.ID = identifier;
        identifier++;
        if (list->next == NULL)
            break;
        list = list->next;
    }

    while (list->prev != NULL) {
        list = list->prev;
    }

    while (1) {
        print(list);
        if (list->next == NULL)
            break;
        list = list->next;
    }

    return 0;
}

node* fillStruct(node* tmp) {
    if (!tmp) {
        cerr << "Unauthorized access. Terminating program";
        return tmp;
    }

    cout << "Please enter the X value.\n";
    cin >> tmp->data.x;
    cout << "Please enter the Y value.\n";
    cin >> tmp->data.y;
    cout << "Please enter the data name\n";
    cin >> tmp->data.name;

    return tmp;
}

void print(node* tmp) {
    cout << "Identifier: " << tmp->data.ID << endl;
    cout << "         X: " << tmp->data.x << endl;
    cout << "         Y: " << tmp->data.y << endl;
    cout << "      Name: " << tmp->data.name << endl;
}

代码编译并执行正常。我遇到的问题是在代码的打印阶段。它切断了最后一个元素,我不知道为什么。据我所知,第二个while(1)应该在打印出最终元素后终止。如果有人能提供指导,我将不胜感激。提前谢谢,像往常一样,如果有什么我可以补充澄清,我会的。

1 个答案:

答案 0 :(得分:0)

关注您的代码后,最好将list保留在列表头部,并使用指针来遍历列表。

node* list = NULL;
node* ptr = NULL; // tail
do {
    temp = new node();
    temp = fillStruct(temp);
    temp->prev = ptr;
    temp->next = NULL;
    if (ptr) {
        ptr->next = temp;
    }
    ptr = temp;
    if (!list) {
        list = ptr;
    }
    count++;

    cout << "Will more elements be added to the list?\n [Y or N]\n";
    cin >> answer;
    switch (answer) {
        case 'y':
        case 'Y':
            break;
        case 'n':
        case 'N':
            done = true;
            break;
        default:
            break;
    }
} while (!done);



int identifier = 100;
for (ptr = list; ptr; ptr = ptr->next) {
    ptr->data.ID = identifier;
    identifier++;
}

for (ptr = list; ptr; ptr = ptr->next) {
    print(list);
}