大数据结构队列实验报告材料.docx
- 文档编号:28947862
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:55
- 大小:2.15MB
大数据结构队列实验报告材料.docx
《大数据结构队列实验报告材料.docx》由会员分享,可在线阅读,更多相关《大数据结构队列实验报告材料.docx(55页珍藏版)》请在冰豆网上搜索。
大数据结构队列实验报告材料
队列实验报告
小组成员:
xxxxxxxx日期:
xxxxxxxx
1、需求分析(xxx)
1.链队列
1)在本演示程序中,首先要链队列添加一个头结点,并判断队列是否为空,它只允许在表的一端进行插入,而在另一端删除元素,允许插入的一段叫队尾,允许删除的一端则为对头,接着访问队列中所有元素,并输出,输出是每个元素之间用空格来完成。
最后销毁队列,释放空间。
2)演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“欢迎来到链队列”“元素入队”“元素出队”“销毁队列”“清空队列”之后。
由用户在键盘上输入演示程序中规定的运算命令,相应的运算数据和显示结果显示在其后。
3)程序执行的命令包括:
欢迎来到链队列
1输出队列长度
2元素入队
3元素出队
4销毁队列
5清空队列
6对头元素
7退出链队列
4)测试数据
入队1
2
3
4
5
分别执行“元素入队”“元素出队”“销毁队列”“清空队列”等操作。
2.顺序队列
1)在本演示程序中,首先要顺序队列添加一个头结点,并判断队列是否为空,它只允许在表的一端进行插入,而在另一端删除元素,允许插入的一段叫队尾,允许删除的一端则为对头,接着访问队列中所有元素,并输出,输出是每个元素之间用空格来完成。
2)演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“欢迎来到链队列”“元素入队”“元素出队”“取得头结点”“输出显示”之后。
由用户在键盘上输入演示程序中规定的运算命令,相应的运算数据和显示结果显示在其后。
3)程序执行的命令包括:
欢迎来到顺序队列
1入队
2出队
3判断是否为空
4取得头结点
5输出显示
6退出顺序队列
4)测试数据
入队1
2
3
4
5
分别执行“元素入队”“元素出队”等操作。
3循环队列
1)在本演示程序中,首先要顺序队列添加一个头结点,并判断队列是否为空,初始化建空队列时,令front=rear=0,每当插入新的队列尾元素时,“尾指针增1”;每当删除队列头元素时,“头指针增1”。
接着访问队列中所有元素,并输出,输出是每个元素之间用空格来完成。
2)演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“欢迎来到链队列”“元素入队”“元素出队”“取得头结点”“输出显示”之后。
由用户在键盘上输入演示程序中规定的运算命令,相应的运算数据和显示结果显示在其后。
3)程序执行的命令包括:
欢迎来到循环队列
1入队
2出队
3判断是否为空
4取得头结点
5输出显示
6退出顺序队列
4)测试数据
入队1
2
3
4
5
分别执行“元素入队”“元素出队”等操作。
2.概要设计(xxxx)
⒈为实现上述算法,需要顺序表的抽象数据类型,抽象数据类型定义如下:
ADTQueue{
数据对象:
D={ai|ai∈ElemSet,i=1,2,3...,n,n>=0}
数据关系:
R={
基本操作:
InitQueue(&Q)
操作结果:
构造一个空队列。
DestroyQueue(&Q)
初始条件:
队列Q已存在。
操作结果:
队列Q已被销毁。
ClearQueue(&Q)
初始条件:
队列Q已存在。
操作结果:
将Q清为空队列。
QueueEmpty(Q)
初始条件:
队列Q已存在。
操作结果:
若Q为空队列,则返回TRUE,否则FALSE。
QueueLength(Q)
初始条件:
队列Q已存在。
操作结果:
返回Q元素的个数,即队列的长度。
GetHead(Q,&e)
初始条件:
Q为非空队列。
操作结果:
用e返回Q的队头元素。
EnQueue(&Q,e)
初始条件:
队列Q已存在。
操作结果:
插入e返回Q的新的队尾元素。
DeQueue(&Q,&e)
初始条件:
Q为非空队列。
操作结果:
删除Q的队头元素,并用e返回其值。
}ADTQueue
2.单链队列
typedefstructQNode
{
QElemType;
structQNode*next;//指针域
}QNode,*QueuePtr;
Typedefstruct{
QueuePtrfront;
QueuePtrrear;
}LinkQueue;
StatusInitQueue(LinkQueue&Q)
//构造一个空队列。
StatusDestroyQueue(LinkQueue&Q)
//销毁队列Q,Q不存在。
StatusClearQueue(LinkQueue&Q)
//将Q清为空队列。
StatusQueueEmpty(LinkQueueQ)
//若Q为空队列,则返回TRUE,否则FALSE。
intQueueLength(LinkQueueQ)
//返回Q元素的个数,即队列的长度。
StatusGetHead(LinkQueueQ,QElemType&e)
//若队列不为空,则用e返回Q的队头元素,并返回OK;否则返回ERROR。
StatusEnQueue(LinkQueue&Q,QElemTypee)
//插入e返回Q的新的队尾元素。
StatusDeQueue(LinkQueue&Q,QElemType&e)
//若队列不空,则删除Q的队头元素,并用e返回其值,并返回OK;否则返回ERROR。
三.详细设计(xxx)
1.顺序队列的实现和运算
1)元素的类型
typedefstruct
{
Datatypedata[MAXSIZE];
intfront,rear;
}Squeue;
2)空的队列的构造
voidInitSqueue(Squeue*p)/*初始化队列*/
{
p->front=0;
p->rear=0;
}
3)元素的入队
intEnsqueue1(Squeue1*q,Datatypee)/*入队*/
{
if((q->rear+1)%MAXSIZE==q->front)
{
printf("\n队列已满\n");
return0;
}
4)元素的出队
intDeSqueue1(Squeue1*q,Datatype*e)/*出队*/
{
if(q->front==q->rear)
{
printf("队列已空,无法出队!
");
return0;
}
*e=q->data[q->front];
q->front=(q->front+1)%MAXSIZE;
return1;
}
5)判断队列是否为空
intQueueEmpty1(Squeue1q)//判断是否为空
{
if(q.front==q.rear)
return1;
else
return0;
}
6)队头元素的取值的算法
intGethead1(Squeue1*q,Datatype*e)//取对头元素
{
if(q->front==q->rear)
{
printf("队列已空,无法出队!
");
return0;
}
else
*e=q->data[q->front];
return1;
}
7)遍历顺序队列的算法
voiddisplay1(Squeue1q)//遍历顺序对列
{
printf("此队列数据为:
\n");
if(q.front==q.rear)
printf("此队列为空!
");
else
{
while(q.front { printf("%d\t",q.data[q.front]); q.front=(q.front+1)%MAXSIZE; } printf("\n"); } 2.链式队列的实现和运算 1)构造空队列的算法 voidInitQueue2(LinkQueue*q) {//构造一个空队列Q q->front=q->rear=malloc(sizeof(QNode)); if(! q->front) exit (1); q->front->next=NULL; } 2)元素的入队算法 voidEnQueue2(LinkQueue*q,QElemTypee)//将元素e进队 { QueuePtrp; p=(QueuePtr)malloc(sizeof(QNode));//创建新节点 if(! p)//如果内存分配成功 exit (1); p->data=e;//初始化新节点数据为e p->next=NULL; q->rear->next=p; q->rear=p; } 3)元素的出队的算法 intDeQueue2(LinkQueue*q,QElemTypee)//队头结点出队,将出队的元素存入e { QueuePtrp; if(q->front==q->rear)//队列为空 return0; p=q->front->next;//初始化temp为要出队的结点指针 if(q->front->next==q->rear)//要出队的结点为最后一个结点 q->rear=q->front; e=p->data;//要出队的数据元素为e q->front->next=p->next;//使下一个结点变为对头 free(p);//删除要出队的结点 returne; } 4)队列的长度算法 voidQueueLength2(LinkQueue*q)//返回队列长度 { QueuePtrp; inti=0; p=q->front->next; while(p) { ++i; p=p->next; } printf("链队列长度为: %d\n",i); } 5)队列的销毁 voidDestroyQueue2(LinkQueue*q) { while(q->front) { q->rear=q->front->next; free(q->front); q->front=q->rear; if(! q->rear) free(q->rear); } free(q->front); } 6)队列的输出算法 voidoutput2(LinkQueue*q)//输出队列 { QueuePtrp; p=q->front->next; printf("链队列元素依次为: "); while(p) { printf("%d->",p->data); p=p->next; } printf("\n"); } 7)队列的清空的算法 voidClear2(LinkQueue*q)//清空队列 { QueuePtrtemp=q->front->next; while(temp) { QueuePtrtp=temp; temp=temp->next; free(tp); } temp=q->front; q->front=q->rear=NULL; free(temp); } 8)返回对头元素的算法 intGetHead2(LinkQueue*q,int*e)//返回对头结点元素,存入e { if(q->front==q->rear) return0; *e=q->front->next->data; return1; } 3.循环队列的实现和运算 1)队列的初始化算法 voidInitSqueue3(Squeue3*p)/*初始化队列*/ { p->base=(Datatype*)malloc(sizeof(Datatype)*MAXSIZE); p->front=0; p->rear=0; } 2)入队的算法 intEnsqueue3(Squeue3*q,Datatypee)/*入队*/ { if((q->rear+1)%MAXSIZE==q->front) { printf("\n队列已满\n"); return0; } else q->base[q->rear]=e;/*将接收到得值付给队尾所指的节点*/ q->rear=(q->rear+1)%MAXSIZE;/*队尾向后移一位完成入队*/ return1; } 3)出队的算法 intDeSqueue3(Squeue3*q,Datatype*e)/*出队*/ { if(q->front==q->rear) { printf("队列已空,无法出队! "); return0; } *e=q->base[q->front]; q->front=(q->front+1)%MAXSIZE; return1; } 4判断队列是否为空的算法 intQueueEmpty3(Squeue3q)//判断是否为空 { if(q.front==q.rear) return1; else return0; } 5)对头元素的返还的算法 intGethead3(Squeue3*q,Datatype*e)//取对头元素 { if(q->front==q->rear) { printf("队列已空,无法出队! "); return0; } else *e=q->base[q->front]; return1; } 6)遍历循环队列的算法 voiddisplay3(Squeue3*q)//遍历循环对列 { inttail; tail=q->front; printf("此队列数据为: \n"); if(q->front==q->rear) printf("此队列为空! "); else { while(tail! =q->rear) { printf("%d\t",q->base[tail]); tail=(tail+1)%MAXSIZE; } printf("\n"); } } 4.主函数的算法 voidmain() { intchoice; Datatypee1; inti1,a1,x1,s1,j1;//顺序队列定义的量 inte2,i2,n2,s2,a2;//链队列定义的量 inti3,a3,x3,s3,j3;//循环队列定义的量 Datatypee3; Squeue1Q1; //******************************* LinkQueueq; //******************************** Squeue3Q; //**************************** choice=-1; Begin(); while(choice! =0) { scanf("%d",&choice); switch(choice) { case1: //顺序队列 { system("cls"); InitSqueue1(&Q1); printf("创建队列完成! \n"); printf("请输入数据个数j1="); scanf("%d",&j1); for(i1=1;i1<=j1;i1++)//输入的数据个数不要超过MAXSIZE,多了的部分没有插入队列 { printf("请输入第%d个数据: ",i1); scanf("%d",&a1); Ensqueue1(&Q1,a1); } printf("对头为: %d\n",Q1.data[Q1.front]); printf("队尾为: %d\n",Q1.data[Q1.front+j1-1]); display1(Q1); s1=-1; start1(); while(s1! =0) { scanf("%d",&s1); switch(s1) { case0: system("cls"); choice=-1; Begin(); break; case1: { system("cls"); printf("请输入入队元素: \n"); scanf("%d",&x1); Ensqueue1(&Q1,x1); display1(Q1); s1=-1; start1(); break; } case2: { system("cls"); DeSqueue1(&Q1,&e1); display1(Q1); s1=-1; start1(); break; } case3: { system("cls"); if(QueueEmpty1(Q1)) printf("此队列为空! \n"); else printf("此队列不为空! \n"); } s1=-1; start1(); break; case4: {system("cls"); Gethead1(&Q1,&e1); printf("对头元素为: %d\n",e1); s1=-1; start1(); break; } case5: { system("cls"); display1(Q1); s1=-1; start1(); break; } }//switch }//while }//case1 break; //************************************************* case2: { system("cls"); InitQueue2(&q); printf("创建队列完成! \n"); printf("输入将建立链队列元素的个数: n2="); scanf("%d",&n2); printf("请输入队列的元素: \n"); for(i2=1;i2<=n2;i2++) { printf("请输入第%d个元素: ",i2); scanf("%d",&e2); EnQueue2(&q,e2); } a2=-1; start2(); while(a2! =0) { scanf("%d",&a2); switch(a2) { case1: system("cls"); QueueLength2(&q); a2=-1; start2(); break; case2: { system("cls"); printf("请输入入队元素: "); scanf("%d",&e2); EnQueue2(&q,e2); output2(&q); a2=-1; start2(); }break; case3: system("cls"); e2=DeQueue2(&q,e2); output2(&q); printf("出队元素为: %d\n",e2); a2=-1; start2(); break; case4: DestroyQueue2(&q); printf("队列已销毁! \n"); a2=0; system("cls"); choice=-1; Begin(); break; case5: Clear2(&q); printf("队列已清空\n"); a2=0; system("cls"); choice=-1; Begin(); break; case6: system("cls"); GetHead2(&q,&e2); printf("队头元素为: %d\n",e2); s2=-1; start2(); break; case0: system("cls"); choice=-1; Begin(); break; }//switch }//while }//case2 break; //************************************************** case3: { system("cls"); InitSqueue3(&Q); printf("创建队列完成! \n"); printf("请输入数据个数j3="); scanf("%d",&j3); for(i3=1;i3<=j3;i3++)//输入的数据个数不要超过MAXSIZE,多了的部分没有插入队列 { printf("请输入第%d个数据: ",i3); scanf("%d",&a3); Ensqueue3(&Q,a3); } printf("对头为: %d\n",Q.base[Q.front]); printf("队尾为: %d\n",Q.base[Q.front+j3-1]); display3(&Q); s3=-1; start3(); while(s3! =0) { scanf("%d",&s3); switch(s3) { case0: system("cls"); choice=-1; Begin(); break; case1: { system("cls"); printf("请输入入队元素: \n"); scanf("%d",&x3); Ensqueue3(&Q,x3); display3(&Q); s3=-1; start3(); break; } case2: { system("cls"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 大数据结构 队列实验报告材料 数据结构 队列 实验 报告 材料
![提示](https://static.bdocx.com/images/bang_tan.gif)