C++ PRIMER PLUS 第12章 队列模拟的问题

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,因为涉及的操作只是将指针重定向到其他结构,而之前通过指针对上一个指向的结构做的任何操作都是与此无关的!

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页