class Queue
{
private:
struct Node{Item item;struct Node * next;};
enum {Q_SIZE = 10};
Node * front; //前一个数据
Node * rear; //后一个数据
int items; //当前数据的数量
const int qsize; //最大的数量
public:
Queue(int qs):qsize(qs),front(NULL),rear(NULL),items(0)
{
//front = NULL;
//rear = NULL;
//items = 0;
}
~Queue();
bool isempty()const;
bool isfull()const;
int queuecount()const;
bool enqueue(const Item & item);//增至队尾
bool dequeue(Item & item);//队首删除
};
bool enqueue(const Item & item)
{
//满的就退出
if(this->isfull())
{
return false;
}
//空的队列就增加
Node *add = new Node;
if(add == NULL)
return false;//未申请到内存也退出
add->item = item; //add的item就是形参
add->next = NULL;//add结构的next成员指针设为null
items++;
if(front == NULL) //如果队列是空
front = add; //add就为第一个
else
rear->next = add; //否则,当的rear的链接域指向add,
rear = add;//现在add是最后1个结点了,将它的地址给rear
return true;
}
节选部分,看不懂,磨了一夜加一个上午,大致懂了,关键就是rear->next = add; rear = add;这两句看不懂;
1.rear是指针,rear和add都是指向了结点,rear代表链中的最后1个结点,链接域始终未空.
那么rear->next = add所操作的就是将原来rear的链接域指针指向add,因此当前的rear的链接域不再为空了,而是指向了add,他也不再是最后1个结点,而变成倒数第2个
2.如1说明的,rear = add,因为此时add是最后1个结点了,就将他的地址赋给rear,
总结,一开始总认为rear->next = add; rear = add; 后一句操作会覆盖掉前一句代码,其实不然,是针对2个结构2个地址的操作,
比如:
strcut a
{
int a = 0;
};
a p1;
a p2;
a *p = &p1;
p->a = 1;
p = &p2;
p1的a值改了,变成1,不代表将p重指向p2时,p1的值会回归成0,因为涉及的操作只是将指针重定向到其他结构,而之前通过指针对上一个指向的结构做的任何操作都是与此无关的!