- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数3-栈队列b.ppt.ppt
3.4 队列(排队,queue)
3.4.2 链式队列: 用带表头结点的单链表表示队列
1.一般形式
(1)空队列:
(2) 非空队列:
其中: Q.front front----队头(首)指针,指向表头结点。
Q.rear----队尾指针,指向队尾结点。
Q.front-data 不放元素。
Q.front-next 指向队首结点a1。; 2.定义结点类型
(1)存放元素的结点类型
typedef struct Qnode
{ ElemType data; //data为抽象元素类型
struct Qnode *next; //next为指针类型
}Qnode,*QueuePtr; //结点类型, 指针类型
其中:Qnode----结点类型
QueuePtr----指向Qnode的指针类型
(2)由头、尾指针组成的结点类型
typedef struct
{ Qnode *front; //头指针
Qnode *rear; //尾指针
}LinkQueue; //链式队列类型;3.生成空队列算法
#define LENG sizeof(Qnode) //求结点所占的单元数
LinkQueue InitQueue( ) //生成仅带表头结点的空队??Q
{ LinkQueue Q; //说明变量Q
Q.front=Q.rear=(QueuePtr)malloc(LENG);//生成表头结点
Q.front-next=NULL; //表头结点的next为空指针
return Q; //返回Q的值
};P;5.出队----删除队头结点
(1)若原队列有2个或2个以上的结点;(2)若原队列只有1个结点;出队算法:
LinkQueue DelQueue(LinkQueue Q, ElemType *e)
{ Qnode *p; //说明变量p
if (Q.front==Q.rear) //若原队列为空
exit(Empty queqe); //退出去
p=Q.front-next; //P指向队头结点
(*e)=p-data; //取出元素,e指向它
Q.front-next=p-next; //删除队头结点
if (Q.rear==p) //若原队列只有1个结点
Q.rear=Q-front; //修改尾指针
free(p); //释放被删除结点的空间
return Q; //返回出队后的Q
}; ; ; D; G; 3.设f指向队头元素前一个空位,约定此空位不放元素;r指向
队尾元素。将Q[0..5]解释为循环队列。;; F;4.设f指向队头元素;r指向队尾元素的下一个空位,约定此空
位不放元素。将Q[0..5]解释为循环队列。;; F;5.顺序队列算法举例; (2)出队算法
设用Q[0..maxleng-1]表示顺序队列, 头指针f指向队头元
素的前一个空位,r指向队尾元素, 删除队头元素,送入指针e
所指向的对象中。
void De_Queue(Elemtype Q[ ],int *f,*r,Elemtype *e)
{ if (f==r) //Q为空队列
exit(Empty Queue); //退出
f++; //头指针后移一个位置
f=f % maxleng; //为循环队列
(*e)=Q[f]; //取走队头元素,送(*e)
};课堂讨论;课堂讨论;课堂讨论;课堂讨论;作业; //弹出栈顶元素送e, top为链式栈的顶指针
struct node *pop(struct node *top,Elemtype *e)
{ struct node *p;
if (top==NULL) exit(Empty stack) //空栈,退出
p=top; //p指向原栈的顶结点
(*e)=p-data; //取出原栈的顶元素送(*e)
top=t
文档评论(0)