数据结构实验报告一.docx
- 文档编号:4986552
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:10
- 大小:72.12KB
数据结构实验报告一.docx
《数据结构实验报告一.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告一.docx(10页珍藏版)》请在冰豆网上搜索。
数据结构实验报告一
实验报告
(一)
分校名称
学号姓名
实验日期
专业名称
计算机科学与技术
课程名称
数据结构
批改教师
主持教师
实验成绩
校外评阅教师
实验名称线性表
使用主要设备PC,VC++6.0
实验要求
1.掌握线性表的存储结构及相关的操作;
2.能根据问题要求,设计数据结构和相应算法;
3.用C语言编制程序,程序中写出详细注释;
4.给出测试结果,验证程序的正确性。
实验报告内容:
1.线性表的链式存储结构
某项比赛中,评委们给某参赛者的评分信息存储在一个带头结点的单向链表中,编写程序:
(1)显示在评分中给出最高分和最低分的评委的有关信息(姓名、年龄、所给分数等)
(2)在链表中删除一个最高分和一个最低分的结点
(3)计算该参赛者去掉一个最高分和一个最低分后的平均成绩
●程序代码如下:
//数据结构实验1.1线性表的链式存储结构
//调试环境:
VisualC++6.0
//-----库文件的预设和定义
#include
#include
#include
#include
#include
#defineNULL0
#definePWRS5//定义评委人数
structpw//定义评委信息
{charname[6];
floatscore;
intage;
};
typedefstructpwPW;
structnode//定义链表结点
{structpwdata;
structnode*next;
};
typedefstructnodeNODE;
//自定义函数的声明
NODE*create(intm);//创建单链表
intcalc(NODE*h);//计算、数据处理
voidprint(NODE*h);//输出所有评委打分数据
voidinput(NODE*s);//输入评委打分数据
voidoutput(NODE*s);//输出评委打分数据
voidmain()
{
NODE*head;
floatave=0;
floatsum=0;
head=create(PWRS);
printf("所有评委打分信息如下:
\n");
print(head);//显示当前评委打分
calc(head);//计算成绩
printf("该选手去掉1最高分和1最低分后的有效评委成绩:
\n");
print(head);//显示去掉极限分后的评委打分
}
voidinput(NODE*s)
{
printf("请输入评委的姓名:
");
scanf("%S",&s->data.name);
printf("年龄:
");
scanf("%d",&s->data.age);
printf("打分:
");
scanf("%f",&s->data.score);
printf("\n");
}
voidoutput(NODE*s)
{printf("评委姓名:
%8s,年龄:
%d,打分:
%2.2f\n",s->data.name,s->data.age,s->data.score);}
NODE*create(intm)
{NODE*head,*p,*q;
inti;
p=(NODE*)malloc(sizeof(NODE));
head=p;q=p;p->next=NULL;
for(i=1;i<=m;i++){
p=(NODE*)malloc(sizeof(NODE));
input(p);
p->next=NULL;
q->next=p;
q=p;
}
return(head);
}
voidprint(NODE*h)
{for(inti=1;((i<=PWRS)&&(h->next!
=NULL));i++){h=h->next;output(h);}printf("\n");}
intcalc(NODE*h)
{
NODE*q,*p,*pmin,*pmax;
floatsum=0;
floatave=0;
p=h->next;//指向首元结点
pmin=pmax=p;//设置初始值
sum+=p->data.score;p=p->next;
for(;p!
=NULL;p=p->next)
{
if(p->data.score>pmax->data.score)pmax=p;
if(p->data.score
sum+=p->data.score;
}
cout<<"给出最高分的评委姓名:
"<
"<
"< cout<<"给出最低分的评委姓名: "< "< "< printf("\n"); sum-=pmin->data.score;sum-=pmax->data.score; for(q=h,p=h->next;p! =NULL;q=p,p=p->next) { if(p==pmin){q->next=p->next;p=q;}//删除最低分结点 if(p==pmax){q->next=p->next;p=q;}//删除最高分结点 } ave=sum/(PWRS-2); cout<<"该选手的最后得分是: "< return1; } ●程序运行结果如下: 2.线性表的顺序存储结构 用顺序表A记录学生的信息,编写程序: (1)将A表分解成两个顺序表B和C,使C表中含原A表中性别为男性的学生,B表中含原表中性别为女性的学生,要求学生的次序与原A表中相同。 (2)分别求男生和女生的平均年龄 ●程序代码如下: //数据结构实验1.2线性表的顺序存储结构 //调试环境: VisualC++6.0 //-----库文件的预设和定义 #include #include #include #include #include #include #defineNULL0 structstudent//定义学生信息 {charname[8]; intsex;//0女: 1: 男 intage; }; typedefstructstudentSTD; intcreate(STD*m);//创建顺序表 intcalc(STD*m,STD*n,STD*r,float&Fage,float&Mage);//计算、数据处理 voidprint(STD*m); constintMAX=100;//定义人数 voidmain() { STDA[MAX]; STDB[MAX]; STDC[MAX]; floatage1=0,age2=0;//age1男age2女 create(A); printf("学生总表A记录如下: \n"); print(A); calc(A,B,C,age1,age2); printf("女生名册B记录如下: \n"); print(B); printf("男生名册C记录如下: \n"); print(C); } intcreate(STD*m) { intn; printf("请输入班级总人数: \n"); scanf("%d",&n); m[0].age=n;//置顺序表长度 printf("请输入学生信息: \n"); for(inti=1;i<=n;i++) { printf("姓名: "); scanf("%s",&m[i].name); printf("性别0女1男: "); scanf("%d",&m[i].sex); printf("年龄: "); scanf("%d",&m[i].age); printf("\n"); } return1; } intcalc(STD*m,STD*n,STD*r,float&Fage,float&Mage) {inti,j=1,k=1; n[0].age=r[0].age=0; for(i=1;i<=m[0].age;i++) {if(m[i].sex==0) { strcpy(n[j].name,m[i].name); n[j].sex=m[i].sex;n[j].age=m[i].age; n[0].age++;Mage+=m[i].age;j++; } else { strcpy(r[k].name,m[i].name); r[k].sex=m[i].sex;r[k].age=m[i].age; r[0].age++;Fage+=m[i].age;k++; } } Mage=Mage/n[0].age;Fage=Fage/r[0].age; cout<<"女生的平均年龄是: "< "< return1; } voidprint(STD*m) { for(inti=1;i<=m[0].age;i++) { printf("姓名: %3s,性别(0女1男): %d,年龄: %d\n",m[i].name,m[i].sex,m[i].age); } } ●程序运行结果如下: 3.实验结论 线性表采用顺序存储(顺序表)时: 逻辑结构与存储结构一致,可用数组或指针实现,能随机访问,但插入删除操作平均而言移动元素次数较多,效率很低.插入位置i,移动元素次数为n-i+1.删除位置是i,移动次数n-i。 线性表采用链式存储(链表)时: 以结构变量存储结点,动态生成结点,以指针链接结点,能有效利用存储空间,插入删除方便,但不能随机访问.单向链表可从某结点访问到后继结点。 单向链表操作的关键步骤: ●建立链表的头插法: 指针变量p开辟单元,生成结点,指针变量q始终指向头结点,操作为: p->next=q->next; q->next=p; ●尾插法: 指针变量q始终指向尾结点,p指针开辟单元,生成结点: q->next=p; q=p; ●插入: p所指向结点的后面插入新结点s所指结点 s->next=p->next; p->next=s; ●删除: p,q指向相邻结点,q所指结点是p所指结点的后继,删除q所指结点, p->next=q->next; ●遍历: p=p->next;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告