数据结构实验报告1.docx
《数据结构实验报告1.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告1.docx(11页珍藏版)》请在冰豆网上搜索。
![数据结构实验报告1.docx](https://file1.bdocx.com/fileroot1/2023-1/5/73ae20cd-806d-44fd-bb04-c2220b885cdb/73ae20cd-806d-44fd-bb04-c2220b885cdb1.gif)
数据结构实验报告1
实验报告
(一)
分校名称
学号姓名
实验日期2010-11-04
专业名称
计算机科学与技术
课程名称
数据结构
批改教师
主持教师
实验成绩
校外评阅教师
实验名称线性表
使用主要设备PC,VC++6.0
实验要求
建立一个评委打分的单向链表
显示删除相关结点后的链表的信息
显示要求的结果
建立学生信息的顺序表A显示B表和C表的相关信息显示计算结果
实验报告内容:
1.调试中碰到的问题及解决方法
2.调试成功的程序清单
3.实验结论
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.scoredata.score)pmin=p;
sum+=p->data.score;
}
cout<<"给出最高分的评委姓名:
"<data.name<<"年龄:
"<data.age<<"分值:
"<data.score<cout<<"给出最低分的评委姓名:
"<data.name<<"年龄:
"<data.age<<"分值:
"<data.score<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//包含库函数strcpy的头文件
#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;