Удаление данных из очереди - PullRequest
0 голосов
/ 03 июля 2018

Мне нужна помощь в использовании очереди в C ++.

У меня есть struct, который содержит 2 члена, которые я хочу удалить позже:

#define MAX 10

struct queue{
    int head,tail;
    string code[max], title[max];
} q;

А вот мой код очереди:

void delete(){
    if(empty()){
        cout<<"Queue is empty!";
    }else{ 
        int i;
        for (i = 0; i < q.tail; i++)
            q.code[i]=q.code[1+i];
        q.title[i]=q.title[i+1];
        q.tail--;
    }
    show_data();
}

Допустим, у меня есть 3 элемента в очереди:

  1. if01 | C ++

  2. if02 | рубин

  3. if03 | Java

Я хочу удалить элементы по одному. Поскольку это очередь, первые данные, которые должны быть удалены, это номер 1, верно?

Так должно получиться так:

  1. if02 | рубин

  2. if03 | Java

Но, к сожалению, это не работает так, я получаю вывод:

  1. if02 | C ++

  2. if03 | рубин

А потом, если я снова попытаюсь удалить, я получу вывод, подобный этому:

  1. if03 | C ++

Я не знаю, почему title не будет удален, как code.

Если я попытаюсь повернуть цикл вспять, как это:

for (i = 0; i < q.tail; i++)
    q.title[i]=q.title[i+1];
q.code[i]=q.code[1+i];
q.tail--;

code не удаляется, но title удаляет нормально.

1 Ответ

0 голосов
/ 03 июля 2018

Ваша петля не движется вокруг code и title членов вместе. Вы перемещаетесь только по одному из них внутри цикла, а затем перемещаете другой по 1 раз ПОСЛЕ окончания цикла.

Вам нужно добавить дополнительные фигурные скобки в тело цикла, например:

void delete() {
    if (empty()) {
        cout << "Queue is empty!";
    }
    else {
        for (int i = 0; i < q.tail; ++i) { // <-- add brace
            q.code[i]  = q.code[1+i];
            q.title[i] = q.title[i+1]; // <-- do this INSIDE the loop!
        } // <-- add brace
        q.tail--;
    }
    show_data();
}

Я бы предложил альтернативную реализацию - переместите члены code и title в их собственные struct, которые отделены от queue, и затем вы можете перемещать экземпляры этого struct как единое целое. единица измерения, например:

const int maxItems = 10;

struct data {
    string code, title;
};

struct queue {
    int head, tail;
    data items[maxItems];
} q;

...

void delete() {
    if (empty()) {
        cout << "Queue is empty!";
    }
    else { 
        for (int i = 0; i < q.tail; ++i)
            q.items[i] = q.items[1+i];
        q.tail--;
    }
    show_data();
}
...