C语言数据结构(实训报告)

课 程 设 计 任 务 书

课题名称: 《队列的基本操作》

设计内容:
1.环形队列的基本操作,主程序
2.招聘程序

技术条件或要求:
1.技术条件:开发环境visua c++
2.加深对队列结构的理解,逐步培养解决实际问题的编程能
3.掌握环形队列的进队和出队等基本操作

指导教师(签名): 教研室主任(签名):

开题日期: 2019 年 12 月 2 日 完成日期: 2019 年 12 月 6 日
目录
第一章 环形队列的基本操作函数 3
1、1代码实现 3
1、2运行结果 5
1、3分程序N-S图 5
第二章 招聘程序 9
2、1代码实现 9
2、2运行结果 12
2、3分程序N-S图 13
2、4实训总结 20

第一章环形队列的基本操作函数
1、1代码实现
#include<stdio.h>
#include<malloc.h>
#define MAXN 11 /定义环形顺序排列的存储长度/
int EnQueue(int *queue,int maxn,int *head,int *tail,int x){/进队操作,返回;队满/
if((*tail+1)%maxn==*head)/队尾指针赶上队首指针,队满/
return 1;
*tail=(*tail+1)%maxn;/对手指针+1/
queue[*tail]=x;/元素入队尾/
return 0;
}
int DeQueue(int *queue,int maxn,int *head,int *tail,int cp)//出队操作 返回 1:队空/
{
if(*head==*tail)/队首=队尾,表明队列为空/
return 1;
*head=(*head+1)%maxn;/队首指针+1/
*cp=queue[*head];/取出队首元素/
return 0;
}
void OutputQueue(int *queue,int maxn,int h,int t){ /输出队列中元素/
while(h!=t){
h=(h+1)%maxn;
printf("%d",queue[h]);
}
printf("\n");
}
void main(){
int q[MAXN];/假设环形队列的元素类型为int/
int q_h=0,q_t=0;/初始化队首,队首指针为0/
int op,i;

	while(1){
		printf("请选择操作, 1:进队   2:出队   0:退出");
		fflush(stdin);/*清空标准输入缓冲区*/
		scanf("%d",&op);
		switch(op){
			case 0:/*退出*/
			return;
			case 1:  /*进队*/
			printf("请输入进队元素:");
			scanf("%d",&i);
			if(EnQueue(q,MAXN,&q_h,&q_t,i)!=0)
				printf("队列满\n");
			else{
				printf("入队成功,对内元素为:\n");
				OutputQueue(q,MAXN,q_h,q_t);
			}
			break;
			case 2:/*出队*/
			if(DeQueue(q,MAXN,&q_h,&q_t,&i)==0){/*出队成功*/
				printf("出队元素为:[%d],队内元素为:\n",i);
				OutputQueue(q,MAXN,q_h,q_t);
			}
			else
				printf("队空\n");
		break;
		}
	}
}

1、2运行结果

1、3分程序N-S图
int *head 进队元素头指针
int *tail 进队元素尾指针
int x队尾长度
int EnQueue(int *queue,int maxn,int *head,int *tail,int x){/进队操作,返回;队满/

出队操作函数模块
函数模型
int DeQueue(int *queue,int maxn,int *head,int *tail,int *cp);
函数说明(出队操作 返回 1:队空):
int *queue 出队元素队列
int maxn 环形顺序队列存储长度
int *head 头指针
int *tail 尾指针
int *cp 队首元素

输出队列元素模块
函数模型
void OutputQueue(int *queue,int maxn,int h,int t);
函数说明(输出队列中元素):
int *queue 出队元素队列
int maxn 环形顺序队列存储长度
int h 输出元素头
int t 输出元素尾

出队操作函数模块
函数模型
int EnQueue(int *queue,int maxn,int *head,int *tail,int x);
函数说明(出队操作 返回 1:队空):
int *queue 出队元素队列
int maxn 环形顺序队列存储长度
int *head 头指针
int *tail 尾指针
int *cp 队首元素
int *queue 出队元素队列
int maxn 环形顺序队列存储长度

void main()主程序

第二章招聘程序
2、1代码实现
#include<malloc.h>
#define DEMARK 5
typedef struct stu{
int no,total,z[2],sortm,zi;
struct stu *next;
}STU;
typedef struct job{
int lmt,count;
STU *stu;
}JOB;
STU *head=NULL,*over=NULL;
int all;
void OutPutStu(STU *p){
for(;p!=NULL;p=p->next)
printf("%d(%d)\t",p->no,p->total);
}
void FreeStu(STU **p){
STU *q;
while(*p!=NULL){
q=*p;
*p=(*p)->next;
free(q);
}
}
int random(int n){
int rn=0;
rn=rand()%n;
return rn;
}
void Insert(STU **p,STU *u){
STU *v,*q;
for(q=*p;q!=NULL;v=q,q=q->next)
if(q->sortmsortm)
break;
if(q==*p)
*p=u;
else
v->next=u;
u->next=q;
}
int InitJob(JOB **h,int n,int *all){
int i;
JOB p;
all=0;
printf(“工种信息{工种号(计划招聘人数)}\n”);
if((p=(JOB
)malloc(n
sizeof(JOB)))NULL){
printf(“内存申请错误!\n”);
return -1;
}
for(i=0;i<n;i++){
p[i].lmt=random(10)+1;
p[i].count=0;
p[i].stu=NULL;
*all+=p[i].lmt;
printf("%d(%d)\t",i,p[i].lmt);
}
printf("\n 总招聘人数[%d]\n",*all);
*h=p;
return 0;
}
int InitStu(STU **h,int n,int m){
STU p;
int i;
printf(“应聘人员信息{编号,成绩,志愿1,志愿2}\n”);
for(i=0;i<n;i++){
if((p=(STU
)malloc(sizeof(STU)))NULL){
printf(“内存申请错误!\n”);
return -1;
}
p->no=i;
p->total=p->sortm=random(201);
p->z[0]=random(m);
p->z[1]=random(m);
p->zi=0;
printf("%d,%3d,%d%d\t",i,p->total,p->z[0],p->z[1]);
Insert(h,p);
}
printf("\n");
return 0;
}
void main(){
int m;
int n;
JOB *rz;
int all;
STU *head=NULL,*over=NULL;
STU *p;
int i;
while (1){
m=n=0;
printf(“请输入工种总数(1~20),=0:退出”);
scanf("%d",&m);
if(m
0)
return;
if(m>20||m<0)
continue;
if(InitJob(&rz,m,&all)!=0)
return;
printf("\n请输入应聘人员总数(5~400),=0:退出");
scanf("%d",&n);
if(n
0)
return;
if(n<5||n>400){
free(rz);
continue;
}
if(InitStu(&head,n,m)!=0)
return;
printf("\n应聘人员队列\n");
OutPutStu(head);
while(all>0&&head!=NULL){
p=head;
head=head->next;
i=p->z[p->zi];
if(rz[i].count<rz[i].lmt){
rz[i].count++;
Insert(&rz[i].stu,p);
all–;
continue;
}
if(p->zi>=1){
p->next=over;
over=p;
continue;
}
p->sortm-=DEMARK;
p->zi=1;
Insert(&head,p);
}
for(i=0;i<m;i++){
printf("\n工种[%d]招聘情况\n",i);
OutPutStu(rz[i].stu);

2、2运行结果

2、3分程序N-S图
出队操作函数模块
函数模型
void OutPutStu(STU *p);
函数说明(输出应聘人员有序队列中编号和成绩):
STU *p 招聘人员信息结构体 定义一个p指针指向应聘人员

释放函数模块
函数模型
void FreeStu(STU **p);
函数说明(释放应聘人员信息):
STU **p 招聘人员信息结构体 *p是释放应聘人员空间

随机数函数模块
函数模型
int random(int n);
函数说明(随机数):
int n 指随机抽取应聘人员信息

对成绩的安排函数模型
void Insert(STU **p,STU *u);
函数说明(随机数):
STU **p 指抽取的所有成绩
STU *u 指向成绩的指针

随机生成工种信息函数模型
int InitJob(JOB **h,int n,int *all);
函数说明(工种信息随机函数):
JOB **h 生成录用者信息
int n 招聘人员总数
int *all工种招聘人数

随机生成应聘人员信息函数模型
int InitStu(STU **h,int n,int m);
函数说明(应聘人员信息随机函数):
STU **h 应聘人员信息数
int n 应聘人员总数
int m 工种总数

void main()主程序

2、4问题
2.4.1问题一
出现C1083错误码:和预编译头的设置有关。
解决办法:打开Settings对话框,左边的Settings For中选中Release,底下的TreeView中选中StdAfx.cpp,右边选中C/C++标签页,Category选Precompiled Headers,底下选Create precompiled header,Through header填StdAfx.h。左边的TreeView中依次选中工程中其他所有的cpp,Precompiled Headers都选中Use precompiled header file,Through header填StdAfx.h。最后,“OK”、“Rebuild All”。
vc++6.0 vc2008貌似都不行。

2.4.2问题二
VS bug cxx0052 member function not present
cxx0052 member function not present
在调试程序的时候碰见一个错误。CXX0052,去MSDN上一查,说是跟内联函数有关,还给了方法说是:
通过内联强行关闭 (/Ob0) 重新编译文件以在该函数中设置断点。
于是在project settings midl 中加了/Ob0 还是不行。怀疑是微软的bug

2、5实训总结
通过近一周的学习与实践,体验了一下离开课堂的学习,也可以理解为一次实践与理论的很好的连接。特别是本组所做的题目都是课堂上所讲的例子,在实行之的过程中并不是那么容易事让人有一种纸上谈兵的体会,正所谓纸上得来终觉浅绝知此事要躬行。实训过程中让我们对懂得的知识做了进一步深入了解,让我们的理解与记忆更深刻,对不懂的知识与不清楚的东西也做了一定的了解,也形成了一定的个人做事风格。
通过这次课程设计,让我对一个程序的数据结构有更全面更进一步的认识,根据不同的需求,采用不同的数据存储方式,不一定要用栈,二叉树等高级类型,有时用基本的一维数组,只要运用得当,也能达到相同的效果,甚至更佳,就如这次的课程设计,通过用for的多重循环,舍弃多余的循环,提高了程序的运行效率。在编写这个程序的过程中,我复习了之前学的基本语法,对数据结构改变了看法。在这次设计过程中,体现出自己单独设计模具的能力以及综合运用知识的能力,体会了学以致用、突出自己劳动成果的喜悦心情,也从中发现自己平时学习的不足和薄弱环节,从而加以弥补。

西安航空职业技术学院
课程设计(论文)成绩评定表

目 考核点细目 分值 得分
A B C D E

度 1.考勤(迟到、早退、旷课、卫生) 10
2.积极准备、认真听讲、独立思考、操作规范主动 10

操 3.实训完成情况(主动操作、成果) 15
4.独立操作能力(按角色独立完成操作) 10
5.团队协作(与组员间的配合) 10
6.有创新 5
报告 7.按时完成,书写整洁 10
8.结构完整、格式规范 10
答辩 9.举止端正、语言流畅、逻辑性强 10
10.回答问题正确 10
总成绩
说明: A、B、C、D、E为该项得分,分别对应分值的100%、80%、60%、40%、20%
10(10、8、6、4、2) , 15(15、9、12、6、3)

成绩:

签名:

                年    月    日
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值