链式队列及其应用

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

己欲立而立人,己欲达而达人
百度文库——《论语》
3.4 链队及其应用
我们可以抽象出排队的数据特性——FIFO (first in first out), 具体表现如下: (1) 线性结构,具有线性特征; (2) 限制操作方式——只能从两端进行操作。
链式存储:
把数据在数学逻辑上的先后相邻关系用元 素的存储地址的指针(pointer)来指示,称之为 链式存储(linked mapping)。 S= (a1 , a2 , …… , an )
int deleteQue(Quque **q,int *pelem)//出队 void main() { int k=1,elem=0; int n=8; int i=4; int m=1; int j=1; int A[8]={0}; int e=2; int ak=0; Quque *q=(Quque *)malloc(sizeof(Quque)); initQue(&q);
数 据 结 构
猴子选大王
所有n只猴子站成一排,从排头猴子开始
1,2,3报数。报数为1、2的猴子站回到排尾,
报数为3的猴子退出,如此反复,直到剩下一
个猴子为止,则剩下这个猴子即为猴王。
问:假如猴子甲想当猴王,它当初应站在 什么位置?
分析
其实,猴子选大王的过程就是一个反 本节,我们将定义一个新 复排队的过程。 的数据结构—队列,来解决这个问题。
链 队 的 基 本 操 作 声 明
for(k=1;k<=n;k++) insertQue(&q,k); for(k=1;k<=n;k++) { deleteQue(&q,&elem); printf(" %d ",elem); insertQue(&q,elem); }
for(k=0;k<i; k++) { deleteQue(&q,&e); insertQue(&q,e); }
printf(" %d ",*(A+k)); }
《Data Structures and Algorithm Analysis in C》
--- Mark Allen Weiss
Mark Allen Weiss,1987年在普林斯
顿大学获得计算机科学博士学位,师从
Robert Sedgewick,现任美国佛罗里达国 际大学计算与信息科学学院教授。曾经担任全美
head
a1
a2
……
an
/\
3.4.1 链队的定义
限定只能在一端(队尾)进行插入(入队), 而在另一端( )进行删除(出队) 队头
的操作的线性表,称之为队列(queue)。
本节只讨论链式队列(简称链队)。
头结点
head
结点
a1
a2
… ai
… an
/\
a1称为队头元素
an称为队尾元素
3.4.2 链队的C语言描述
int front; int rear;
预 处 理
}Quque;
void initQue(Quque **q) //初始化 int isFull(Quque *q)//判断队满 int insertQue(Quque **q,int elem)//入队
int isEmpty(Quque *q)//判断队空
约定数字的将士,被旁边的将士杀死。而约瑟夫有预
谋地抓到了上上签,最后,他作为洞穴中的两个幸存
者之一,他说服了另外一个人选择了投降。


队列及链队的定义 链队的C语言描述 链队的基本操作 链 队 的 应 用
课后作业
将课堂给出的算法编写成完整的程序 上机调试验证,分别按照不同方式报名出 局。体会机器执行算法的快捷和高效。
计算机学科考试委员会主席。所著书籍深入浅出, 畅销北美乃至世界。
约瑟夫环 由古罗马的史学家约瑟夫(Josephus)提出,他 参加并记录了公元66—70年犹太人反抗罗马的起义。 约瑟夫作为将军,在城市沦陷之后,他的40名不屈的 将士大义凛然的说“要投降毋宁死”。但是又难以下 手,约瑟夫建议用课前提出的办法,报数杀人,报到
a1 a2 … an
/\
rear
3.4.3 链队的基本操作
入队操作
x元素入队
^ Q.front Q.rear x
Linkqueue Q; queueptr P;
P
^
Q.rear
p->data=x; p->next=NULL; Q.rear->next=p; Q.rear = p; P
y元素入队
x Q.front ^
Q.rear
Q.rear
出队算法
int delqueue(linkqueue &Q , QElemType e) { Queueptr S; if(front==rear) s=Q.front->next; e=p->data; Q. front->next=s->next; return(-1);
如此反复出队入队,直到队中剩余 一个猴子为止,即为所选猴王。 假如有20只猴子,则站在队列中第8
位的猴子为所选猴王。
# include<stdio.h> # include<malloc.h> # define MAXSIZE 100 typedef struct
{ int elem[MAXSIZE];
结点定义 typedef struct node
链队定义
typedef struct
{ int data;
struct node *next; }Qnode,*queueptr;
{queueptr front;
queueptr rear; }linkqueue; front
ai
front
head
rear
Q.rear y
^
Q.rear
p->data=y; p->next=NULL; Q.rear->next=p; Q.rear = p;
入队算法
linkqueue Enqueue(linkqueue &Q , QElemType x) { Queueptr p; p=(Queueptr )malloc(sizeof(queueNode)); if(!p) exit(OVERFLOW); p->data=x; p->next=NULL; rear->next=p; rear = p; return(ok); }
出队操作
x元素出队
x Q.front
x
y
^ Q.rear
S
Q.front
y ^ Q.rear
s=Q.front->next;
Q.front->next=s->next; free(s);
y元素出队
^ Q.front y
S
^
s=Q.front->next;
Q.front->next=s->next; Q.rear=Q.front; free(s);
if(s->next==NULL)
free(s);
rear=front;
}
思考
(1) 空链队有何特征,如何描述?
^
Q.front==Q.rear
Q.front Q.rear
(2)链队会满吗?
答:一般不会,因为删除时用free( )函
数释放被删除的结点,除非内存不足。
3.4.4 链队应用举例
算法分三步如下:
(1)将全体猴子编号排队(编号入队); (2)从队头开始报数,报1,2的猴子出队, 重新从队尾入队,报3的猴子出局; (3)重复(2),这样队列中的猴子越来越少, 直至最后一个猴子即为所选猴王。
针对本节刚开始提出的问题,设置一个链队,
1
2
3
•••
rearrearrear
front front front front
生 成 链 队
while(!isEmpty(q))
{for(j=0;j<=m; j++) { deleteQue(&q,&e); insertQue(&q,e); } deleteQue(&q,&e); A[ak++]=e; }
for (k=0;k<n;k++) //输出 {
开 始 选 举 得 出 结 果
相关文档
最新文档