数据结构实验指导书实验1.docx
《数据结构实验指导书实验1.docx》由会员分享,可在线阅读,更多相关《数据结构实验指导书实验1.docx(16页珍藏版)》请在冰豆网上搜索。
![数据结构实验指导书实验1.docx](https://file1.bdocx.com/fileroot1/2023-2/25/4a9ab619-0ec7-43f0-80ac-6f148426df59/4a9ab619-0ec7-43f0-80ac-6f148426df591.gif)
数据结构实验指导书实验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;ifscanf(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;iPrintElem(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;iif(L.data[i].sex=='m')
PrintElem(L.data[i]);
printf("\n");break;
case3:
//女生信息
for(i=0;iif(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;ifprintf(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;icout<}
//从线性表中查找元素
intFindList(SqList&L,ElemTypeitem)
{for(inti=0;iif(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;iif(itemfor(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;iL.list[i-1]=L.list[i];
}
else//删除表尾元素
if(mark<0)item=L.list[L.size-1];
else{//删除值为item的元素
for(inti=0;iif(L.list[i]==item)break;
if(i>=L.size)returnfalse;
for(intj=i;jL.list[j]=L.list[j+1];
}
L.size--;//表长减1
returntrue;
}
//对线性表进行有序输出
voidOrderOutputList(SqList&L,intmark)
{int*b=newint[L.size];
inti,k;
for(i=0;ifor(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;icout<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;iInsertList(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);
}
//*************************************************************************//