计算机科学与技术系实验报告专业名称计算机科学与技术课程名称数据结构与算法项目名称实验三队列实验班级学号 1姓名同组人员无实验日期实验三队列实验实验题目:建立含有若干个元素的循环队列和链队列,并分别实现循环队列和链队列的入队和出对操作。
(1)先实现循环队列的入队和出队操作1.问题分析本程序要求实现建立含有若干个元素的循环队列,并实现循环队列的入队和出队操作。
完成该实验需要以下4个子任务:○1定义一个循环队列的存储结构,定义队列的基本算法。
○2定义一个display()函数实现队列元素的输出看入队是否成功○3通过队列的基本算法实现队列的出队操作○4在主函数中完成操作测试数据设计如下:1 2 3 4 562.概要设计为了实现上述程序功能,需要:○1声明一个循环队列○2定义出队列的基本算法,○3通过键盘输入5个整数,入队,出队○4在主函数中先往队列里输入5个元素,然后入队,输出,看入队是否成功,然后出队,再调用display()函数看是否出队。
1)本程序包含7个函数:1主函数main()2.置空队:InitQueue()3.判对空: QueueEmpty()4.判队满:QueueFull()5.入队:Add()6.出队:Delete()7.display()各函数关系如下:InitQueue()QueueEmpty()Main () QueueFull()Add()MainDelete()display()3、详细设计实现概要设计中定义的所有的数据类型,对每个操作给出了算法和代码,主程序和模块都需要代码。
(1)循环队列#define maxlen 10typedef struct{int data [maxlen];int front;int rear;}SeqQueue;(2)队列基本算法SeqQueue *InitQueue(SeqQueue *q) //建立一个空循环队列{q=(SeqQueue *)malloc(sizeof (SeqQueue));q->front=0;q->rear=0;return q;}int QueueFull (SeqQueue *q){ //判断队列是否为满if (q->front==(q->rear+1)%maxlen)return 1;else return 0;}int QueueEmpty(SeqQueue *q){ //判断队列是否为空if (q->rear==q->front)return 1;else return 0;}void Add (SeqQueue *q,int x) //入队{if(!QueueFull(q)){q->rear=(q->rear+1)%maxlen;q->data[q->rear]=x;}else printf ("queue full");}void Delete(SeqQueue *q){ //出队if (!QueueEmpty(q))q->front=(q->front+1)%maxlen;else printf ("queue Empty");}(3)用display()函数输出循环队列元素void display(SeqQueue *q) //输出循环队列q的元素{int i;if(q->front!=q->rear) //循环队列非空,输出队列元素{printf("输出循环队列元素:");i=q->front;do{i=(i+1)%maxlen;printf("%d",q->data[i]);}while(i!=q->rear);}elseprintf("队列为空!");}(4)在主函数中先往队列里输入5个元素,输出,看入队是否成功,然后出队,再调用display()函数看是否出队。
int main(){SeqQueue *q;int i,y;q=InitQueue(q); //建立空循环队列printf("请输入5个元素");for(i=0;i<5;i++) //入队5个元素{scanf("%d",&y);Add(q,y);}display(q); //输出循环队列元素for(i=0;i<5;i++) //把5个元素出队{Delete(q);}printf("\n请输入1个元素");scanf("%d",&y); //再入队一个元素Add(q,y);display(q); //再输出循环队列元素return 0;}4、调试分析编译无错误5、用户使用说明程序名为class1.exe,在DEBUG文件夹里面。
运行环境Visual c++ 6.0。
6、测试结果7、附录#include <stdio.h>#include <stdlib.h>#define maxlen 10typedef struct{int data [maxlen];int front;}SeqQueue;SeqQueue *InitQueue(SeqQueue *q) //建立一个空循环队列{q=(SeqQueue *)malloc(sizeof (SeqQueue));q->front=0;q->rear=0;return q;}int QueueFull (SeqQueue *q){ //判断队列是否为满if (q->front==(q->rear+1)%maxlen)return 1;else return 0;}int QueueEmpty(SeqQueue *q){ //判断队列是否为空if (q->rear==q->front)return 1;else return 0;}void Add (SeqQueue *q,int x) //入队{if(!QueueFull(q)){q->rear=(q->rear+1)%maxlen;q->data[q->rear]=x;}else printf ("queue full");}void Delete(SeqQueue *q){ //出队if (!QueueEmpty(q))q->front=(q->front+1)%maxlen;else printf ("queue Empty");}void display(SeqQueue *q) //输出循环队列q的元素{int i;if(q->front!=q->rear) //循环队列非空,输出队列元素{printf("输出循环队列元素:");i=q->front;{i=(i+1)%maxlen;printf("%d",q->data[i]);}while(i!=q->rear);}elseprintf("队列为空!");}int main(){SeqQueue *q;int i,y;q=InitQueue(q); //建立空循环队列printf("请输入5个元素");for(i=0;i<5;i++) //入队5个元素{scanf("%d",&y);Add(q,y);}display(q); //输出循环队列元素for(i=0;i<5;i++) //把5个元素出队{Delete(q);}printf("\n请输入1个元素");scanf("%d",&y); //再入队一个元素Add(q,y);display(q); //再输出循环队列元素return 0;}(2)实现链队列的入队和出队操作1.问题分析本程序要求实现建立含有若干个元素的链队列,并实现链队列入队和出队操作。
完成该实验需要以下4个子任务:○1定义一个链队列的存储结构,定义链队列的基本算法。
○2定义一个display()函数实现队列元素的输出看入队是否成功○3通过队列的基本算法实现队列的出队操作○4在主函数中完成操作测试数据设计如下:1 2 3 4 562.概要设计为了实现上述程序功能,需要:○1声明一个链队列○2定义出链队列的基本算法,○3通过键盘输入5个整数,入队,出队○4在主函数中先往队列里输入5个元素,然后入队,输出,看入队是否成功,然后出队,再调用display()函数看是否出队。
2)本程序包含6个函数:1主函数main()2.置空队:InitQueue()3.判对空: QueueEmpty()4.入队:Add()5.出队:Delete()6.display()各函数关系如下:SetQueue()QueueEmpty()Main () Add()Delete()display()4、详细设计实现概要设计中定义的所有的数据类型,对每个操作给出了算法和代码,主程序和模块都需要代码。
(1)链队列#define maxlen 10typedef struct node{int data;struct node *next;}LinkList;typedef struct{LinkList *front,*rear;}LinkQueue;LinkQueue *q;(2)队列基本算法LinkQueue *SetQueue() //建立一个空链队列{q=(LinkQueue *)malloc(sizeof (LinkQueue));q->front=(LinkList *)malloc(sizeof(LinkList));q->front->next=NULL;q->rear=q->front;return q;}int QueueEmpty(LinkQueue *q){ //判断队列是否为空if (q->rear==q->front)return 1;else return 0;}LinkQueue *Add (LinkQueue *q,int x) //入队{LinkList *p;p=(LinkList *)malloc(sizeof (LinkList));p->data=x;p->next=NULL;q->rear->next=p;q->rear=p;return q;}LinkQueue *Delete(LinkQueue *q){ //出队LinkList *p;if (!QueueEmpty(q)){p=q->front->next;q->front->next=p->next;if(p->next=NULL)q->rear=q->front;free(p);return q;}else printf ("queue Empty");}(3)用display()函数输出链队列元素void display(LinkQueue *q) //输出链队列的元素{LinkList *p;p=q->front->next;if(p!=NULL){printf("输出链队元素");while(p!=NULL){printf("%2d",p->data);p=p->next;}}else printf("\n链队为空");}(4)在主函数中先往队列里输入5个元素,输出,看入队是否成功,然后出队,再调用display()函数看是否出队。