数据结构实验指导书实验1.docx
- 文档编号:11204069
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:16
- 大小:19.50KB
数据结构实验指导书实验1.docx
《数据结构实验指导书实验1.docx》由会员分享,可在线阅读,更多相关《数据结构实验指导书实验1.docx(16页珍藏版)》请在冰豆网上搜索。
数据结构实验指导书实验1
实验一顺序表的基本操作
一、实验目的
1.掌握使用VC++6.0调试程序的基本方法;
2.掌握线性表的顺序存储结构的类型定义;
3.掌握顺序表的基本操作的实现,如:
插入、删除、遍历、查找、排序、修改、合并等;
4.掌握顺序表的应用。
二、实验环境
1.台式计算机每人一台;
2.软件:
VisualC++6.0
三、注意事项
在U盘上创建一个以“学号姓名”命名的文件夹(如:
20090001张三),专门用于存储数据结构实验的程序及实验报告。
四、实验内容
示例程序:
简易学生信息管理系统(SqList.cpp)
本简易学生信息管理系统要求以顺序表作为学生信息的载体,并实现学生信息的查询、添加、删除、统计、排序、保存等基本功能。
本示例程序已经实现了简易学生信息管理中的查询、添加和保存等功能,要求学生对该系统进行完善,继续添加相关函数以提高其实用性。
1.文件结构设计
a)原始数据:
保存在文件input1.txt中。
b)输出数据:
保存在文件output1.txt中。
2.数据结构设计
//顺序表存储结构定义
#defineMaxSize50//线性表的最大容量,假设为50
typedefstructStu{
longintnum;//学号
charname[20];//姓名
charsex;//性别
intage;//年龄
intscore;//分数
}Elemtype;//定义数据元素为学生信息
typedefstructSqList
{Elemtype*data;
intlength;//线性表长度
}SqList;//顺序表数据类型为SqList
3.程序结构
a)函数说明
intMenu();//系统主菜单
intQMenu();//查询菜单
voidPrintElem(Elemtypea);//打印输出数据元素a的各数据项
voidInit_SqList(SqList&L);//构造一个空的顺序表L
voidSaveList(SqListL,FILE*out);//保存顺序表L的数据
voidCreat_SqList(SqList&L,FILE*in);//建表
voidTraver_SqList(SqListL);//查询(遍历顺序表L)
SqListInsert_SqList(SqList&L);//添加
b)函数实现
//基本操作的实现
intMenu()//系统主菜单
{
intn;
printf("----------------------------\n");
printf("******************学生信息管理系统******************\n\n");
printf("\t1.导入数据\n");
printf("\t2.查询(全部信息、男生信息、女生信息)\n");
printf("\t3.添加学生信息\n");
printf("\t4.删除学生信息\n");
printf("\t5.统计人数(男生、女生、不及格、优秀等)\n");
printf("\t6.排序(升序、降序)\n");
printf("\t7.修改(修改姓名、性别、年龄、分数等属性值)\n");
printf("\t8.存盘\n");
printf("\t0.退出\n\n");
printf("**********************欢迎访问**********************\n");
printf("----------------------------\n");
scanf("%d",&n);
return(n);
}
intQMenu()//查询菜单
{
intn;
printf("\n\t***********欢迎进入查询系统************\t\n");
printf("\t1.全部信息");
printf("\t2.男生信息");
printf("\t3.女生信息");
printf("\t4.退出\t");
printf("\n\t**************************************\t\n");
scanf("%d",&n);
return(n);
}
voidPrintElem(Elemtypea)
{//打印输出数据元素a的各数据项,即输出单个学生信息
printf("(%8d%-8s%c%4d%4d)\n",
a.num,a.name,a.sex,a.age,a.score);
}
voidInit_SqList(SqList&L)
{//构造一个空的顺序表L
L.data=(Elemtype*)malloc(MaxSize*sizeof(Elemtype));
if(!
L.data)exit
(1);
L.length=0;
}
voidCreat_SqList(SqList&L,FILE*in)
{//建表,从文件指针in所指文件读取数据,以尾插法建立顺序表L
inti;
fscanf(in,"%d",&L.length);//读取数据元素个数,即表长n
//printf("表长n=%d\n",L.length);
for(i=0;i fscanf(in,"%d%s%c%d%d",&L.data[i].num, L.data[i].name,&L.data[i].sex,&L.data[i].age,&L.data[i].score); } voidTraver_SqList(SqListL) {//遍历顺序表L(输出L中的数据序列) //查询(1.全部信息2.男生信息3.女生信息4.退出) inti,choice=QMenu(); switch(choice) { printf("\n(学号姓名性别年龄分数)\n"); case1: //全部信息 for(i=0;i PrintElem(L.data[i]); /*等价于: printf("(%8d%-8s%c%4d%4d)\n",L.data[i].num, L.data[i].name,L.data[i].sex,L.data[i].age,L.data[i].score);*/ printf("\n");break; case2: //男生信息 for(i=0;i if(L.data[i].sex=='m') PrintElem(L.data[i]); printf("\n");break; case3: //女生信息 for(i=0;i if(L.data[i].sex=='f') PrintElem(L.data[i]); printf("\n");break; case4: return;//退出 } } SqListInsert_SqList(SqList&L) {//在顺序表L的第i个位置上插入(添加)一个新元素 Elemtypex; inti; printf("请输入插入的位置(1..%d)i=",L.length+1); scanf("%d",&i); if((i<1)||(i>L.length+1))//检查插入位置的正确性 {printf("插入位置i不合理! ");exit (1);}//不合理,中止程序运行 if(L.length>=MaxSize)//顺序表是否已满 {printf("“顺序表已满,不能再插入! ”"); exit (1);}//表满,不能插入 printf("请输入添加的元素(学号姓名性别年龄成绩)\nx="); scanf("%d%s%c%d%d",&x.num,x.name,&x.sex,&x.age,&x.score); for(intm=L.length-1;m>=i-1;--m) L.data[m+1]=L.data[m];//数据后移 //L.data[m+1]=L.data[m];//数据后移 L.data[i-1]=x;//新元素插入 //L.data[i-1]=x;//新元素插入 L.length++;//表长+1 returnL;//插入成功,返回 } voidSaveList(SqListL,FILE*out) {//将顺序表L的数据存入文件output1.txt inti; fprintf(out,"%d\n",L.length);//保存表长 for(i=0;i fprintf(out,"%8d%-8s%c%4d%4d\n", L.data[i].num,L.data[i].name,L.data[i].sex,L.data[i].age,L.data[i].score); } c)主函数 voidmain() {//通过文件input1.txt输入数据,结果输出到文件output1.txt //打开输入输出文件 FILE*in,*out; if((in=fopen("input1.txt","r"))==NULL) {printf("cannotopeninfile\n"); exit(0); } if((out=fopen("output1.txt","w"))==NULL) {printf("cannotopeninfile\n"); exit(0); } intchoice; SqListL; Init_SqList(L);//系统文件初始化,构造空表L while (1) { choice=Menu(); switch(choice) { case1: Creat_SqList(L,in); //导入数据,根据文件input.txt读入的数据建立顺序表L break; case2: Traver_SqList(L);//查询,输出顺序表 break; case3: Insert_SqList(L);//在顺序表L中插入一个新元素 break; case4: break;//删除元素 case5: break;//统计 case6: break;//排序 case7: break;//修改 case0: SaveList(L,out);fclose(in);fclose(out);exit(-1);break; //保存数据,并退出系统 } getchar(); } } 五、实验要求 1.认真阅读和掌握本实验的示例程序。 2.上机运行示例程序,打印出程序的运行结果,并作必要的说明。 3.对示例程序,按照对线性表的操作需要,在程序中至少添加2个顺序表的相关操作。 如: 1)查找并显示分数在区间[a,b)的学生信息; 2)查找并显示最高分或最低分学生信息; 3)统计不及格或及格人数及所占比例; 4)将信息表按学号、姓名或分数升序或降序排列; 5)按学号顺序进行数据元素的插入; 6)删除指定学号或姓名的学生信息; 7)修改某个学生的信息; 8)其它。 4.重新改写主函数(要求必需调用自己添加的操作),打印出文件清单(自己添加的函数、修改后的主函数和运行结果)。 5.对修改后的程序,分析每一个算法(函数)的时间复杂度。 6.根据上述要求撰写实验报告,并简要给出算法设计小结和心得。 //************************************************************************// 附: 顺序表基本操作的实现程序实例 本程序实例提供的顺序表存储结构定义及基本操作的实现仅供参考。 //-----------------SqList2.CPP-------------------- //本程序定义了顺序表存储结构的另外一种形式 //并演示了几个基本操作的实现 //(初始化、清空、求长度、判空、判满、遍历、查找、插入、删除、有序输出) #include #include #include #include typedefintElemType;//定义ElemType为int类型 //线性表顺序存储类型定义 structSqList {ElemType*list;// intsize;//线性表长度 intMaxSize;//线性表的最大容量 }; //顺序表基本操作说明 voidInitList(SqList&L,intms);//初始化顺序表 voidClearList(SqList&L);//清空线性表 intListSize(SqList&L);//求线性表长度 boolListEmpty(SqList&L);//检查线性表是否为空 boolListFull(SqList&L);//检查线性表是否为满 voidTraverList(SqList&L);//遍历线性表 intFindList(SqList&L,ElemTypeitem);//从线性表中查找元素 boolInsertList(SqList&L,constElemTypeitem,intmark);//向线性表插入元素 boolDeleteList(SqList&L,ElemType&item,intmark);//从线性表中删除元素 voidOrderOutputList(SqList&L,intmark);//对线性表进行有序输出 //顺序表基本操作的实现 //初始化顺序表 voidInitList(SqList&L,intms) {L.list=newElemType[ms]; if(! L.list) {cout<<"Memoryallocationfailure! "< exit (1); } L.size=0; L.MaxSize=ms; } //清空线性表 voidClearList(SqList&L) {L.size=0; } //求线性表长度 intListSize(SqList&L) {returnL.size; } //检查线性表是否为空 boolListEmpty(SqList&L) {returnL.size==0; } //检查线性表是否为满 boolListFull(SqList&L) {returnL.size==L.MaxSize; } //遍历线性表 voidTraverList(SqList&L) {for(inti=0;i cout< } //从线性表中查找元素 intFindList(SqList&L,ElemTypeitem) {for(inti=0;i if(L.list[i]==item)returni; return-1; } //向线性表的表头、表尾或合适位置插入元素 boolInsertList(SqList&L,constElemTypeitem,intmark) {if(ListFull(L))returnfalse; if(mark>0)//向表头插入元素 {for(inti=L.size-1;i>=0;i--) L.list[i+1]=L.list[i]; L.list[0]=item; } else//向表尾插入元素 if(mark<0)L.list[L.size]=item; else{//有序插入元素 for(inti=0;i if(item for(intj=L.size-1;j>=i;j--) L.list[j+1]=L.list[j]; L.list[i]=item; } L.size++; returntrue; } //从线性表中删除表头、表尾或等于给定值的元素 boolDeleteList(SqList&L,ElemType&item,intmark) {if(ListEmpty(L))returnfalse; if(mark>0)//删除表头元素 {item=L.list[0]; for(inti=1;i L.list[i-1]=L.list[i]; } else//删除表尾元素 if(mark<0)item=L.list[L.size-1]; else{//删除值为item的元素 for(inti=0;i if(L.list[i]==item)break; if(i>=L.size)returnfalse; for(intj=i;j L.list[j]=L.list[j+1]; } L.size--;//表长减1 returntrue; } //对线性表进行有序输出 voidOrderOutputList(SqList&L,intmark) {int*b=newint[L.size]; inti,k; for(i=0;i for(i=1;i {k=i-1; for(intj=i;j {if(mark==1&&L.list[b[j]] if(mark! =1&&L.list[b[k]] } if(k! =i-1){intx=b[i-1];b[i-1]=b[k];b[k]=x;} } for(i=0;i cout< cout< } constintML=10;//线性表的最大长度 voidmain() {SqLista; InitList(a,ML); inti; ElemTypex; //依次向线性表a表尾插入5个整数元素 cout<<"从键盘输入5个整数: "< for(i=0;i<5;i++) {cin>>x; InsertList(a,x,-1); } //依次向线性表表头插入2个整数元素 cout<<"从键盘输入两个整数: "< cin>>x;InsertList(a,x,1); cin>>x;InsertList(a,x,1); //按不同次序遍历输出线性表a TraverList(a); OrderOutputList(a,1); OrderOutputList(a,0); //把线性表a中的元素依次有序插入到一个新线性表b中 SqListb; InitList(b,ML); for(i=0;i InsertList(b,a.list[i],0); //输出线性表b TraverList(b); //从线性表a中依次删除表头、表尾和等于给定值的元素 if(DeleteList(a,x,1))cout<<"Deletesuccess! "< elsecout<<"Deletefail! "< //输出线性表a TraverList(a); if(DeleteList(a,x,-1))cout<<"Deletesuccess! "< elsecout<<"Deletefail! "< //输出线性表a TraverList(a); cout<<"从键盘上输入一个待删除的整数: "; cin>>x; if(DeleteList(a,x,0))cout<<"Deletesuccess! "< elsecout<<"Deletefail! "< //输出线性表a TraverList(a); } //*************************************************************************//
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 指导书