数据结构大作业报告
数据结构大作业实验报告课程名称:数据结构设计题目:客户去银行储蓄模拟程序一( 实验题目
(1)内容描述:编写一个程序反映客户到银行储蓄的过程。
(2)基本要求:要实现以下功能:1:排队 2:储蓄 3:查看排队4.:删除自己所排的队 5.不再排队,剩下的客户依次储蓄 6:下班
二( 实验的工程组成图和程序结构图
main
bank
本工程的组成结构如左图所示,程序结构图如右图所示。
三( 工程所包含的函数的功能描述
Bank():模拟客户到银行去储蓄的过程。
客户排队储蓄,所以要用到一个队列,
这里设计了一个不带头结点的单链表作为队列。
四( 实验工程的算法描述及流程图
//客户排队去银行储蓄,用到了队列的知识,这里设计了一个不带头结点的单链表作为队列来完成排队储蓄过程
#include <stdio.h>
#include <malloc.h>
typedef struct qnode
{
int data;
struct qnode *next;
} QNode; //定义链队结点类型
typedef struct
{
QNode *front,*rear; } QType; //定义链队类型
void bank() //模拟客户储蓄的过程
{
int cho,onwork=1,no,find;
QType *q; //定义链队类型的指针
QNode *p,*r; //定义链队结点的指针
q=(QType *)malloc(sizeof(QType)); //申请链队的空间
q->front=q->rear=NULL; //创建空队
while (onwork==1) //循环执行
{
printf("1:排队 2:储蓄 3:查看排队4:删除自己所排的队 5:不再排队,剩下的客户依次储蓄 6:下班请选择:");
scanf("%d",&cho);
switch(cho)
{
case 1://排队
printf(" ******输入排队序列号:");
do
{
scanf("%d",&no);
find=0;
p=q->front; //p指向第一个客户
while (p!=NULL && !find) //在p不为空&find==0即没找到时{ 执行此循环
if (p->data==no)
find=1;
else
p=p->next;
}
if (find) //若find==1即找到时
printf(" ******输入的排队序列号重复,重新输入:");
} while (find==1); //在find==0即没找到时结束循环
p=(QNode *)malloc(sizeof(QNode)); //申请空间,创建结点p->data=no;p->next=NULL;
if (q->rear==NULL) //第一个客户排队
{
q->front=q->rear=p;
}
else
{
q->rear->next=p;//原来最后一个元素指向新入队的元素
q->rear=p; //修改队尾指针,使其指向当前最后一个元素,即将*p结点入队}
break;
case 2://储蓄
if (q->front==NULL) //队空
printf(" ******没有排队的客户!\n");
else //队不空
{
p=q->front; //p指向第一个客户
printf(" ******客户%d储蓄\n",p->data);
if (q->rear==p) //只有一个客户排队的情况
{
q->front=q->rear=NULL;
}
else
q->front=p->next; //使p的下一个结点变成第一个客户
free(p); //释放p的空间
}
break;
case 3:// 查看排队
if (q->front==NULL) //队空
printf(" ******没有排列的客户!\n");
else //队不空
{
p=q->front; //p指向第一个客户
printf(" ******排队客户:");
while (p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
break;
case 4:// 删除自己所排的队
if (q->front==NULL) //队空
printf(" ******没有排列的客户!\n");
else //队不空
{ printf(" ******输入要删除的排队序列号:"); scanf("%d",&no);
find=0;
p=q->front; //p指向第一个客户
while (p!=NULL && !find) //在p不为空&find==0即没找到时执行此循环
{
if (p->data==no)
{
find=1; //找到要删除的序列号
printf(" ******客户%d删除\n",p->data);
if (q->front==p) //删除的正好是第一个客户的情况
{
q->front=p->next; //使p的下一个结点变成第一个客户
free(p);
}
else if(p->next==NULL) //删除的正好是最后一个客户的情况{
r->next=NULL; //r是p前一个结点
free(p);
}
else
{
r->next=p->next;
free(p);
}
}
else
{
r=p;
p=p->next;
}
}
}
break;
case 5:// 不再排队,剩下的客户依次储蓄
if (q->front==NULL) //队空
printf(" ******没有排列的客户!\n");
else //队不空
{
p=q->front; //p指向第一个客户
printf(" ******客户按以下顺序储蓄:"); while (p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
onwork=0; //退出
break;
case 6://下班
if (q->front!=NULL) //队不空
printf(" ******请排队的客户明天储蓄!\n"); onwork=0; //退出
break;
}
}
}
void main() //主程序
{
bank(); //函数调用
}
五( 实验结果(程序执行如下)
使用说明:
程序运行后,界面会跳出“1:排队 2:储蓄 3:查看排队4:删除自己所排的队 5:不再排队,剩下的客户依次储蓄 6:下班请选择:”的字样。
我们可根据需要,选择相应的选项。
1为排队,选1 后可将输入的序列号排入队中;2为储蓄,选2后排
在最前面的客户会进行储蓄,然后他的序列号从队列中删除;3为查看排队,选3
后会输出目前的所有客户的排队顺序;4为删除自己所排的队,选4后界面会跳出“输入要删除的排队序列号:”的字样,然后继续输入要删除的序列号,该序列号就会被删除;5为剩下的客户依次储蓄,选5 后系统会自动进行该任务;6为下班,选6后程序将会退出。
六、自己增加的部分(与源程序的不同)
这个程序中选项“4:删除自己所排的队”是我自己加上去的,程序也是我自己编写的。
起先一直有问题,不是第一个客户不能删除,就是最后一个客户不能删除。
不过我没有放弃,参看书本,查看资料,耐心研究,终于最后我把它做出来了。
七、总结与感想
这次数据结构的大作业,我做了一个模拟客户去银行储蓄的程序。
期间我遇到很多困难,尤其是自己编写其中的那段程序时,有好多次运行一直有问题。
但我没有灰心,一如既往地耐心探究,终于花了将近一周多的时间,我把它完成了。
这次大作业的完成使我更加深刻地认识到数据结构的奇妙。
就这么几行代码,有机地组合起来就能完成一个看似不可能的任务。
数据结构是一门神奇的科目,虽然它蕴藏了许多知识,但是我相信只要我们静下心来好好去学,我们都能把它学好。