1、福师大计算机系数据结构实验二实验报告(二):线性表科目:数据结构与算法实验1 专业: 计算机科学与技术 班级: 计本 班 姓名: 学号: 日期: 2012-10-11 1 实验目的1) 掌握程序设计的基本方法,要求能够利用C/C+语言实现简单的算法设计。2) 熟悉掌握线性表的基本运算在顺序存储结构和链式存储结构上的实现。3) 掌握顺序表以及链表基本操作及其代码实现。4) 能使用线性表来解决实际中遇到的问题。5) 理解数据结构与数据结构应用之间的关系。2 实验内容1) 设计和实现线性表的数据结构、操作,并加以实现。2) 利用(1)中实现的线性表存储学生及成绩信息。3) 利用线性表的基本操作,实现
2、学生成绩的插入、保存、查找、删除等操作。4) 利用文件实现学生信息的保存、读取。3 实验要求1) 提前预习该实验相关的内容,包括线性表的定义、线性表的两种实现方法、线性表操作的实现。2) 选择一种线性表的存储结构(顺序存储、链式存储结构),实现该结构及操作。3) 利用实现的线性表存储学生学号及成绩信息列表,并利用线性表的基本操作实现对学生成绩的各类操作。4) 编写完整的程序,并上机调试和运行。5) 整理并上交实验报告。6) 本次实验要求在4学时内完成。4 数据结构设计4.1 链表结构设计 (采取单链表的结构)类图的设计: 4.2 基本操作所要实现的基本操作:1) 学生信息的保存、读取。2) 学
3、生成绩的插入、保存、查找、删除等。5 实现5.1 设计实现/以头文件public.h声明程序参数#pragma once#pragma region 声明#include#include#include#include using namespace std;#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;#pragma endregion/以头文件LinkList.h定义链表结构#pragma once#incl
4、ude public.h#pragma region 定义#pragma region 数据节点的定义template struct LinkNode ELEMENT_TYPE data; struct LinkNode *next;#pragma endregion#pragma region 线性表头结点的定义template struct LinkList LinkNode* head; int length;#pragma endregion#pragma endregion/以头文件DefinitionForStudent.h定义学生结点结构#pragma once#include
5、./LinkList/LinkList.h#pragma region 定义#pragma region 学生结构体定义 typedef struct StudentNode_type long no; /学号 char name21; /姓名 char sex; /性别;0表示女生;1 表示男生; char Dormitory9;/宿舍 long phone; /联系方式 long QQ; /QQ float score; /成绩StudentNode;#pragma endregiontypedef LinkNode s2;typedef LinkList student;char Fil
6、eName = stu.dat;#pragma endregion5.2 操作实现5.2.1 线性链表的操作/LinkList.h#pragma once#include public.h#pragma region 操作#pragma region 插入template Status ListInsert( LinkList & L,int i,ELEMENT_TYPE e) if ( i L.length + 1 | i 0 ) return FALSE; LinkNode* p; p = new LinkNode; if ( p = NULL ) return FALSE; p-next
7、 = NULL; p-data = e; if ( i = 1 ) p-next = L.head; L.head = p; else LinkNode* q = L.head; for ( int k = 1;k next; p-next = q-next; q-next = p; L.length+; return OK; /ListInserttemplate Status InsertFirst( LinkList &L,ELEMENT_TYPE e) return ListInsert(L,1,e);/InsFirsttemplate Status InsertLast( LinkL
8、ist &L,ELEMENT_TYPE e) return ListInsert(L,L.length+1,e);/InsertLast#pragma endregion#pragma region 删除template Status ListDelete(LinkList &L,int i,ELEMENT_TYPE &e) if ( i L.length ) return ERROR; if ( i = 1 ) LinkNode* p; p = L.head; L.head = p-next; e = p-data; else LinkNode* p = L.head; for ( int
9、k = 0;k next; LinkNode* q = p-next; p-next = q-next; delete q; return OK;/ListDelete#pragma endregion#pragma region 查找与待处理元素相等的节点位置,不存在返回0template Status LocateElem(LinkList &L,ELEMENT_TYPE e,bool (*compare(ELEMENT_TYPE,ELEMENT_TYPE) LinkNode* p = L.head; int k = 1; while( p != NULL) if (*compare)(p
10、-data,e) return k; else k+; p = p-next; return 0; #pragma endregion#pragma region 查找templateStatus GetElem(LinkList &L,int i,ELEMENT_TYPE &e) if ( i L.length ) return ERROR; LinkNode* p = L.head; for (int k = 1;k next; e = p-data; return OK;#pragma endregion#pragma region 修改templateStatus ListModify
11、(LinkList &L,int i,ELEMENT_TYPE e1,ELEMENT_TYPE e2) ListDelete(L,i,e1); ListInsert(L,i,e2); return OK;#pragma endregion#pragma region 线性表的初始化操作template Status InitList( LinkList & L ) L.head = NULL; L.length = 0; return OK;/InitList#pragma endregion#pragma region 线性表的释放、清空 template Status ClearList(
12、LinkList &L) LinkNode* p = L.head; while ( p != NULL) L.head = p-next; delete p; p = L.head; return OK;/ClearList #pragma endregion #pragma region 获取长度templateStatus ListLength(LinkList &L) return L.length;#pragma endregion#pragma endregion5.2.2 学生结点的操作/DefinitionForStudent.h #pragma once#include ./
13、LinkList/LinkList.htypedef LinkNode s2;typedef LinkList student;char FileName = stu.dat;#pragma endregion#pragma region 操作#pragma region 输入学生Status InputStudent( student stu,StudentNode & s ) cins.nos.names.sexs.Dormitorys.phones.QQs.score; InsertFirst(stu,s); return OK;#pragma endregion#pragma regi
14、on 把学生保存到文件Status SaveToFile( LinkList & L) StudentNode s; FILE *file; fopen_s(&file,FileName,w); if (file = NULL) coutCant open file.endl; return ERROR; fwrite(&L.length,sizeof(int),1,file); for ( int k = 0;k L.length;k+ ) GetElem( L,k+1,s); if(fwrite(&s,sizeof(struct StudentNode_type),1,file) != 1
15、) coutFile write error!endl; fclose(file); fclose(file); return OK;#pragma endregion#pragma region 从文件中读取学生Status ReadFromFile( LinkList & L) StudentNode s; FILE *file; fopen_s(&file,FileName,r); if (file = NULL) coutCannot open file.endl; return ERROR; int length; fread(&length,sizeof(int),1,file);
16、 for ( int k = 0;k length;k+ ) if(fread(&s,sizeof(struct StudentNode_type),1,file) != 1) if ( feof(file) ) fclose(file); return OK; coutFile read error!endl; return ERROR; ListInsert( L,k+1,s ); fclose(file); return OK;#pragma endregion#pragma region 获取某一学生信息Status GetStudent( LinkList & L,int k,Stu
17、dentNode &s) GetElem( L,k,s); return OK;#pragma endregion#pragma region 显示学生信息Status display(LinkList & L,StudentNode &s) int k; cink; if ( GetStudent(L,k,s) = ERROR ) cout学生人数应大于 0 小于 ListLength(L) 。endlendl; return ERROR; cout学号:s.no ;姓名:s.name ;性别:s.sex ;宿舍:s.Dormitory ;联系方式:s.phone ;QQ:s.QQ ;成绩:
18、s.scoreendl; return OK;#pragma endregion#pragma region 学生的初始化操作Status CreateStudent( student & s) InitList(s); return OK;/CreateStudent#pragma endregion#pragma region 判断是否为同一学生bool compare(const StudentNode & s1,const StudentNode & s2) return (s1.no = s2.no)&(strcmp(s1.name,s2.name) ? TRUE:FALSE;/co
19、mpare#pragma endregion#pragma region 删除某一学生信息Status DeleteStudent( LinkList & L,StudentNode &s) int k; cink; if ( ListDelete( L,k,s) = ERROR ) cout学生人数应大于 0 且小于等于 ListLength(L) 。endlendl; return ERROR; return OK;#pragma endregion#pragma region 清除所有Status ClearAll( LinkList & L) ClearList(L); return
20、OK;#pragma endregion5.2.3 程序实现的操作/以头文件design.h定义程序实现操作#pragma once#include DefinitionForStudent.hStatus Title() cout实验报告二学生信息管理线性链表实现 版本1.0.1.1endl 版权所有 (c) 2012 Corporation。保留所有权利。endlendl; return OK;Status HelpMenu() cout有关某个命令的详细信息,请键入 help 命令名endl input 输入学生的信息endl get 获取一个学生信息endl print 打印学生信息e
21、ndl save 保存到文件endl read 从文件读取endl delete 删除一个学生endl clear 删除所有endl exit 退出endlendl 有关命令的详细信息,请参阅帮助文档。endlendl; return OK;Status HelpInput() cout输入学生的信息。endlendl input no name sex Dormitory phone QQ scoreendlendl no 学号(long int 型)。endl name 姓名(char21 型)。endl sex 性别(char 型,0表示女生;1 表示男生)。endl Dormitory
22、 宿舍(char9 型)。endl phone 联系电话(long int 型)。endl QQ QQ号(long int 型)。endl score 分数成绩(float 型)。endlendl 输入参数之间请用空格或换行隔开.endl Please input separated with blank space .endlendl; return OK;Status HelpGet() return OK;Status HelpPrint() return OK;Status HelpSave() return OK;Status HelpRead() return OK;Status
23、HelpDelete() cout删除一个学生。endlendl delete kendlendl k 学生链表中第 k 位置的学生。endl 输入参数之间请用换行隔开.endl Please input separated with Newline .endlendl; return OK;Status HelpExit() cout退出 TextForLinkListOfStudent.exe 程序(命令解释器)。endlendl; return OK;Status change(char command) if (strcmp(command,input)=0) return 11; e
24、lse if (strcmp(command,help input)=0|strcmp(command,input /?)=0) return 111; else if (strcmp(command,get)=0) return 12; else if (strcmp(command,help get)=0|strcmp(command,get /?)=0) return 121; else if (strcmp(command,print)=0) return 13; else if (strcmp(command,help print)=0|strcmp(command,print /?
25、)=0) return 131; else if (strcmp(command,save)=0) return 14; else if (strcmp(command,help save)=0|strcmp(command,save /?)=0) return 141; else if (strcmp(command,read)=0) return 15; else if (strcmp(command,help read)=0|strcmp(command,read /?)=0) return 151; else if (strcmp(command,delete)=0) return 16; else if (
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1