写了这段代码:
#include<iostream>
using namespace std;
struct deque
{
int data;
deque *next, *prev;
};
bool isEmpty(deque* deq)//проверка на существование елемента по адресу
{
if (deq == NULL)
return true;
else return false;
}
deque *Push_left(deque *deq, int data)
{
deque *dq;
if (isEmpty(deq))
{
dq = new deque;
dq->data = data;
dq->next = NULL;
dq->prev = NULL;
}
else
{
dq = new deque;
dq->data = data;
dq->next = deq;
dq->prev = NULL;
deq->prev = dq;
}
return dq;
}
deque *Push_right(deque *deq, int data)
{
deque *dq;
if (isEmpty(deq))
{
dq = new deque;
dq->data = data;
dq->next = NULL;
dq->prev = NULL;
}
else
{
dq = new deque;
dq->data = data;
dq->next = NULL;
dq->prev = deq;
deq->next = dq;
}
return dq;
}
deque *Pop_left(deque *deq)
{
deque*dq;
if (isEmpty(deq))
{
cout << "Delete is impossible, elem. not found;" << endl;
dq = deq;
}
else
{
while (deq->prev != NULL) deq = deq->prev;
dq = deq->next;
delete deq;
}
return dq;
}
deque *Pop_right(deque *deq)
{
deque*dq;
if (isEmpty(deq))
{
cout << "Delete is impossible, elem. not found;" << endl;
dq = deq;
}
else
{
while (deq->next != NULL) deq = deq->next;
dq = deq->prev;
delete deq;
}
return dq;
}
deque *Print_left(deque * deq)
{
deque *q = deq;
deque *tmp = NULL;
while (q != NULL)
{
cout << q->data << '\t' << q->next <<'\t'<<q->prev << endl;
tmp = Push_left(tmp, q->data);
q = Pop_left(q);
}
while (tmp != NULL)
{
q = Push_right(q, tmp->data);
tmp = Pop_right(tmp);
}
cout << endl;
return q;
}
deque *Print_right(deque * deq)
{
deque *q = deq;
deque *tmp = NULL;
while (q != NULL)
{
cout << q->data << '\t' << q->prev << endl;
tmp = Push_right(tmp, q->data);
q = Pop_right(q);
}
while (tmp != NULL)
{
q = Push_left(q, tmp->data);
tmp = Pop_left(tmp);
}
cout << endl;
return q;
}
/*deque *Servise_left(deque * deq, int x)
{
deque *q = deq;
deque *tmp = NULL;
while (q != NULL)
{
tmp = Push_left(tmp, q->data);
q = Pop_left(q);
}
tmp = deq;
while (tmp != NULL)
{
q = Push_right(q, tmp->data);
if (q->data = x) q = Push_right(q, 0);
tmp = Pop_right(tmp);
}
cout << endl;
return q;
}
deque *Servise_right(deque * deq, int x)
{
deque *q = deq;
deque *tmp = NULL;
while (q != NULL)
{
tmp = Push_right(tmp, q->data);
q = Pop_right(q);
}
tmp = deq;
while (tmp != NULL)
{
q = Push_left(q, tmp->data);
if(q->data = x) q = Push_left(q, 0);
tmp = Pop_left(tmp);
}
cout << endl;
return q;
}*/
int main()
{
deque *first = NULL, *last = NULL;
char k;
int x;
int f, data;
do
{
system("CLS");
cout << "1. Add element" << endl;
cout << "2. Del element" << endl;
cout << "3. Print" << endl;
cout << "4. Servise" << endl;
cout << "5. Exit" << endl;
cout << endl;
cout << "Your choice - ";
cin >> f;
switch (f)
{
case 1:
{
if (first == NULL)
{
cout << "Element data = ";
cin >> data;
first = last = Push_left(first, data);
}
else
{
cout << "Element data = ";
cin >> data;
cout << "Left or Right - ";
cin >> k;
if (k == 'L' || k == 'l')
first = Push_left(first, data);
else
last = Push_right(last, data);
}
system("pause");
break;
}
case 2:
{
if (first == NULL)
{
cout << "\n Queue is empty" << endl;
}
else {
cout << "Left or Right - ";
cin >> k;
if (k == 'L' || k == 'l')
Pop_left(first);
else
Pop_right(last);
system("pause");
break;
}
}
case 3:
{
if (first == NULL)
{
cout << "\n Queue is empty" << endl;
}
else
{
cout << "Left or Right - ";
cin >> k;
if (k == 'L' || k == 'l')
first = Print_left(first);
else
last = Print_right(last);
}
system("pause");
break;
}
case 4:
{
if (first == NULL)
{
cout << "\n Queue is empty" << endl;
}
else
{
cout << "Seached number - ";
cin >> x;
cout << "Left or Right - ";
cin >> k;
if (k == 'L' || k == 'l')
first = Servise_left(first,x);
else
last = Servise_right(last,x);
}
system("pause");
break;
}
default: break;
}
} while (f != 4);
system("pause");
return 0;
}
错误发生在这个地方:
deque *Print_left(deque * deq)
{
deque *q = deq;
deque *tmp = NULL;
while (q != NULL)
{
cout << q->data << '\t' << q->next <<'\t'<<q->prev << endl;
tmp = Push_left(tmp, q->data);
q = Pop_left(q);
}
while (tmp != NULL)
{
q = Push_right(q, tmp->data);
tmp = Pop_right(tmp);
}
cout << endl;
return q;
}
deque *Print_right(deque * deq)
{
deque *q = deq;
deque *tmp = NULL;
while (q != NULL)
{
cout << q->data << '\t' << q->prev << endl;
tmp = Push_right(tmp, q->data);
q = Pop_right(q);
}
while (tmp != NULL)
{
q = Push_left(q, tmp->data);
tmp = Pop_left(tmp);
}
cout << endl;
return q;
}
错误是 tmp 和 deq 在第一次循环的第一次迭代后丢失了值。deq 变量应该这样做,而 tmp 在我的想法中应该保持它的值。它在哪里清空以及如何解决?
最好立即在结构中定义每个元素都有空指针,这样以后就不会一直重复:
这里可以更容易:
如果你有一个指向队列第一个元素的指针,那么你只需要在这个队列中添加另一个元素,返回任何东西都没有意义。并观察您的代码是如何缩短的:
同样在这里:
Чтобы снимать с очереди, не нужно трогать указатель, указывающий на начало очереди(это логическая ошибка), поскольку вам всегда нужно будет найти начало. Для этого пройдитесь другим указателем. И, впринципе, можно тоже ничего не возвращать, но можно возвращать и
boolчтобы иметь возможность написать кодwhile(Pop_left(deq) {...}Теперь об ощибках, которые вас беспокоили. Зачем вы пытаетесь что либо класть в очередь или снимать с него, когдв вам нужно просто вывести? Так просто выводите:
В программе вам нужен всего один нулевой указатель(допустим deque *first = NULL), который будет указывать на начало очереди, и вам нужно просто вызвать ваши функции с этим указателем, и никаких присваиваний не нужно. Например:
Не скажу, что это лучший вариант представления очереди, но, думаю, вам он вполне подойдет. P.S. надеюсь после моих обьяснений, функцию
Servise_right, сможете переписать сами. И старайтесь писать коды так, чтобы не было повторений