实验一顺序表操作实现.docx
《实验一顺序表操作实现.docx》由会员分享,可在线阅读,更多相关《实验一顺序表操作实现.docx(11页珍藏版)》请在冰豆网上搜索。
实验一顺序表操作实现
实验一-顺序表操作实现
实验一顺序表操作实现
实验日期:
2017年_3_月_6_日
实验目的及要求
1.熟练掌握线性表的基本操作在顺序存储上的实现;
2.以线性表的各种操作(建立、插入、删除、遍历等)的实现为重点;
3.掌握线性表的顺序存储结构的定义和基本操作的实现;
4.通过本实验加深对C语言的使用(特别是函数调用的参数传递、指针类型的应用)。
实验内容
已知程序文件seqlist.cpp已给出学生身高信息顺序表的类型定义和基本运算函数定义。
(1)顺序表类型定义
typedefstruct{
intxh;/*学号*/
floatsg;/*身高*/
intsex;/*性别,0为男生,1为女生*/
}datatype;
typedefstruct{
datatypedata[MAX];/*存放顺序表元素的数组*/
intlast;/*表示data中实际存放元素个数*/
}Seqlist;
(2)基本运算函数原型
voidinitList(Seqlist*lp);/*置一个空表*/
voidcreateList(Seqlist*lp);/*建一个学生顺序表*/
voidsort_xh(Seqlist*lp);/*按学号排序*/
voidError(char*s);/*自定义错误处理函数*/
voidpntList(Seqlist*lp);/*输出学生表*/
voidsave(Seqlist*lp,charstrname[]);/*保存学生顺序表到指定文件*/
任务一
创建程序文件seqlist.cpp,其代码如下所示,理解顺序表类型Seqlist和基
本运算函数后回答下列问题。
/*seqlist.cpp程序文件代码*/
#inelude
#include
#defineMAX50
typedefstruct{
intxh;/*学号*/
floatsg;/*身高*/
intsex;/*性别,0为男生,1为女生*/
}datatype;
typedefstruct{
datatypedata[MAX];/*存放顺序表元素的数组*/intlast;/*表示data中实际存放元素个数*/
}Seqlist;
voidinitList(Seqlist*lp);/*置一个空表*/
voidcreateList(Seqlist*lp);/*建一个学生顺序表*/
voidsort_xh(Seqlist*lp);/*按学号排序*/
voidError(char*s);/*自定义错误处理函数*/
voidpntList(Seqlist*lp);/*输出学生表*/
voidsave(Seqlist*lp,charstrname[]);/*保存学生顺序表到指定文件*/
/*置一个空表*/
voidinitList(Seqlist*lp)
{lp->last=0;}
/*建一个学生顺序表*/
voidcreateList(Seqlist*lp)
{FILE*fp;
intxh,sex;
floatsg;
if((fp=fopen("records.txt","r"))==NULL)
{Error("cannotopenfile!
");
}
while(!
feof(fp))
{fscanf(fp,"%d%f%d",&xh,&sg,&sex);
lp->data[lp->last].xh=xh;
lp->data[lp->last].sg=sg;
lp->data[lp->last].sex=sex;
lp->last++;
}
/*按学号排升序*/
voidsort_xh(Seqlist*lp)
{inti,j,k;
datatypest;
for(i=0;ilast-1;i++)
{k=i;
for(j=i+1;jlast;j++)
if(lp->data[j].xhv|p->data[k].xh)
k=j;
if(k!
=i)
{st=lp->data[k];
lp->data[k]=lp->data[i];
lp->data[i]=st;}
}
}
/*自定义错误处理函数*/
voidError(char*s)
{printf("\n%s",s);
exit
(1);/*返回OS该函数定义在stdlib.h中*/
}
/*输出学生顺序表*/
voidpntList(Seqlist*lp)
{inti;
for(i=0;ilast;i++)
printf("%2d:
%.2f%d\n",lp->data[i].xh,lp->data
[i].sg,lp->data[i].sex);
}
/*保存学生顺序表到指定文件*/
voidsave(Seqlist*lp,charstrname[])
{FILE*fp;
inti;
if((fp=fopen(strname,"w"))==NULL)
{Error("cannotopenfile!
");
}
for(i=0;ilast;i++)
{
fprintf(fp,"%2d%5.2f%2d\n",lp->data[i].xh,lp->data[i].sg,lp->data[i].sex);
}
}
请回答下列问题:
(1)由顺序表类型定义可知,该顺序表类型名为Seqlist,其中存放的元素
为学生信息,学生信息定义的类型名为datatype,包含xh、sg
sex三个成员(写出成员变量名),学生信息存储于data数组,顺序表的表
长变量为MAX。
(2)seqlist.cpp程序编译连接通过后能执行吗?
为什么?
其代码的整体结构有哪几个组成部分?
答:
不能。
因为没有主函数,程序无法运行。
代码的整体结构的组成部分有:
typedefstructdatatype;
typedefstructSeqlist;
voidinitList(Seqlist*lp);/*置一个空表*/
voidsort_xh(Seqlist*lp);/*按学号排序*/
voidcreateList(Seqlist*lp);/*建一个学生顺序表*/
voidError(char*s);/*自定义错误处理函数*/
voidpntList(Seqlist*lp);/*输出学生表*/
voidsave(Seqlist*lp,charstrname[]);/*保存学生顺序表到指定文件*/
(3)回答下列问题
a)initList函数的形参变量lp存放什么值?
顺序表置为空表的实质是做什么操作?
答:
学生信息:
学号,身高,性别。
顺序表的初始化即构造一个空表,这对表是一个加工型的运算,因此,将L设为指针参数,首先动态分配存储空间,然后,将表中last指针置为0,表示表中没有数据元素。
b)在建立顺序表的createList函数中,顺序表的数据元素来自何处?
根据已提供的数据建完的顺序表表长是多少?
答:
顺序表的数据元素来自文件,顺序表表长是:
last。
c)sort_xh排序函数采用了什么排序方法?
请列举5个学号值写出每趟(5
个需排4趟)排序后的结果
答:
选择排序。
第一次排序1,3,6,4,5
第二次排序1,3,6,4,5
第三次排序1,3,4,6,5
第四次排序1,3,4,5,6
结果
cannotopenfile!
e)save函数中的形参数组strname中存放什么?
答:
存放的是学生的学生的信息:
学号,身高,性别。
任务二
1.题目要求
创建一个新的程序文件syll.cpp,请调用seqlist.cpp提供的功能函数(以#include“seqlist.cpp方式导入函数库)及自定义的函数完成以下操作:
创建一个包含学生学号、身高、性别的学生身高信息表并输出到屏幕,学生信息从records.txt文件读取;
对已建立的学生身高信息表按学号从小到大排序,并把结果写入到数据文件中(result.txt);
从键盘输入一位学生的相关信息插入到已排序的学生身高信息表中后仍然保持学号的有序性;
对插入后的学生身高信息表进行倒置,结果输出在屏幕;
从键盘输入一个身高值,统计与该身高相同的学生个数并输出在屏幕;
在程序文件syl.cpp需再定义以下三个功能函数:
(1)voidinsertX(Seqlist*lp,datatypex)
功能:
在学号从小到大排序的学生表中插入值为x的学生仍保持学号的有
序性
(2)voidreverse(Seqlist*lp)
功能:
对lp指向的顺序表进行倒置操作
(3)intcount(Seqlist*lp,floaty)
功能:
统计学生表中身高值为y的学生数并返回
2.请根据题目功能要求及程序中的注释填空完整sy1.cpp代码
/*sy11.cpp程序文件代码*/
#include"seqlist.cpp"//导入自定义类型及函数所在的文件seqlist.cpp,该
文件与sy11.cpp存于同一目录中
voidinsertX(Seqlist*lp,datatypex);
voidreverse(Seqlist*lp);
intcount(Seqlist*lp,floaty);
voidmain()
{
Seqliststu;//定义stu为学生顺序表变量
datatypex;//x为存储一个学生信息的变量
intc;
charstrname[20];//strname为存储文件名的数组
/*创建一个包含学生学号、身高、性别的学生身高信息表stu并输出到
屏幕,学生信息从records.txt文件读取*/
initList(&stu)〃调用函数initList初始化顺序表stu
createList(&stu)//调用函数createList创建学生表stuprintf("\nsourcelist:
'n");
pntList(&stu)//调用函数pntList打印学生表stu
getchar();〃在执行程序能起到暂定的作用,按任意键继续
/*对已建立的学生身高信息表按学号从小到大排序,并把结果写入到数据文件中(result.txt)*/
sortxh(stu)〃调用函数sort_xh对学生表stu按学号从小
到大排序
printf("\nlnputnewfilenametosave:
");
scanf(“”)〃键盘输入文件名字符串存于strname字符数组中
save(&stu,strname)//调用函数save把排序后的顺序表stu存于文件
中,文件名在strname数组中
/*从键盘输入一位学生的相关信息插入到已排序的学生身高信息表中后仍然保持学号的有序性;*/
printf("\nlnputastudentinformation:
\n”);
scanf("%d%f%d",&x.xh,&x.sg,&x.sex);
insertX(&stu,x)〃插入
printf("\nlistafterinsert:
\n");
pntList(&stu);
getchar();
/*对插入后的学生身高信息表进行倒置,结果输出在屏幕;*/
reserve(&stu)//倒置顺序表
printf("\nlistafterreverse:
\n");
pntList(&stu);
getchar();
/*从键盘输入一个身高值,统计与该身高相同的学生个数并输出在屏幕
*/
printf("\nlnputastudentheight:
\n");
scanf("%f",&x.sg);
c=count(&stu.y)〃统计相同身高的学生数存于c中
printf("\nThesameheight:
%d\n",c);getchar();
}
/*在学号从小到大排序的学生表中插入值为x的学生仍保持学号的有序性*/
voidinsertX(Seqlist*lp,datatypex)
{
inti.j;
if(lp->last>=MAX)
Error("listisfull");
else
for(i=0;ilast;i++)
if(lp->last>x)
break;
for(j=lp->last-1;j>=i;j--)/*从后往前元素后移*/
lp->strname[j+1]=lp->strname[j];
lp->strname[i]=x;lp->last++;/*插入并表长增1*/
}
/*对lp指向的顺序表进行倒置操作*/
voidreverse(Seqlist*lp)
{inti,j;
datatypetemp;
〃通过前后数据元素交换的方式实现倒置
for(i=0;j=lp->lastT,j-i>=0;i++,j--){
temp=lp->data[i].sg;
lp->data[i].sg=lp->data[j].sg;lp->data[j].sg=temp;
}
}
/*统计学生表中身高值为y的学生数并返回*/
intcount(Seqlist*lp,floaty)
{inti,c=0;
〃遍历顺序表统计身高为y的学生数到c变量并返回值
i=lp->last;
while(i)
{
if(lp->data[i-1].sg=y){
c++;
i--;
}
}
}
实验总结分析(本程序的重点与难点,调试中出现的问题及解决方法等)