数据结构高职学习资料.ppt

  1. 1、本文档共45页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构高职学习资料数据结构高职学习资料

解决假溢出的方法之一是将队列的数据区data[0..MaxSize-1]看成头尾相接的循环结构,头尾指针的关系不变,将其称为“循环队列”,“循环队列”的示意图如图3-6所示,头尾相接的循环结构。 图3-6循环队列示意图 入队时的队尾指针加1操作修改为:q-rear=(q-rear+1) % MaxSize; 出队时的队头指针加1操作修改为:q-front=(q-front+1) % MaxSize; 设有循环队列,其初始状态是front=rear=0,各种操作后队列的头、尾指针的状态变化情况如下图3-7所示。 1 2 3 4 5 0 (a) 空队列 front rear 1 2 3 4 5 0 (b) d, e, b, g入队 front d e b g rear 1 2 3 4 5 0 (c) d, e出队 b g front rear 入队时尾指针向前追赶头指针,出队时头指针向前追赶尾指针,故队空和队满时头尾指针均相等。因此,无法通过front==rear来判断队列“空”还是“满”。 1 2 3 4 5 0 (d)i, j, k入队 b g front i j k rear 1 2 3 4 5 0 (e) b, g出队 i j k rear front 1 2 3 4 5 0 (f) r, p, s, t入队 i j k front r p rear 图3-7 循环队列操作及指针变化情况 就是说“队满”和“队空”的条件是相同的了,front==rear。这是必须要解决的问题。 方法一:附设一个存储队中元素个数的变量如num,当num==0时队空,当num==MaxSize时为队满。 方法二:少用一个元素空间,如3-7图(f)所示的情况就视为队满,也就是说,队满时还有一空闲单元,不能再增加元素,此时的状态:队尾指针rear+1就会从后面赶上队头指针。这种情况下队满的条件是:(rear+1) % MaxSize==front,能和队空front==rear条件区分开。 (1) 置空队 初始条件:队列不存在。 操作结果:构造一个空队列。 void Init_Queue(SeQueue *q) { q-front=q-rear=0; } (2)入队 初始条件:队q存在。 操作结果:对已存在的队列q,插入一个元素x到队尾。 void In_Queue(SeQueue *q, Datatype e) { if((q-rear+1)%MaxSize==q-front) printf(队满); else { q-data[q-rear]=e; q-rear=(q-rear+1)%MaxSize; } } (3)出队 初始条件:队列q存在。 操作结果:删除队首元素,并返回其值。 int Out_Queue(SeQueue *q, Datatype *e) { if(q-front==q-rear) { printf(队空); return 0; /*队空不能出队*/ } else { *e=q-data [q-front]; /*读出队头元素*/ q-front=(q-front+1)%MaxSize; return 1; /*出队完成*/ } } 2. 链队 采用链式存储结构的队称为链队。和链栈类似,用单链表来实现链队,根据队列的FIFO原则,为了操作上的方便,我们分别需要一个头指针和尾指针,如图3-8所示。 图3-8 链队示意图 图3-8中头指针front和尾指针rear是两个独立的指针变量,从结构性上考虑,通常将二者封装在一个结构中。 链队的描述如下: typedef struct node { Datatype data; struct node *next; } QNode; /*链队结点的类型*/ typedef struct { QNnode *front,*rear; }LQueue; /*将头尾指针封装在一起的链队*/ 定义一个指向链队的指针:LQueue *q; 按这种思想建立的带头结点的链队如图3-9所示。 图3-9 头尾指针封装在一起的链队 (1)创建一个带头结点的空队: 初始条件:队列不存在。 操作结果:构造一个空队列。 void Init_LQueue(LQueue *q) /*链队列初始化*/ { q-front = (QNode*)malloc(sizeof(QNode)); q-front-next = NULL; q-rear = q-front; } (2)入队 初

文档评论(0)

cxiongxchunj + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档