数据结构实验指导书实验1.docx

上传人:b****7 文档编号:11204069 上传时间:2023-02-25 格式:DOCX 页数:16 大小:19.50KB
下载 相关 举报
数据结构实验指导书实验1.docx_第1页
第1页 / 共16页
数据结构实验指导书实验1.docx_第2页
第2页 / 共16页
数据结构实验指导书实验1.docx_第3页
第3页 / 共16页
数据结构实验指导书实验1.docx_第4页
第4页 / 共16页
数据结构实验指导书实验1.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

数据结构实验指导书实验1.docx

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

数据结构实验指导书实验1.docx

数据结构实验指导书实验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);

}

//*************************************************************************//

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

当前位置:首页 > 经管营销 > 经济市场

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

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