当前位置:文档之家› 线性表实验报告:针对链式或顺序存储的线性表实现指定的操作(二份)

线性表实验报告:针对链式或顺序存储的线性表实现指定的操作(二份)

、格式已经给出,请同学们参考书写。

其中,第一项可补充,第二、三项不修改,第四项为可选项,第六项为参考程序,第五、七、八项需自己上机调试程序书写。

注意:红色字体为提示内容,大家不要往实验报告上抄。

实验一:线性表的顺序存储结构的表示和实验——学生成绩管理系统一、实验目的:通过上机调试程序,充分理解和掌握有关线性表的定义、实现及操作。

二、实验环境Win2003/win xp +Visual C++三、基本要求:利用顺序表来制作一个学生成绩表1、建立头文件,包含数据类型定义和基本操作。

2、建立程序文件利用顺序表表完成一个班级的一个学期的所有课程的管理:能够增加、删除、修改学生的成绩记录。

四、简要的需求分析与概要设计(本项为可选项,选作时参考课五、详细的算法描述:六、实验步骤(以下为参考程序,已经调试运行通过)#include<iostream>#include<fstream>using namespace std;const int LISTINITSIZE=100;const int LISTINCREMENT=10;struct student{char no[20];char name[20];int english;int math;};typedef student elemtype;struct sqlist{elemtype *elem;int length;int listsize;int incrementsize;};//初始化顺序表lvoid initlist(sqlist &l,int maxsize=LISTINITSIZE,int incresize=LISTINCREMENT){l.elem=new elemtype[maxsize];l.length=0;l.listsize=maxsize;l.incrementsize=incresize;//当线性表空间不足时,进行扩容操作void increment(sqlist &l){elemtype *a=new elemtype[l.listsize+l.incrementsize];for(int i=0;i<l.length ;i++){a[i]=l.elem[i];}delete []l.elem;l.elem=a;l.listsize+=l.incrementsize;}//在第i个元素之前插入元素evoid insertlist(sqlist &l,int i,elemtype e){//判断i的合法性1<=i<=l.length+1if(i<1||i>l.length +1){cout<<"插入位置不合法";exit(0);}//判断顺序表l是否有空闲空间if(l.length==l.listsize ) increment(l);//移动元素for(int j=l.length -1;j>=i-1;j--){l.elem [j+1]=l.elem [j];}//插入元素e到第i个元素之前l.elem [i-1]=e;//修改顺序表的长度l.length ++;}//输出线性表中指定元素evoid outputelem(elemtype e){cout<<"学号:"<<e.no<<" 姓名:"<< <<" 英语:"<<e.english <<" 数学:"<<e.math <<endl;}//输出整个线性表void outputlist(sqlist l){for(int i=0;i<l.length ;i++){outputelem(l.elem [i]);}}//在顺序表l中删除第i个元素,用e带回其值void deletelist(sqlist &l,int i,elemtype &e){//判断i值的合法性1<=i<=l.lengthif(i<1 || i>l.length ){cout<<"i值不合法!";exit(0);}//取被删的元素置于e中e=l.elem [i-1];//移动元素for(int j=i;j<l.length ;j++){l.elem [j-1]=l.elem [j];}//修改顺序表的长度l.length --;}//根据学号查找学生的位序int locateelembyno(sqlist l,elemtype e) {for(int i=0;i<l.length ;i++){if(strcmp(l.elem [i].no ,e.no)==0)return i+1;}return 0;}根据位序查找学生的信息elemtype locateelembypos(sqlist l,int i){return l.elem [i-1];}//将当前顺序表中的信息保存void save(sqlist l){ofstream out;out.open ("scorefile",ios::binary);for(int i=0;i<l.length;i++)out.write((char *)&l.elem[i],sizeof student);out.close ();}// 读取scorefile文件中的数据到顺序表l中,如果文件不存在,则创建该文件void openorcreate(sqlist &l){//以读取的方式打开指定的文件scorelist,若存在,则将文件//读出并插入到顺序表l中,若不存在,则根据用户的选择,决定是否创建该文件ifstream in;elemtype e;char answer;int i=0;in.open ("e:\\scorelist",ios_base::binary);if(in){while(in.peek()!=EOF){in.read((char *)&e,sizeof(student));insertlist(l,l.length +1,e);}}else{//创建该文件cout<<"文件scorelist不存在,要创建它吗?(y/n)";cin>>answer;if(answer=='Y' || answer=='y'){ofstream out("e:\\scorelist",ios_base::binary);if(out){do{cout<<"请输入学生的学号、姓名、英语成绩和数学成绩:"<<endl;cin>>e.no>>>>e.english>>e.math;out.write((char *)&e,sizeof(elemtype));insertlist(l,++i,e);cout<<"要继续输入吗?(y/n):";cin>>answer;}while(answer=='Y' || answer=='y');}else{cout<<"文件打开失败!";return;}}elsereturn;}}//逆置顺序表lvoid invertlist(sqlist &l){int i;elemtype temp;for(i=0;i<l.length/2;i++){temp=l.elem [i];l.elem [i]=l.elem [l.length -i-1];l.elem [l.length -i-1]=temp;}}//将顺序表l中前m个元素和后n个元素互换void exchange1(sqlist &l,int m,int n){int k,j;elemtype temp;for(k=1;k<=n;k++){temp=l.elem [m+k-1];for(j=m+k-2;j>=k-1;j--)l.elem [j+1]=l.elem [j];l.elem [k-1]=temp;}}//将数组R中下标从s到t的元素逆置void invert(elemtype R[],int s,int t) {elemtype temp;for(int k=s;k<=(s+t)/2;k++){temp=R[k];R[k]=R[t-k+s];R[t-k+s]=temp;}}//将顺序表l中前m个元素和后n个元素互换void exchange2(sqlist &l,int m,int n){invert(l.elem ,0,m+n-1);invert(l.elem ,0,n-1);invert(l.elem ,n,m+n-1);}//将非纯集合变成纯集合void purge(sqlist &lb){sqlist la;initlist(la);int i,j;for(i=0;i<lb.length ;i++){for(j=0;j<la.length ;j++)if(strcmp(lb.elem [i].no,la.elem [j].no)==0) break;if(j==la.length ){la.elem [la.length ]=lb.elem [i];la.length ++;}}delete []lb.elem ;lb.elem=la.elem;lb.length=la.length;}#include"SqList_h.h"#include<iostream>using namespace std;void main(){sqlist l;initlist(l);elemtype e;int m,n;int choice,pos;do{cout<<endl;cout<<"1 插入"<<endl;cout<<"2 删除"<<endl;cout<<"3 按学号查找"<<endl;cout<<"4 保存"<<endl;cout<<"5 输出"<<endl;cout<<"6 逆置"<<endl;cout<<"7 交换元素"<<endl;cout<<"8 集合置纯"<<endl;cout<<"9 读文件中的数据至顺序表"<<endl;cout<<"10 退出"<<endl;cout<<"请选择要进行的操作(1--10):";cin>>choice;switch(choice){case 1:cout<<"请输入要插入学生的学号、姓名、英语、数学:"<<endl;cin>>e.no>>>>e.english>>e.math;cout<<"请输入插入位置:"<<endl;cin>>pos;insertlist(l,pos,e);break;case 2:cout<<"请输入要删除学生的学号:";cin>>e.no;pos=locateelembyno(l,e);if(pos==0){cout<<"要删除的学生不在该表中.";}else{cout<<"要删除的是表中的第"<<pos<<"个学生。

相关主题