福师大计算机系数据结构实验二.docx
《福师大计算机系数据结构实验二.docx》由会员分享,可在线阅读,更多相关《福师大计算机系数据结构实验二.docx(19页珍藏版)》请在冰豆网上搜索。
福师大计算机系数据结构实验二
实验报告
(二):
线性表
科目:
数据结构与算法实验1专业:
计算机科学与技术
班级:
计本班姓名:
学号:
日期:
2012-10-11
1实验目的
1)掌握程序设计的基本方法,要求能够利用C/C++语言实现简单的算法设计。
2)熟悉掌握线性表的基本运算在顺序存储结构和链式存储结构上的实现。
3)掌握顺序表以及链表基本操作及其代码实现。
4)能使用线性表来解决实际中遇到的问题。
5)理解数据结构与数据结构应用之间的关系。
2实验内容
1)设计和实现线性表的数据结构、操作,并加以实现。
2)利用
(1)中实现的线性表存储学生及成绩信息。
3)利用线性表的基本操作,实现学生成绩的插入、保存、查找、删除等操作。
4)利用文件实现学生信息的保存、读取。
3实验要求
1)提前预习该实验相关的内容,包括线性表的定义、线性表的两种实现方法、线性表操作的实现。
2)选择一种线性表的存储结构(顺序存储、链式存储结构),实现该结构及操作。
3)利用实现的线性表存储学生学号及成绩信息列表,并利用线性表的基本操作实现对学生成绩的各类操作。
4)编写完整的程序,并上机调试和运行。
5)整理并上交实验报告。
6)本次实验要求在4学时内完成。
4数据结构设计
4.1链表结构设计(采取单链表的结构)
类图的设计:
4.2基本操作
所要实现的基本操作:
1)学生信息的保存、读取。
2)学生成绩的插入、保存、查找、删除等。
5实现
5.1设计实现
//以头文件"public.h"声明程序参数
#pragmaonce
#pragmaregion声明
#include
#include
#include
#include
usingnamespacestd;
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
typedefintStatus;
#pragmaendregion
//以头文件"LinkList.h"定义链表结构
#pragmaonce
#include"public.h"
#pragmaregion定义
#pragmaregion数据节点的定义
template
structLinkNode{
ELEMENT_TYPEdata;
structLinkNode*next;
};
#pragmaendregion
#pragmaregion线性表头结点的定义
template
structLinkList{
LinkNode*head;
intlength;
};
#pragmaendregion
#pragmaendregion
//以头文件"DefinitionForStudent.h"定义学生结点结构
#pragmaonce
#include"../LinkList/LinkList.h"
#pragmaregion定义
#pragmaregion学生结构体定义
typedefstructStudentNode_type{
longno;//学号
charname[21];//姓名
charsex;//性别;0表示女生;1表示男生;
charDormitory[9];//宿舍
longphone;//联系方式
longQQ;//QQ
floatscore;//成绩
}StudentNode;
#pragmaendregion
typedefLinkNodes2;
typedefLinkListstudent;
charFileName[]="stu.dat";
#pragmaendregion
5.2操作实现
5.2.1线性链表的操作
//"LinkList.h"
#pragmaonce
#include"public.h"
#pragmaregion操作
#pragmaregion插入
template
StatusListInsert(LinkList&L,inti,ELEMENT_TYPEe){
if(i>L.length+1||i<0){
returnFALSE;
}
LinkNode*p;
p=newLinkNode;
if(p==NULL){
returnFALSE;
}
p->next=NULL;
p->data=e;
if(i==1){
p->next=L.head;
L.head=p;
}
else{
LinkNode*q=L.head;
for(intk=1;kq=q->next;
}
p->next=q->next;
q->next=p;
}
L.length++;
returnOK;
}//ListInsert
template
StatusInsertFirst(LinkList&L,ELEMENT_TYPEe){
returnListInsert(L,1,e);
}//InsFirst
template
StatusInsertLast(LinkList&L,ELEMENT_TYPEe){
returnListInsert(L,L.length+1,e);
}//InsertLast
#pragmaendregion
#pragmaregion删除
template
StatusListDelete(LinkList&L,inti,ELEMENT_TYPE&e){
if(i<1||i>L.length){
returnERROR;
}
if(i==1){
LinkNode*p;
p=L.head;
L.head=p->next;
e=p->data;
}
else{
LinkNode*p=L.head;
for(intk=0;kp=p->next;
}
LinkNode*q=p->next;
p->next=q->next;
deleteq;
}
returnOK;
}//ListDelete
#pragmaendregion
#pragmaregion查找与待处理元素相等的节点位置,不存在返回0
template
StatusLocateElem(LinkList&L,ELEMENT_TYPEe,bool(*compare(ELEMENT_TYPE,ELEMENT_TYPE))){
LinkNode*p=L.head;
intk=1;
while(p!
=NULL){
if((*compare)(p->data,e)){
returnk;
}
else{
k++;
p=p->next;
}
return0;
}
}
#pragmaendregion
#pragmaregion查找
template
StatusGetElem(LinkList&L,inti,ELEMENT_TYPE&e){
if(i<1||i>L.length){
returnERROR;
}
LinkNode*p=L.head;
for(intk=1;k
p=p->next;
}
e=p->data;
returnOK;
}
#pragmaendregion
#pragmaregion修改
template
StatusListModify(LinkList&L,inti,ELEMENT_TYPEe1,ELEMENT_TYPEe2){
ListDelete(L,i,e1);
ListInsert(L,i,e2);
returnOK;
}
#pragmaendregion
#pragmaregion线性表的初始化操作
template
StatusInitList(LinkList&L){
L.head=NULL;
L.length=0;
returnOK;
}//InitList
#pragmaendregion
#pragmaregion线性表的释放、清空
template
StatusClearList(LinkList&L){
LinkNode*p=L.head;
while(p!
=NULL){
L.head=p->next;
deletep;
p=L.head;
}
returnOK;
}//ClearList
#pragmaendregion
#pragmaregion获取长度
template
StatusListLength(LinkList&L){
returnL.length;
}
#pragmaendregion
#pragmaendregion
5.2.2学生结点的操作
//"DefinitionForStudent.h"
#pragmaonce
#include"../LinkList/LinkList.h"
typedefLinkNodes2;
typedefLinkListstudent;
charFileName[]="stu.dat";
#pragmaendregion
#pragmaregion操作
#pragmaregion输入学生
StatusInputStudent(studentstu,StudentNode&s){
cin>>s.no>>s.name>>s.sex>>s.Dormitory>>s.phone>>s.QQ>>s.score;
InsertFirst(stu,s);
returnOK;
}
#pragmaendregion
#pragmaregion把学生保存到文件
StatusSaveToFile(LinkList&L){
StudentNodes;
FILE*file;
fopen_s(&file,FileName,"w");
if(file==NULL){
cout<<"Can'topenfile..."<returnERROR;
}
fwrite(&L.length,sizeof(int),1,file);
for(intk=0;kGetElem(L,k+1,s);
if(fwrite(&s,sizeof(structStudentNode_type),1,file)!
=1){
cout<<"Filewriteerror!
"<}
fclose(file);
}
fclose(file);
returnOK;
}
#pragmaendregion
#pragmaregion从文件中读取学生
StatusReadFromFile(LinkList&L){
StudentNodes;
FILE*file;
fopen_s(&file,FileName,"r");
if(file==NULL){
cout<<"Cannotopenfile..."<returnERROR;
}
intlength;
fread(&length,sizeof(int),1,file);
for(intk=0;kif(fread(&s,sizeof(structStudentNode_type),1,file)!
=1){
if(feof(file)){
fclose(file);
returnOK;
}
cout<<"Filereaderror!
"<returnERROR;
}
ListInsert(L,k+1,s);
}
fclose(file);
returnOK;
}
#pragmaendregion
#pragmaregion获取某一学生信息
StatusGetStudent(LinkList&L,intk,StudentNode&s){
GetElem(L,k,s);
returnOK;
}
#pragmaendregion
#pragmaregion显示学生信息
Statusdisplay(LinkList&L,StudentNode&s){
intk;
cin>>k;
if(GetStudent(L,k,s)==ERROR){
cout<<"学生人数应大于0小于"<"<returnERROR;
}
cout<<"学号:
"<<<";姓名:
"<<<";性别:
"<<<";宿舍:
"<<<";联系方式:
"<<<";QQ:
"<<<";成绩:
"<returnOK;
}
#pragmaendregion
#pragmaregion学生的初始化操作
StatusCreateStudent(student&s){
InitList(s);
returnOK;
}//CreateStudent
#pragmaendregion
#pragmaregion判断是否为同一学生
boolcompare(constStudentNode&s1,constStudentNode&s2){
return(s1.no==s2.no)&&(strcmp(s1.name,s2.name))?
TRUE:
FALSE;
}//compare
#pragmaendregion
#pragmaregion删除某一学生信息
StatusDeleteStudent(LinkList&L,StudentNode&s){
intk;
cin>>k;
if(ListDelete(L,k,s)==ERROR){
cout<<"学生人数应大于0且小于等于"<"<returnERROR;
}
returnOK;
}
#pragmaendregion
#pragmaregion清除所有
StatusClearAll(LinkList&L){
ClearList(L);
returnOK;
}
#pragmaendregion
5.2.3程序实现的操作
//以头文件"design.h"定义程序实现操作
#pragmaonce
#include"DefinitionForStudent.h"
StatusTitle(){
cout<<"\"实验报告二\"学生信息管理线性链表实现\"[版本1.0.1.1]"<<<"版权所有(c)2012Corporation。
保留所有权利。
"<returnOK;
}
StatusHelpMenu(){
cout<<"有关某个命令的详细信息,请键入help命令名"<<<"input输入学生的信息"<<<"get获取一个学生信息"<<<"print打印学生信息"<<<"save保存到文件"<<<"read从文件读取"<<<"delete删除一个学生"<<<"clear删除所有"<<<"exit退出"<<<"有关命令的详细信息,请参阅帮助文档。
"<returnOK;
}
StatusHelpInput(){
cout<<"输入学生的信息。
"<<<"inputnonamesexDormitoryphoneQQscore"<<<"no学号(longint型)。
"<<<"name姓名(char[21]型)。
"<<<"sex性别(char型,0表示女生;1表示男生)。
"<<<"Dormitory宿舍(char[9]型)。
"<<<"phone联系电话(longint型)。
"<<<"QQQQ号(longint型)。
"<<<"score分数成绩(float型)。
"<<<"输入参数之间请用空格或换行隔开..."<<<"Pleaseinputseparatedwithblankspace..."<returnOK;
}
StatusHelpGet(){
returnOK;
}
StatusHelpPrint(){
returnOK;
}
StatusHelpSave(){
returnOK;
}
StatusHelpRead(){
returnOK;
}
StatusHelpDelete(){
cout<<"删除一个学生。
"<<<"deletek"<<<"k学生链表中第k位置的学生。
"<<<"输入参数之间请用换行隔开..."<<<"PleaseinputseparatedwithNewline..."<returnOK;
}
StatusHelpExit(){
cout<<"退出TextForLinkListOfStudent.exe程序(命令解释器)。
"<returnOK;
}
Statuschange(charcommand[]){
if(strcmp(command,"input")==0){
return11;
}
elseif(strcmp(command,"helpinput")==0||strcmp(command,"input/?
")==0){
return111;
}
elseif(strcmp(command,"get")==0){
return12;
}
elseif(strcmp(command,"helpget")==0||strcmp(command,"get/?
")==0){
return121;
}
elseif(strcmp(command,"print")==0){
return13;
}
elseif(strcmp(command,"helpprint")==0||strcmp(command,"print/?
")==0){
return131;
}
elseif(strcmp(command,"save")==0){
return14;
}
elseif(strcmp(command,"helpsave")==0||strcmp(command,"save/?
")==0){
return141;
}
elseif(strcmp(command,"read")==0){
return15;
}
elseif(strcmp(command,"helpread")==0||strcmp(command,"read/?
")==0){
return151;
}
elseif(strcmp(command,"delete")==0){
return16;
}
elseif(