数据结构实验报告1.docx

上传人:b****6 文档编号:6322606 上传时间:2023-01-05 格式:DOCX 页数:11 大小:72.12KB
下载 相关 举报
数据结构实验报告1.docx_第1页
第1页 / 共11页
数据结构实验报告1.docx_第2页
第2页 / 共11页
数据结构实验报告1.docx_第3页
第3页 / 共11页
数据结构实验报告1.docx_第4页
第4页 / 共11页
数据结构实验报告1.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

数据结构实验报告1.docx

《数据结构实验报告1.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告1.docx(11页珍藏版)》请在冰豆网上搜索。

数据结构实验报告1.docx

数据结构实验报告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;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1