实验1:顺序表
顺序表实验报告

顺序表实验报告
摘要:
一、实验背景及目的
二、实验对象与方法
三、实验结果与分析
四、实验总结与建议
正文:
一、实验背景及目的
随着科技的不断发展,顺序表在各种领域的应用越来越广泛。
为了进一步了解顺序表的性能和特点,本实验对顺序表进行了相关测试。
实验旨在通过对比分析,评估顺序表在不同条件下的表现,为后续研究与应用提供参考依据。
二、实验对象与方法
1.实验对象:某品牌顺序表产品
2.实验方法:
(1)根据实验需求,制定实验方案,明确实验步骤与评价标准;
(2)将顺序表产品置于不同环境下,如高温、低温、湿度等,观察其性能变化;
(3)通过数据记录与分析,评估顺序表在不同环境下的稳定性、可靠性和适用性。
三、实验结果与分析
1.顺序表在不同环境下的性能表现:
(1)在高温环境下,顺序表表现稳定,数据传输速率较快;
(2)在低温环境下,顺序表仍能正常工作,性能略有下降;
(3)在湿度较大的环境下,顺序表出现一定程度的性能波动,但整体表现良好。
2.分析:
(1)顺序表在不同环境下性能表现差异较小,说明产品具有较强的适应性;
(2)在湿度较大环境下,性能略有波动,可能与产品内部结构有关,需进一步优化;
(3)实验结果符合预期,顺序表产品具备较好的稳定性和可靠性。
数据结构实验报告-线性表(顺序表实现)

实验1:线性表(顺序表的实现)一、实验项目名称顺序表基本操作的实现二、实验目的掌握线性表的基本操作在顺序存储结构上的实现。
三、实验基本原理顺序表是由地址连续的的向量实现的,便于实现随机访问。
顺序表进行插入和删除运算时,平均需要移动表中大约一半的数据元素,容量难以扩充四、主要仪器设备及耗材Window 11、Dev-C++5.11五、实验步骤1.导入库和一些预定义:2.定义顺序表:3.初始化:4.插入元素:5.查询元素:6.删除元素:7.销毁顺序表:8.清空顺序表:9.顺序表长度:10.判空:11.定位满足大小关系的元素(默认小于):12.查询前驱:13.查询后继:14.输出顺序表15.归并顺序表16.写测试程序以及主函数对顺序表的每一个操作写一个测试函数,然后在主函数用while+switch-case的方式实现一个带菜单的简易测试程序,代码见“实验完整代码”。
实验完整代码:#include <bits/stdc++.h>using namespace std;#define error 0#define overflow -2#define initSize 100#define addSize 10#define compareTo <=typedef int ElemType;struct List{ElemType *elem;int len;int listsize;}L;void init(List &L){L.elem = (ElemType *) malloc(initSize * sizeof(ElemType)); if(!L.elem){cout << "分配内存失败!";exit(overflow);}L.len = 0;L.listsize = initSize;}void destroy(List &L){free(L.elem);L.len = L.listsize = 0;}void clear(List &L){L.len = 0;}bool empty(List L){if(L.len == 0) return true;else return false;}int length(List L){return L.len;}ElemType getElem(List L,int i){if(i < 1 || i > L.len + 1){cout << "下标越界!";exit(error);}return L.elem[i - 1];}bool compare(ElemType a,ElemType b) {return a compareTo b;}int locateElem(List L,ElemType e) {for(int i = 0;i < L.len;i++){if(compare(L.elem[i],e))return i;}return -1;}int check1(List L,ElemType e){int idx = -1;for(int i = 0;i < L.len;i++)if(L.elem[i] == e)idx = i;return idx;}bool check2(List L,ElemType e){int idx = -1;for(int i = L.len - 1;i >= 0;i--)if(L.elem[i] == e)idx = i;return idx;}int priorElem(List L,ElemType cur_e,ElemType pre_e[]) {int idx = check1(L,cur_e);if(idx == 0 || idx == -1){string str = "";str = idx == 0 ? "无前驱结点" : "不存在该元素";cout << str;exit(error);}int cnt = 0;for(int i = 1;i < L.len;i++){if(L.elem[i] == cur_e){pre_e[cnt ++] = L.elem[i - 1];}}return cnt;}int nextElem(List L,ElemType cur_e,ElemType next_e[]){int idx = check2(L,cur_e);if(idx == L.len - 1 || idx == - 1){string str = "";str = idx == -1 ? "不存在该元素" : "无后驱结点";cout << str;exit(error);}int cnt = 0;for(int i = 0;i < L.len - 1;i++){if(L.elem[i] == cur_e){next_e[cnt ++] = L.elem[i + 1];}}return cnt;}void insert(List &L,int i,ElemType e){if(i < 1 || i > L.len + 1){cout << "下标越界!";exit(error);}if(L.len >= L.listsize){ElemType *newbase = (ElemType *)realloc(L.elem,(L.listsize + addSize) * sizeof(ElemType));if(!newbase){cout << "内存分配失败!";exit(overflow);}L.elem = newbase;L.listsize += addSize;for(int j = L.len;j > i - 1;j--)L.elem[j] = L.elem[j - 1];L.elem[i - 1] = e;L.len ++;}void deleteList(List &L,int i,ElemType &e){if(i < 1 || i > L.len + 1){cout << "下标越界!";exit(error);}e = L.elem[i - 1];for(int j = i - 1;j < L.len;j++)L.elem[j] = L.elem[j + 1];L.len --;}void merge(List L,List L2,List &L3){L3.elem = (ElemType *)malloc((L.len + L2.len) * sizeof(ElemType)); L3.len = L.len + L2.len;L3.listsize = initSize;if(!L3.elem){cout << "内存分配异常";exit(overflow);}int i = 0,j = 0,k = 0;while(i < L.len && j < L2.len){if(L.elem[i] <= L2.elem[j])L3.elem[k ++] = L.elem[i ++];else L3.elem[k ++] = L2.elem[j ++];}while(i < L.len)L3.elem[k ++] = L.elem[i ++];while(j < L2.len)L3.elem[k ++] = L2.elem[j ++];}bool visit(List L){if(L.len == 0) return false;for(int i = 0;i < L.len;i++)cout << L.elem[i] << " ";cout << endl;return true;}void listTraverse(List L){if(!visit(L)) return;}void partion(List *L){int a[100000],b[100000],len3 = 0,len2 = 0; memset(a,0,sizeof a);memset(b,0,sizeof b);for(int i = 0;i < L->len;i++){if(L->elem[i] % 2 == 0)b[len2 ++] = L->elem[i];elsea[len3 ++] = L->elem[i];}for(int i = 0;i < len3;i++)L->elem[i] = a[i];for(int i = 0,j = len3;i < len2;i++,j++) L->elem[j] = b[i];cout << "输出顺序表:" << endl;for(int i = 0;i < L->len;i++)cout << L->elem[i] << " ";cout << endl;}//以下是测试函数------------------------------------void test1(List &list){init(list);cout << "初始化完成!" << endl;}void test2(List &list){if(list.listsize == 0)cout << "线性表不存在!" << endl;else{int len;ElemType num;cout << "选择插入的元素数量:" << endl;cin >> len;cout << "依次输入要插入的元素:" << endl;for(int i = 1;i <= len;i++){cin >> num;insert(list,i,num);}cout << "操作成功!" << endl;}}void test3(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else{cout << "请输入要返回的元素的下标" << endl;int idx;cin >> idx;cout << "线性表中第" << idx << "个元素是:" << getElem(L,idx) << endl;}}void test4(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else{int idx;ElemType num;cout << "请输入要删除的元素在线性表的位置" << endl;cin >> idx;deleteList(L,idx,num);cout << "操作成功!" << endl << "被删除的元素是:" << num << endl; }}void test5(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else{destroy(L);cout << "线性表已被销毁" << endl;}}void test6(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else{clear(L);cout << "线性表已被清空" << endl;}}void test7(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else cout << "线性表的长度现在是:" << length(L) << endl;}void test8(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else if(empty(L))cout << "线性表现在为空" << endl;else cout << "线性表现在非空" << endl;}void test9(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else{ElemType num;cout << "请输入待判定的元素:" << endl;cin >> num;cout << "第一个与目标元素满足大小关系的元素的位置:" << locateElem(L,num) << endl;}}void test10(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else{ElemType num,num2[initSize / 2];cout << "请输入参照元素:" << endl;cin >> num;int len = priorElem(L,num,num2);cout << num << "的前驱为:" << endl;for(int i = 0;i < len;i++)cout << num2[i] << " ";cout << endl;}}void test11(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else{ElemType num,num2[initSize / 2];cout << "请输入参照元素:" << endl;cin >> num;int len = nextElem(L,num,num2);cout << num << "的后继为:" << endl;for(int i = 0;i < len;i++)cout << num2[i] << " ";cout << endl;}}void test12(List list){if(L.listsize == 0)cout << "线性表不存在!" << endl;else{cout << "输出线性表所有元素:" << endl;listTraverse(list);}}void test13(){if(L.listsize == 0)cout << "初始线性表不存在!" << endl; else{List L2,L3;cout << "初始化一个新线性表" << endl;test1(L2);test2(L2);cout << "归并两个线性表" << endl;merge(L,L2,L3);cout << "归并成功!" << endl;cout << "输出合并后的线性表" << endl;listTraverse(L3);}}void test14(){partion(&L);cout << "奇偶数分区成功!" << endl;}int main(){std::ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);int op = 0;while(op != 15){cout << "-----------------menu--------------------" << 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 << "--------------11:查询后继---------------" << endl;cout << "--------------12:输出线性表-------------" << endl;cout << "--------------13:归并线性表-------------" << endl;cout << "--------------14:奇偶分区---------------" << endl;cout << "--------------15: 退出测试程序-----------" << endl;cout << "请输入指令编号:" << endl; if(!(cin >> op)){cin.clear();cin.ignore(INT_MAX,'\n');cout << "请输入整数!" << endl;continue;}switch(op){case 1:test1(L);break;case 2:test2(L);break;case 3:test3();break;case 4:test4();break;case 5:test5();break;case 6:test6();break;case 7:test7();break;case 8:test8();break;case 9:test9();break;case 10:test10();break;case 11:test11();break;case 12:test12(L);break;case 13:test13();break;case 14:test14();break;case 15:cout << "测试结束!" << endl;default:cout << "请输入正确的指令编号!" << endl;}}return 0;}六、实验数据及处理结果1.初始化:2.插入元素3.查询元素(返回的是数组下标,下标从0开始)4.删除元素(位置从1开始)5.销毁顺序表6.清空顺序表7.顺序表长度(销毁或清空操作前)8.判空(销毁或清空操作前)9.定位满足大小关系的元素(销毁或清空操作前)说明:这里默认找第一个小于目标元素的位置且下标从0开始,当前顺序表的数据为:1 4 2 510.前驱(销毁或清空操作前)11.后继(销毁或清空操作前)12.输出顺序表(销毁或清空操作前)13.归并顺序表(销毁或清空操作前)七、思考讨论题或体会或对改进实验的建议通过本次实验,我掌握了定义线性表的顺序存储类型,加深了对顺序存储结构的理解,进一步巩固和理解了顺序表的基本操作,如建立、查找、插入和删除等。
实验1顺序表和链表基本操作(学生)

实验一线性表运算的实现班级学号姓名一、实验预备知识1.复习C中函数的相关内容。
2.复习如何用主函数将多个函数连在一起构成一个C完整程序。
3.复习多文件结构。
二、实验目的1.掌握线性表的顺序和链式存储结构2.熟练运用线性表在顺序存储方式下的初始化、创建、输出、插入和删除运算3.熟练运用线性表在链式存储方式下的创建、输出、插入和删除运算三、实验要求1.编写初始化并创建线性表和输出线性表的算法。
2.编写对线性表插入和删除运算算法,要判断位置的合法性和溢出问题。
3.编写有序表的插入和删除运算算法。
4.编写一个主函数,将上面函数连在一起,构成一个完整的程序。
5.将实验源程序调试并运行,写出输入、输出结果,并对结果进行分析。
四、实验内容顺序表实验内容:1.给定的线性表为L=(12,25,7,42,19,38),元素由键盘输入。
2.初始化并建立顺序表。
(开辟的存储空间大小为8)3.编写顺序表输出算法。
4.依次插入3,21,15三个数,分别插入在第4,6和2位置,每插入一次都要输出一次顺序表。
5.删除第5,第3和第12个位置上的元素,每删除一个元素都要输出一次顺序表。
6.编写一个排序算法,对线性表中元素从小到大排列。
7.向有序表分别插入20和50,插入后表仍然有序。
(修改开辟的存储空间大小为15)单链表实验内容:1.给定的线性表为L=(12,25,7,42,19,38),元素由键盘输入。
2.建立一个带表头结点的单链表(前插入法和尾插入法都可以)。
3.编写单链表输出算法。
4.依次插入3,21,15三个数,分别插入在第4,6和12位置,每插入一次都要输出一次单链表。
5.删除第5,第3和第12个位置上的元素,每删除一个元素都要输出一次单链表。
6.编写一个排序算法,对线性表中元素从小到大排列。
7.分别删除值为25和42的元素,删除后表仍然有序。
五、实验结果给出程序清单及输入/输出结果六、总结1.实验过程中遇到的问题及解决方法2.收获北华航天工业学院《数据结构》课程实验报告实验题目:作者所在系部:作者所在专业:作者所在班级:作者学号:作者姓名:任课教师姓名:完成时间:北华航天工业学院教务处制一、实验目的1 掌握线性表的顺序和链式存储结构;2 熟练运用线性表在顺序存储方式下的初始化、创建、输出、插入和删除运算;3 熟练运用线性表在链式存储方式下的创建、输出、插入和删除运算。
顺序表实验报告

实验一顺序表的基本操作及其应用一、需求分析1.本演示程序实现顺序表的初始化,依次从键盘读入数据,建立顺序表、表中元素的连续追加、求顺序表的长度、检查顺序表是否为空、检查顺序表是否为满、显示顺序表、从顺序表中查找元素、给定元素值找位置、向顺序表中插入元素、从顺序表中删除元素、顺序表的逆序排列等基本操作。
2.演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令。
3.程序执行命令包过1)顺序表的初始化;2)连续追加元素建表;3)求顺序表长度;4)检查顺序表是否为空;5)检查顺序表是否为满;6)显示顺序表;7)从顺序表中查找元素;8)给定元素值找位置;9)向顺序表中插入元素;10)从顺序表中删除元素;11)逆序二、概要设计抽象化数据类型线性表的定义如下:ADT List{数据对象:D={ai|ai属于ElemSet,i=1,2,....,n,n>=0}数据关系:R1={<ai-1,ai>|ai-1,ai属于D,i=2,.....n}基本操作:ListEmpty(L)初始条件:线性表L已存在。
操作结果:若L为空表,则返回TURE,否则返回FLASE。
ListLength(L)初始条件:线性表L已存在。
操作结果:返回L中数据元素个数。
ListInsert(&L,i,e)初始条件:线性表L已存在,1<=i<=ListLength(L)+1。
操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1。
ListDelete(&L,i,&e)初始条件:线性表L已存在且非空,1<=i<=ListLength(L)。
操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减一。
ListTraverse(L,visit())初始条件:线性表L已存在。
操作结果:依次对L的每个数据元素调用函数visit()。
数据结构实验一顺序表

数据结构实验一1、实验目的∙掌握线性表的逻辑特征∙掌握线性表顺序存储结构的特点,熟练掌握顺序表的基本运算2、实验内容:建立顺序表,完成顺序表的基本操作:初始化、插入、删除、逆转、输出、销毁, 置空表、求表长、查找元素、判线性表是否为空;1.问题描述:利用顺序表,设计一组输入数据(假定为一组整数),能够对顺序表进行如下操作:∙创建一个新的顺序表,实现动态空间分配的初始化;∙根据顺序表结点的位置插入一个新结点(位置插入),也可以根据给定的值进行插入(值插入),形成有序顺序表;∙根据顺序表结点的位置删除一个结点(位置删除),也可以根据给定的值删除对应的第一个结点,或者删除指定值的所有结点(值删除);∙利用最少的空间实现顺序表元素的逆转;∙实现顺序表的各个元素的输出;∙彻底销毁顺序线性表,回收所分配的空间;∙对顺序线性表的所有元素删除,置为空表;∙返回其数据元素个数;∙按序号查找,根据顺序表的特点,可以随机存取,直接可以定位于第i 个结点,查找该元素的值,对查找结果进行返回;∙按值查找,根据给定数据元素的值,只能顺序比较,查找该元素的位置,对查找结果进行返回;∙判断顺序表中是否有元素存在,对判断结果进行返回;.编写主程序,实现对各不同的算法调用。
2.实现要求:∙“初始化算法”的操作结果:构造一个空的顺序线性表。
对顺序表的空间进行动态管理,实现动态分配、回收和增加存储空间;∙“位置插入算法”的初始条件:顺序线性表L 已存在,给定的元素位置为i,且1≤i≤ListLength(L)+1 ;操作结果:在L 中第i 个位置之前插入新的数据元素e,L 的长度加1;∙“位置删除算法”的初始条件:顺序线性表L 已存在,1≤i≤ListLength(L) ;操作结果:删除L 的第i 个数据元素,并用e 返回其值,L 的长度减1 ;∙“逆转算法”的初始条件:顺序线性表L 已存在;操作结果:依次对L 的每个数据元素进行交换,为了使用最少的额外空间,对顺序表的元素进行交换;∙“输出算法”的初始条件:顺序线性表L 已存在;操作结果:依次对L 的每个数据元素进行输出;∙“销毁算法”初始条件:顺序线性表L 已存在;操作结果:销毁顺序线性表L;∙“置空表算法”初始条件:顺序线性表L 已存在;操作结果:将L 重置为空表;∙“求表长算法”初始条件:顺序线性表L 已存在;操作结果:返回L 中数据元素个数;∙“按序号查找算法”初始条件:顺序线性表L 已存在,元素位置为i,且1≤i≤ListLength(L)操作结果:返回L 中第i 个数据元素的值∙“按值查找算法”初始条件:顺序线性表L 已存在,元素值为e;操作结果:返回L 中数据元素值为e 的元素位置;∙“判表空算法”初始条件:顺序线性表L 已存在;操作结果:若L 为空表,则返回TRUE,否则返回FALSE;分析: 修改输入数据,预期输出并验证输出的结果,加深对有关算法的理解。
实验报告1-顺序表操作

《数据结构》实验报告实验名称:顺序表的操作专业:计算机科学与技术班级:本1103学号:201108111122 姓名:秦文杰提交日期:2012.10.8一、实验目的熟练掌握线性表的类型定义方法、顺序存储方法及其基本运算(元素的插入、删除等)的实现方法,培养综合运用所学知识,根据具体问题进行数据结构设计和算法设计的能力。
二、实验要求1.在问题分析的基础上选择顺序存储结构,进行算法设计,编制程序并上机调试成功。
2.按要求完成实验报告3.保存和打印出程序的运行结果,并结合程序进行分析。
三、实验内容设计实现一个顺序表操作的综合应用程序。
要求:实现顺序表的构造、插入、删除、显示以及查找功能。
(基本要求)四、实验设计及测试结果1.数据结构typedef struct {int *elem;int length;int listsize;}SqList;2.函数调用层次结构图1 函数调用层次结构3.函数功能说明Createlist函数:创建一个顺序表;Printlist函数:输出顺序表;listinsert函数:在顺序表的第i个元素之前插入一个元素;listdelete函数:在顺序表中删除第i个元素;locatelem函数:在顺序表中查找与e等值的元素;4. 测试结果与分析上述程序在Visual C++ 6.0环境下加以实现。
经过多次测试,程序运行正确。
运行结果如图2所示。
图2 运行结果五、收获与体会通过这次课程设计:a)我进一步巩固了C语言的基础,尤其是编写C语言的结构及算法转化程序的方法。
b)做实验达到了理论与实践结合的目的,提高了自己的编程能力,c)程序由算法和数据结构组成,一个好的程序不仅算法重要,数据结构的设计也很重要。
d)程序不够简洁,还有待改进,功能还有待更完善,下一步需要改进程序为菜单形式!六、源程序#include <iostream.h>#include <malloc.h>//如需要用到其它头文件请加入。
数据结构实验报告顺序表1

数据结构实验报告顺序表1一、实验目的本次实验的主要目的是深入理解和掌握顺序表这种数据结构的基本概念、存储方式和操作方法,并通过实际编程实现,提高对数据结构的实际应用能力和编程技能。
二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。
三、顺序表的基本概念顺序表是用一组地址连续的存储单元依次存储线性表中的数据元素。
在顺序表中,逻辑上相邻的元素在物理位置上也相邻。
顺序表可以随机访问表中的任意元素,但插入和删除操作可能需要移动大量元素,效率较低。
四、顺序表的存储结构在 C++中,可以使用数组来实现顺序表。
以下是一个简单的顺序表存储结构的定义:```cppconst int MAX_SIZE = 100; //定义顺序表的最大容量class SeqList {private:int dataMAX_SIZE; //存储数据元素的数组int length; //顺序表的当前长度public:SeqList(){ length = 0; }//构造函数,初始化长度为 0//其他操作函数的声明int GetLength();bool IsEmpty();bool IsFull();int GetElement(int position);int LocateElement(int element);void InsertElement(int position, int element);void DeleteElement(int position);void PrintList();};```五、顺序表的基本操作实现1、获取顺序表长度```cppint SeqList::GetLength(){return length;}```2、判断顺序表是否为空```cppbool SeqList::IsEmpty(){return length == 0;}```3、判断顺序表是否已满```cppbool SeqList::IsFull(){return length == MAX_SIZE;}```4、获取指定位置的元素```cppint SeqList::GetElement(int position) {if (position < 1 || position > length) {std::cout <<"位置错误!"<< std::endl; return -1;}return dataposition 1;}```5、查找指定元素在顺序表中的位置```cppint SeqList::LocateElement(int element) {for (int i = 0; i < length; i++){if (datai == element) {return i + 1;}}return -1; //未找到返回-1}```6、在指定位置插入元素```cppvoid SeqList::InsertElement(int position, int element) {if (IsFull()){std::cout <<"顺序表已满,无法插入!"<< std::endl; return;}if (position < 1 || position > length + 1) {std::cout <<"位置错误!"<< std::endl;return;}for (int i = length; i >= position; i) {datai = datai 1;}dataposition 1 = element;length++;}```7、删除指定位置的元素```cppvoid SeqList::DeleteElement(int position) {if (IsEmpty()){std::cout <<"顺序表为空,无法删除!"<< std::endl; return;}if (position < 1 || position > length) {std::cout <<"位置错误!"<< std::endl;return;}for (int i = position; i < length; i++){datai 1 = datai;}length;}```8、打印顺序表中的所有元素```cppvoid SeqList::PrintList(){for (int i = 0; i < length; i++){std::cout << datai <<"";}std::cout << std::endl;}```六、实验结果与分析1、对顺序表进行初始化,创建一个空的顺序表。
学生信息管理系统(顺序表)实验1

数据结构课程设计设计题目: 学生信息管理系统(顺序)姓名及学号:专业班级:09计算机科学与技术指导教师:完成时间:信息工程学院计算机科学系安徽新华学院课程设计成绩评定表(本科)目录一、实验目的 (1)二、实验内容 (1)三、基本要求 (1)四、算法设计思想 (1)五、算法流程图 (1)六、算法源代码 (6)七、运行结果 (22)八、收获和体会 (25)九、致谢 (25)1。
实验目的:通过制作学生信息管理系统(1)基本掌握面向过程程序设计的的基本思路和方法;(2)达到熟练掌握C语言的基本知识和技能;(3)能够利用所学的基本知识和技能,解决简单的程序设计问题。
2.实验内容:输入一个班学生的学号,姓名,性别,成绩。
编程插入学生信息,设计查找每个学生的信息,删除学生信息,输出学生信息,修改学生信息,报表和显示学生信息,及退出学生信息管理系统。
3.基本要求:(1)硬件:微机,打印机各一台(2)软件:Visual C++,windows74。
算法设计思想(1)。
分析程序的功能要求,划分程序功能模块.(2). 画出系统流程图。
(3)。
代码的编写。
定义数据结构和各个功能子函数。
(4)。
程序的功能调试。
5。
算法的流程图6。
算法源代码:#include<stdio.h〉#include〈stdlib.h〉#include〈string。
h>#define OK 1#define ERROR 0#define OVERFLOW —2#define MAXSIZE 10#define List_INIT_SPACE 10 #define List_INC_SPACE 1 typedef struct{char number[15];char name[10];char sex[10];int score;}Elemtype;typedef struct{Elemtype *elem;int length;int listsize;}sqlist;/*1创建空顺序表并初始化*/void creatList(sqlist *L){int i=0,n;Elemtype *newbase;L-〉elem=(Elemtype*)malloc(List_INIT_SPACE*(sizeof(Elemtype)));if(!L-〉elem)exit(OVERFLOW);L—〉length=0;L->listsize=List_INIT_SPACE;printf("有几位同学:\n");scanf(”%d”,&n);for(i=0;i<n;i++){if(L-〉length==L->listsize){newbase=(Elemtype*)realloc(L—〉elem,(List_INIT_SPACE+List_INC_SPACE)*sizeof(Elemtype));if(newbase){L—〉elem=newbase;L—〉listsize+=List_INC_SPACE;}else exit(OVERFLOW);}printf(”请输入第%d名同学的信息:\n”,i+1);printf("学号(15)\n");scanf("%16s",L—>elem[L->length].number);printf("姓名(15)\n");scanf(”%16s”,L-〉elem[L->length]。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》实验报告实验一实现顺序表的基本运算一、实验目的1.实现顺序表的基本运算。
2.熟悉C++上机环境,进一步掌握C语言的结构特点。
3.掌握线性表的基本结构和操作方法,培养学生灵活使用表解决实际问题的能力。
二、实验内容用线性表来管理一个商品库存表。
商品库存表已经保存在文本文件c:\goods.dat文件中,每个商品记录包含有4项内容:商品代号、商品名称、最低库存量和当前库存量。
商品库存中的具体内容如教材P63中表2-3所示。
三、程序设计1.Main.cpp#include <iostream.h>#include <stdlib.h>#include <iomanip.h>#include <string.h>#include <fstream.h>#include "list.h"void main(){List L2;InitList(L2);SetupGoodsList(L2,"a:good.dat");int i,flag;while(flag){cout<<"1 打印整个库存表"<<endl;cout<<"2 修改库存表中的记录"<<endl;cout<<"3 删除库存表中的记录"<<endl;cout<<"4 对库存表排序"<<endl;cout<<"5 结束处理过程"<<endl;cout<<"输入你的选择:";cin>>i;while(i<1 || i>5){cout<<"请输入选择(1-5):";cin>>i;}cout<<endl;switch(i){case 1: //打印TraverseList(L2);break;case 2: //修改goods g;int x;cout<<"输入待修改的商品代号:";cin>>g.code;if(FindList(L2,g)){cout<<"输入该商品的修正量";cin>>x;g.curq+=x;if(UpdateList(L2,g))cout<<"完成更新!"<<endl;}else{cout<<"输入新商品记录的其余字段的内容:"<<endl;cin>>>>g.minq>>g.curq;InsertList(L2,g,LenthList(L2)+1);cout<<"新纪录已被插入到表尾"<<endl;}break;case 3: //删除cout<<"输入待删除商品的商品代号:";cin>>g.code;if(DeleteList(L2,g,0))cout<<"代号为"<<g.code<<"的记录被删除!"<<endl;else cout<<"代号为"<<g.code<<"的记录不存在!"<<endl;break;case 4: //排序SortList(L2);cout<<"商品表中的记录已按商品代号排序!"<<endl;break;case 5: //结束cout<<"本次处理结束,再见!"<<endl;flag=0;}}WriteGoodsFile("a:goods.dat",L2); //把线性表写回文件}2.List.h#ifndef _LIST_H#define _LIST_Hstruct goods //记录类型{char code[5]; //商品代号char name[15]; //商品名称int minq; //最低库存量int curq; //当前库存量};typedef goods ElemType;struct List{ElemType *list;int size;int MaxSize;};bool operator ==(const ElemType &e1,const ElemType &e2); bool operator <(const ElemType &e1,const ElemType &e2); ostream& operator <<(ostream &ostr,const ElemType &x); void InitList(List &L);void ClearList(List &L);int LenthList(List &L);bool EmptyList(List &L);ElemType GetList(List &L,int pos);void TraverseList(List &L);bool FindList(List &L,ElemType &item);bool UpdateList(List &L,const ElemType &item);bool InsertList(List &L,ElemType item,int pos);bool DeleteList(List &L,ElemType &item,int pos);void SortList(List &L);void SetupGoodsList(List &L,char *fname);void WriteGoodsFile(char *fname,List &L);#endif3.各个自定义函数#include <iostream.h>#include <stdlib.h>#include <string.h>#include <iomanip.h>#include <fstream.h>#include "list.h"bool operator ==(const ElemType &e1,const ElemType &e2){return (strcmp(e1.code,e2.code)==0);}bool operator <(const ElemType &e1,const ElemType &e2){return (strcmp(e1.code,e2.code)==-1);}ostream& operator <<(ostream &ostr,const ElemType &x){ostr.setf(ios::left); //设置每个区域内按左对齐显示ostr<<setw(6)<<x.code<<setw(12)<<;ostr<<setw(4)<<x.minq<<setw(4)<<x.curq<<endl;return ostr;}void InitList(List &L,int Max){//初始定义数组长度为10,以后可增减,或者附加一个形参给定初始数组长度L.MaxSize=10;//动态分配存储空间L.list=new ElemType[L.MaxSize];if(L.list==NULL){cout<<"动态分配的存储空间用完,退出运行!"<<endl;exit(1);}//置线性表的长度为0,即为空表L.size=0;}void ClearList(List &L){if(L.list!=NULL){delete []L.list;L.list=NULL;}L.MaxSize=0;L.size=0;}int LenthList(List &L){return L.size;}bool EmptyList(List &L){return L.size==0;}ElemType GetList(List &L,int pos){if(pos<1||pos>L.size){cout<<"pos is out range!"<<endl;exit(1);}return L.list[pos-1];}void TraverseList(List &L){for(int i=0;i<L.size;i++)cout<<L.list[i]<<" ";cout<<endl;}bool FindList(List &L,ElemType &item){for(int i=0;i<L.size;i++)if(L.list[i]==item){item=L.list[i];return true;}return false;}bool UpdateList(List &L,const ElemType &item){for(int i=0;i<L.size;i++)if(L.list[i]==item){L.list[i]=item; //更新赋值操作return true;}}bool InsertList(List &L,ElemType item,int pos){//检查pos是否有效,无效则无法插入,返回假if(pos<-1 || pos>L.size+1){cout<<"pos值无效!"<<endl;return false;}//求出按值有序插入时item的位置,使之保存到pos中int i;if(pos==0){for(i=0;i<L.size;i++)if(item<L.list[i]) break;pos=i+1; //pos中保存新插入的元素的序号,比元素下角标大1 }//得到表尾插入位置,被保存在pos中else if(pos==-1)pos=L.size+1;//若线性表存储空间用完,则重新分配大一倍的存储空间if(L.size==L.MaxSize){int k=sizeof(ElemType);L.list=(ElemType*)realloc(L.list,2*L.MaxSize*k);if(L.list==NULL){cout<<"动态可分派存储空间用完,退出运行!"<<endl;exit(1);}L.MaxSize=2*L.MaxSize; //线性表空间大小修改为新的长度}//待插入位置及所有后续位置元素,从后向前依次后移一个位置for(i=L.size-1;i>=pos-1;i--){L.list[i+1]=L.list[i];}//把item的值赋给已经空出的,下标为pos-1的位置,他是第平pos 个元素位置L.list[pos-1]=item;//线性表长度加1L.size++;//返回真,表示插入成功return true;}bool DeleteList(List &L,ElemType &item,int pos){//检查线性表是否为空,若是,则无法删除,返回假if(L.size==0){cout<<"线性表为空,删除无效"<<endl;return false;}//检查pos是否有效,无效则无法删除,返回假int i;if(pos==0){for(i=0;i<L.size;i++)if(item==L.list[i])break;if(i==L.size)return false; //无元素可删除pos=i+1;}//得到表尾元素的序号,被保存在pos中else if(pos==-1)pos=L.size;//把被删除元素的值付给iteam带回}void SortList(List &L){int i,j;ElemType x;for(i=1; i<L.size; i++){x=L.list[i];for(j=i-1; j>=0; j--)if(x<L.list[j])L.list[j+1]=L.list[j];else break;L.list[j+1]=x;}}void SetupGoodsList(List &L,char *fname){ //把文件中所存商品表顺序读入内存线性表中以便处理ifstream ifstr(fname,ios::in|ios::nocreate);if(!ifstr) {cerr<<"File 'goods'not found!"<<endl;exit(1);}goods g;int i=1;while(ifstr>>g.code) {ifstr>>>>g.minq>>g.curq;InsertList(L,g,i++);}ifstr.close();}void WriteGoodsFile(char *fname,List &L){ ofstream ofstr(fname);if(!ofstr) {cerr<<"File 'goods' no create!"<<endl;exit(1);}goods g;int n=LenthList(L);for(int i=1; i<=n; i++){g=GetList(L,i);ofstr<<g.code<<" "<<<<" "<<g.minq<<" "<<g.curq<<endl;}ofstr.close();}五、测试结果程序不能完全正确运行。