福师大计算机系数据结构实验二.docx

上传人:b****5 文档编号:6843122 上传时间:2023-01-11 格式:DOCX 页数:19 大小:125.08KB
下载 相关 举报
福师大计算机系数据结构实验二.docx_第1页
第1页 / 共19页
福师大计算机系数据结构实验二.docx_第2页
第2页 / 共19页
福师大计算机系数据结构实验二.docx_第3页
第3页 / 共19页
福师大计算机系数据结构实验二.docx_第4页
第4页 / 共19页
福师大计算机系数据结构实验二.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

福师大计算机系数据结构实验二.docx

《福师大计算机系数据结构实验二.docx》由会员分享,可在线阅读,更多相关《福师大计算机系数据结构实验二.docx(19页珍藏版)》请在冰豆网上搜索。

福师大计算机系数据结构实验二.docx

福师大计算机系数据结构实验二

实验报告

(二):

线性表

科目:

数据结构与算法实验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;k

q=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;k

p=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;k

GetElem(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;k

if(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(

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

当前位置:首页 > 小学教育 > 数学

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

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