实验一 顺序表的基本操作
一、 实验目的
1.掌握使用VC++6.0调试程序的基本方法; 2.掌握线性表的顺序存储结构的类型定义;
3.掌握顺序表的基本操作的实现,如:插入、删除、遍历、查找、排序、修改、合并等; 4.掌握顺序表的应用。
二、 实验环境
1.台式计算机每人一台; 2.软件:Visual C++6.0
三、 注意事项
在U盘上创建一个以“学号姓名”命名的文件夹(如:20090001张三),专门用于存储数据结构实验的程序及实验报告、处理的输入数据。
四、 实验内容
示例程序:简易学生信息管理系统(SqList.cpp)
本简易学生信息管理系统要求以顺序表作为学生信息的载体,并实现学生信息的查询、添加、删除、统计、排序、修改、保存等基本功能。本示例程序已经实现了简易学生信息管理中的查询、添加和保存等功能,要求学生对该系统进行完善,继续添加相关函数以提高其实用性。
1. 文件结构设计
a) 原始数据:保存在文件input1.txt中。 b) 输出数据:保存在文件output1.txt中。
2. 数据结构设计
//顺序表存储结构定义
#define MaxSize 50 //线性表的最大容量,假设为50 typedef struct Stu{ long int num;//学号 char name[20];//姓名 char sex;//性别 int age;//年龄
int score;//分数
}Elemtype;//定义数据元素为学生信息 typedef struct SqList { Elemtype *data;
int length; // 线性表长度 }SqList; // 顺序表数据类型为SqList 3. 程序结构
a) 函数说明
int Menu();//系统主菜单 int QMenu();//查询菜单
void PrintElem(Elemtype a);//打印输出数据元素a的各数据项 void Init_SqList(SqList &L);//构造一个空的顺序表L void SaveList(SqList L,FILE *out);//保存顺序表L的数据 void Creat_SqList(SqList &L,FILE *in); //建表
void Traver_SqList(SqList L); //查询(遍历顺序表L) SqList Insert_SqList (SqList &L); //添加 b) 函数实现
//基本操作的实现
int Menu()//系统主菜单 { int n; printf(\ printf(\学生信息管理系统******************\\n\\n\ printf(\导入数据\\n\ printf(\查询(全部信息、男生信息、女生信息)\\n\ printf(\添加学生信息\\n\ printf(\删除学生信息\\n\ printf(\统计人数(男生、女生、不及格、优秀等)\\n\ printf(\排序(升序、降序)\\n\ printf(\修改(修改姓名、性别、年龄、分数等属性值)\\n\ printf(\存盘\\n\ printf(\退出\\n\\n\ printf(\欢迎访问**********************\\n\ printf(\ scanf(\ return(n); }
int QMenu()//查询菜单 { int n; printf(\欢迎进入查询系统************\\t\\n\ printf(\全部信息\ printf(\男生信息\
2
《数据结构实验》指导书
printf(\女生信息\ printf(\退出\\t\ printf(\ scanf(\ return(n); }
void PrintElem(Elemtype a)
{//打印输出数据元素a的各数据项,即输出单个学生信息 printf(\ a.num,a.name,a.sex,a.age,a.score); }
void Init_SqList(SqList &L) {//构造一个空的顺序表L L.data=(Elemtype *)malloc(MaxSize*sizeof(Elemtype)); if(!L.data) exit(1); L.length=0; }
void Creat_SqList(SqList &L,FILE *in)
{//建表,从文件指针in所指文件读取数据,以尾插法建立顺序表L int i; fscanf(in,\读取数据元素个数,即表长n //printf(\表长n=%d\\n\ for(i=0;i L.data[i].name,&L.data[i].sex,&L.data[i].age,&L.data[i].score); } void Traver_SqList(SqList L) {//遍历顺序表L(输出L中的数据序列) //查询(1.全部信息 2.男生信息 3.女生信息 4.退出 ) int i,choice=QMenu(); switch(choice) { printf(\学号 姓名 性别 年龄 分数)\\n\ case 1://全部信息 for(i=0;i L.data[i].name,L.data[i].sex,L.data[i].age,L.data[i].score);*/ printf(\ 3 case 2://男生信息 for(i=0;i SqList Insert_SqList (SqList &L) {// 在顺序表L的第 i 个位置上插入(添加)一个新元素 Elemtype x; int i; printf(\请输入插入的位置(1..%d)i=\ scanf(\ if ((i<1) || ( i>L.length+1)) //检查插入位置的正确性 { printf (\插入位置i不合理!\ } //不合理,中止程序运行 if (L.length >= MaxSize) // 顺序表是否已满 { printf (\“顺序表已满,不能再插入!”\ exit(1); } // 表满,不能插入 printf(\请输入添加的元素(学号 姓名 性别 年龄 成绩)\\n x=\ scanf(\ for (int m=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 return L; //插入成功,返回 } void SaveList(SqList L,FILE *out) {//将顺序表L的数据存入文件output1.txt int i; fprintf(out,\保存表长 for(i=0;i 4 《数据结构实验》指导书 fprintf(out,\ L.data[i].num,L.data[i].name,L.data[i].sex,L.data[i].age,L.data[i].score); } c) 主函数 void main() {//通过文件input1.txt输入数据,结果输出到文件output1.txt //打开输入输出文件 FILE *in,*out; if((in=fopen(\ { printf(\ exit(0); } if((out=fopen(\ { printf(\ exit(0); } int choice; SqList L; Init_SqList(L);//系统文件初始化,构造空表L while(1) { choice=Menu(); switch(choice) { case 1: Creat_SqList(L,in); //导入数据,根据文件input.txt读入的数据建立顺序表L break; case 2: Traver_SqList(L);//查询,输出顺序表 break; case 3: Insert_SqList(L);// 在顺序表L中插入一个新元素 break; 5