线性表实验报告:针对链式或顺序存储的线性表实现指定的操作(二份)

合集下载

线性表ADT的顺序存储与链式存储实验报告

线性表ADT的顺序存储与链式存储实验报告

实验报告题目:完成线性表ADT的顺序存储和链式存储方式的实现一、需求分析1、本演示程序中,线性表的数据元素类型限定为整型2、演示程序以用户和计算机的对话方式执行,即在计算机的终端上显示“提示信息”之后由用户在键盘上键入演示程序规定的运算命令,相应的输出结果显示在后面。

3、程序的执行命令包括:创建、撤销、清空、插入、修改、删除、定位等线性表ADT各项基本操作二、概要设计为实现上述功能,我们给出线性表的抽象数据类型定义,具体的有单向链,双向链,顺序表等,同时对于上述功能的实现还采用有/无头结点两种方式来实现1.线性表的抽象数据类型定义为ADT List{数据对象:D={a i|a i∈ElemSet,i=1,2,…,n,n≥0}数据关系:R1={<a i-1,a i>|ai-1,ai∈D,i=2,…,n}基本操作:InitList(&L)操作结果:构造一个空的线性表LDestroyList(&L)初始条件:线性表L已存在。

操作结果:销毁线性表L。

ClearList(&L)初始条件:线性表L已存在。

操作结果:将L重置为空表。

ListEmpty(L)初始条件:线性表L已存在。

操作结果:若L为空表,则返回TRUE,否则返回FALSE。

ListLength(L)初始条件:线性表L已存在。

操作结果:返回L中的i个数据元素的值。

GetElem(L,i,&e)初始条件:线性表L已存在,1≤i≤ListLength(L)。

操作结果:用e返回L中第i个数据元素的值。

LocateElem(L,e,compare())初始条件:线性表L已存在,compare()是数据元素判定函数操作结果:返回L中第一个与e满足compare()的数据元素的位序。

若这样的数据元素不存在,则返回值为0.PriorElem(L,cur_e,&pre_e)初始条件:线性表已存在操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义。

线性表实验报告

线性表实验报告

线性表实验报告一、实验的目的要求1、了解线性表的逻辑结构特性,以及这种结构特性在计算机内的两种存储结构。

2、掌握线性表的顺序存储结构的定义及其C语言实现。

3、掌握线性表的链式存储结构——单链表的定义及其C语言实现。

4、掌握线性表在顺序存储结构即顺序表中的各种基本操作。

5、掌握线性表在链式存储结构——单链表中的各种基本操作。

6、认真阅读和掌握实验的程序。

7、上机运行本程序。

8、保存和打印出程序的运行结果,并结合程序进行分析。

二、实验的主要内容^题目:请编制C语言,利用链式存储方式来实现线性表的创建、插入、删除和查找等操作。

具体地说,就是要根据键盘输入的数据建立一个单链表,并输出该单链表;然后根据屏幕菜单的选择,可以进行数据的插入或删除,并在插入或删除数据后,再输出单链表;最后在屏幕菜单中选择0,即可结束程序的运行。

三、解题思路分析在链表中插入数据,不需要进行大量的数据移动,只需要找到插入点即可,可以采用后插入的算法,在插入点的后面添加结点。

在链表中删除数据,先找到删除点,然后进行指针赋值操作。

四、程序清单#include<>#include<>#include<>typedef int ElemType;typedef struct LNode{ElemType data;struct LNode *next;}LNode;LNode *L;LNode *creat_L();void out_L(LNode *L);void insert_L(LNode *L,int i,ElemType e); ElemType delete_L(LNode *L,ElemType e);int locat_L(LNode *L,ElemType e);void main(){int i,k,loc;ElemType e,x;char ch;do{printf("\n");printf("\n 1.建立单链表");printf("\n 2.插入元素");printf("\n 3.删除元素");printf("\n 4.查找元素");printf("\n 0.结束程序运行");printf("\n================================"); printf("\n 请输入您的选择(1,2,3,4,0)"); scanf("%d",&k);switch(k){case 1:{L=creat_L();out_L(L);}break;case 2:{printf("\n请输入插入位置:");scanf("%d",&i);printf("\n请输入要插入元素的值:");scanf("%d",&e);insert_L(L,i,e);out_L(L);}break;case 3:{printf("\n请输入要删除元素的位置:"); scanf("%d",&i);x=delete_L(L,i);out_L(L);if(x!=-1){printf("\n删除的元素为:%d\n",x);printf("删除%d后的单链表为:\n",x);out_L(L);}else printf("\n要删除的元素不存在!");}break;case 4:{printf("\n请输入要查找的元素值:"); scanf("%d",&e);loc=locat_L(L,e);if(loc==-1)printf("\n为找到指定元素!");else printf("\n已找到,元素位置是%d",loc); }break;}printf("\n----------------");}while(k>=1&&k<5);printf("\n 按回车键,返回...\n");ch=getchar();}LNode *creat_L(){ LNode *h,*p,*s; ElemType x;h=(LNode *)malloc(sizeof(LNode));h->next=NULL;p=h;printf("\n请输入第一个数据元素:");scanf("%d",&x);while(x!=-999){s= (LNode *)malloc(sizeof(LNode));s->data=x; s->next=NULL;p->next=s; p=s;printf("请输入下一个数据:(输入-999表示结束.)"); scanf("%d",&x);}return(h);}void out_L(LNode*L){ LNode*p;p=L->next; printf("\n\n");while(p!=NULL){printf("%5d",p->data);p=p->next;};}void insert_L(LNode*L,int i,ElemType e){ LNode *s,*p;int j;p=L;j=0;while(p!=NULL&&j<=i-1){p=p->next;j++;}if(p==NULL||i<1) printf("\n插入位置错误!");else { s=(LNode * )malloc(sizeof(LNode));s->data=e;s->next=p->next;p->next=s;}}ElemType delete_L(LNode *L,int i){ LNode *p, *q; int j; ElemType x;p=L;j=0;while(p->next!=NULL&&j<i-1){p=p->next;j++;}if(!p->next||i<1) {printf("\n删除位置错误!");return(-1);} else{ q=p->next; x=q->data;p->next=q->next; free(q);return(x);}}int locat_L(LNode *L,ElemType e){ LNode *p; int j=1;p=L->next;while(p!=NULL && p->data!=e) {p=p->next; j++;}if(p!=NULL)return(j); else return(-1);}五、》六、调试心得及收获。

线性表的操作算法实验报告

线性表的操作算法实验报告

实验报告2013学年第一学期任课老师:2、在实验过程中遇到的问题与解决方法:问题有很多,比如局部变量与全局变量的声明,常常顾此失彼,此处概念仍然不清。

填写内容时,可把表格扩大。

附:实验源程序代码顺序表(链表):// 线性表(链表)#include <stdio.h>#include "malloc.h"#include <iostream>using namespace std;typedef struct LNode{int data;struct LNode *next;}LNode,*LinkList;//创建一个长度为n的链表void CreateList(LinkList &L, int n) {L = (LinkList)malloc(sizeof(LNode));L->next = NULL;for (int i=n; i>0; --i){LinkList p = (LinkList)malloc(sizeof(LNode));cin>>p->data;p->next = L->next;L->next = p;}}// 在链表L第i个元素之前插入元素eint ListInsert(LinkList &L, int i, int e) {LinkList p=L;int j=0;while(p&&j<i-1) {p=p->next; ++j;}if(!p ||j>i-1) return 0;LinkList s = (LinkList)malloc(sizeof(LNode)); s->data=e;s->next=p->next;p->next=s;return 1;}// 在链表L中删除第i个元素,并由e返回其值int ListDelete(LinkList &L, int i, int &e) { LinkList p=L;int j=0;while(p->next&&j<i-1) {p=p->next; ++j;}if(!(p->next)||j>i-1) return 0;LinkList q=p->next;p->next=q->next;e=q->data;free(q);cout<<"被删除的元素数据为"<<e<<"\n"; return 0;}//查找第i个元素,并由e返回其值int GetElem(LinkList &L,int i, int &e) {LinkList p=L->next;int j=1;while (p && j<i) {p=p->next; ++j;}if (!p||j>i) return 0;e=p->data;cout<<"该元素的值为"<<e<<"\n";return 1;}//让链表L中的元素按从小到大的顺序排列LinkList Sort(LinkList L){ LinkList p,q;int temp;for(p=L;p!=NULL;p=p->next){for(q=p->next;q!=NULL;q=q->next){if(p->data>q->data){temp=q->data;q->data=p->data;p->data=temp;}}}return L;}//归并L和La得到新的单链性表Lbvoid MergeList_L(LinkList &L,LinkList &La,LinkList &Lb) { LinkList p,pa,pb;p=L->next;pa=La->next;Lb=pb=L; //用L的头结点作为Lb的头结点while (p&&pa) {if (p->data<=pa->data) {pb->next=p;pb=p;p=p->next;}else {pb->next=pa;pb=pa;pa=pa->next;}}pb->next=p?p:pa;free(La);}int main(){LinkList L;int n,s,e,i,f,g,h;cout<<"输入链表长度n:";cin>>n;cout<<"请输入L中的元素:"<<endl;CreateList( L, n);cout<<"输入的链表为:"<<" ";LNode *q=L->next;while(q){cout<<q->data<<" ";q=q->next;} cout<<endl;int choice;cout<<"请选择功能:"<<endl;cout<<"1.插入元素"<<endl;cout<<"2.删除元素"<<endl;cout<<"3.查找元素"<<endl;cout<<"4.给元素排序"<<endl;cout<<"5.合并链表"<<endl;cout<<"0.退出程序"<<endl;cout<<"PS:若先排序再合并,可将得到新的排序后的合并链表。

数据结构线性表实验报告

数据结构线性表实验报告

数据结构线性表实验报告数据结构线性表实验报告1.简介本实验报告旨在介绍数据结构中线性表的实现和应用。

线性表是一种重要的数据结构,它的特点是数据元素之间存在一对一的前后关系,且具有唯一的起点和终点。

本实验通过实现线性表的基本操作,加深对线性表的理解,并通过实例应用展示线性表在实际问题中的应用。

2.实验环境本次实验采用的是编程语言C,并搭配使用一些常用的开发工具和库。

具体环境如下:________●操作系统:________Windows 10●编程语言:________C●开发工具:________Visual Studio Code●辅助库:________Stdio.h、stdlib.h、conio.h3.实验内容3.1 线性表的定义和基本操作3.1.1 线性表的定义线性表是由n(n ≥ 0)个数据元素组成的有限序列,数据元素之间存在一对一的前后关系。

3.1.2 线性表的基本操作●初始化线性表:________创建一个空的线性表。

●插入元素:________在指定位置插入一个新的元素。

●删除元素:________删除指定位置的元素。

●查找元素:________根据值或位置查找指定元素。

●修改元素:________根据位置修改指定元素的值。

●清空线性表:________将线性表中的所有元素清空。

3.2 线性表的顺序存储结构3.2.1 顺序存储结构的定义顺序存储结构是指使用一段连续的存储空间,依次存储线性表中的元素。

3.2.2 顺序存储结构的实现●初始化顺序表:________创建一个空的顺序表,并指定最大容量。

续元素依次后移。

●删除元素:________删除指定位置的元素,并将后续元素依次前移。

●查找元素:________根据值或位置查找指定元素,并返回其位置或值。

●修改元素:________根据位置修改指定元素的值。

●清空顺序表:________将顺序表中的所有元素清空。

●扩容:________当顺序表容量不足时,自动进行扩容。

数据结构实验报告线性表

数据结构实验报告线性表

数据结构实验报告线性表数据结构实验报告:线性表引言数据结构是计算机科学中非常重要的一个概念,它是用来组织和存储数据的一种方式。

线性表是数据结构中最基本的一种,它是由n个数据元素组成的有限序列。

在本次实验中,我们将对线性表进行深入研究,并进行实验验证。

实验目的1. 了解线性表的基本概念和特性2. 掌握线性表的顺序存储结构和链式存储结构3. 熟练掌握线性表的基本操作:插入、删除、查找等4. 通过实验验证线性表的操作和性能实验内容1. 学习线性表的基本概念和特性2. 熟悉线性表的顺序存储结构和链式存储结构3. 实现线性表的基本操作:插入、删除、查找等4. 对线性表的操作进行性能测试和分析实验步骤1. 学习线性表的基本概念和特性,包括线性表的定义、顺序存储结构和链式存储结构等2. 实现线性表的基本操作:插入、删除、查找等3. 设计实验用例,对线性表的操作进行性能测试4. 对实验结果进行分析和总结实验结果1. 实现了线性表的顺序存储结构和链式存储结构2. 实现了线性表的基本操作:插入、删除、查找等3. 对线性表的操作进行了性能测试,并得出了相应的性能数据4. 对实验结果进行了分析和总结,得出了相应的结论结论通过本次实验,我们深入了解了线性表的基本概念和特性,掌握了线性表的顺序存储结构和链式存储结构,熟练掌握了线性表的基本操作,并对线性表的性能进行了测试和分析。

这些都为我们进一步深入学习和应用数据结构打下了坚实的基础。

总结数据结构是计算机科学中非常重要的一部分,线性表作为数据结构中最基本的一种,对我们学习和应用数据结构具有重要的意义。

通过本次实验,我们对线性表有了更深入的了解,并且掌握了相关的操作和性能测试方法,这将为我们今后的学习和应用提供很大的帮助。

数据结构线性表实验报告

数据结构线性表实验报告

数据结构线性表实验报告数据结构线性表实验报告实验目的:本次实验主要是为了学习和掌握线性表的基本操作和实现方式。

通过实验,我们可以加深对线性表的理解,并能够熟悉线性表的基本操作。

实验设备与环境:本次实验所需的设备包括计算机和编程环境。

我们选择使用C语言来实现线性表的操作,并在Visual Studio Code编程软件中进行编写和调试。

实验内容:1.线性表的定义和基本操作1.1 线性表的定义:线性表是一种有序的数据结构,其中的元素按照一定的顺序存储,可以插入、删除和访问元素。

1.2 线性表的基本操作:1.2.1 初始化线性表:创建一个空的线性表。

1.2.2 判断线性表是否为空:判断线性表是否不含有任何元素。

1.2.3 获取线性表的长度:返回线性表中元素的个数。

1.2.4 在线性表的指定位置插入元素:在线性表的第i个位置插入元素x,原第i个及其之后的元素依次后移。

1.2.5 删除线性表中指定位置的元素:删除线性表中第i个位置的元素,原第i+1个及其之后的元素依次前移。

1.2.6 获取线性表中指定位置的元素:返回线性表中第i个位置的元素的值。

1.2.7 清空线性表:将线性表中的元素全部删除,使其变为空表。

2.线性表的顺序存储结构实现2.1 线性表的顺序存储结构:使用数组来实现线性表的存储方式。

2.2 线性表的顺序存储结构的基本操作:2.2.1 初始化线性表:创建一个指定长度的数组,并将数组中的每个元素初始化为空值。

2.2.2 判断线性表是否为空:判断线性表的长度是否为0。

2.2.3 获取线性表的长度:返回线性表数组的长度。

2.2.4 在线性表的指定位置插入元素:将要插入的元素放入指定位置,并将原位置及其之后的元素依次后移。

2.2.5 删除线性表中指定位置的元素:将指定位置的元素删除,并将原位置之后的元素依次前移。

2.2.6 获取线性表中指定位置的元素:返回指定位置的元素的值。

2.2.7 清空线性表:将线性表数组中的每个元素赋空值。

数据结构线性表实验报告

数据结构线性表实验报告数据结构线性表实验报告引言:数据结构是计算机科学中的一个重要概念,它研究如何组织和存储数据,以便能够高效地访问和操作。

线性表是数据结构中最基本的一种,它是一种有序的数据元素集合,其中的元素之间存在一对一的关系。

本次实验旨在通过实际操作线性表,加深对数据结构的理解,并掌握基本的线性表操作。

实验目的:1. 理解线性表的概念和特点;2. 掌握线性表的基本操作,如插入、删除、查找等;3. 熟悉线性表的顺序存储结构和链式存储结构;4. 分析不同存储结构的优缺点。

实验内容:1. 实现线性表的顺序存储结构顺序存储结构是将线性表的元素按照其逻辑顺序依次存放在一块连续的存储空间中。

我们可以使用数组来实现顺序存储结构。

首先,定义一个固定大小的数组作为线性表的存储空间,然后通过数组的下标来访问和操作线性表中的元素。

在插入和删除元素时,需要移动其他元素的位置,以保持线性表的有序性。

2. 实现线性表的链式存储结构链式存储结构是将线性表的元素存储在一系列的结点中,每个结点包含一个数据元素和一个指向下一个结点的指针。

通过将各个结点用指针连接起来,形成一个链表。

在插入和删除元素时,只需要修改相邻结点之间的指针,而不需要移动其他元素的位置。

实验步骤:1. 实现顺序存储结构的线性表首先,定义一个固定大小的数组,用于存储线性表的元素。

然后,实现插入、删除、查找等基本操作。

在插入元素时,需要判断线性表是否已满,如果已满则需要扩容。

在删除元素时,需要判断线性表是否为空,如果为空则无法删除元素。

通过实现这些基本操作,可以对线性表进行增删查改等操作。

2. 实现链式存储结构的线性表首先,定义一个结点类,包含一个数据元素和一个指向下一个结点的指针。

然后,通过将各个结点用指针连接起来,形成一个链表。

实现插入、删除、查找等基本操作。

在插入元素时,需要找到插入位置,并修改相邻结点之间的指针。

在删除元素时,需要找到待删除元素的前一个结点,并修改前一个结点的指针。

线性表实验报告

线性表实验报告一、实验目的本次实验的主要目的是深入理解线性表的基本概念和操作,通过实际编程实现线性表的存储和基本运算,掌握线性表在数据结构中的应用,提高对数据结构的理解和编程能力。

二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。

三、实验原理线性表是一种最基本、最简单的数据结构,它是由 n(n≥0)个数据元素组成的有限序列。

在这个序列中,每个数据元素的位置是按照其逻辑顺序排列的。

线性表有两种存储结构:顺序存储结构和链式存储结构。

顺序存储结构是用一组地址连续的存储单元依次存储线性表中的数据元素,使得逻辑上相邻的两个元素在物理位置上也相邻。

其优点是可以随机访问表中的任意元素,时间复杂度为 O(1);缺点是插入和删除操作需要移动大量元素,时间复杂度为 O(n)。

链式存储结构是通过指针将各个数据元素链接起来,每个数据元素由数据域和指针域组成。

其优点是插入和删除操作不需要移动大量元素,时间复杂度为 O(1);缺点是不能随机访问表中的元素,需要从头指针开始遍历,时间复杂度为 O(n)。

四、实验内容本次实验实现了顺序表和链表的基本操作,包括创建、插入、删除、查找、遍历等。

1、顺序表的实现定义顺序表的结构体,包括数据存储数组和表的长度。

实现顺序表的初始化函数,将表的长度初始化为 0。

实现顺序表的插入函数,在指定位置插入元素,如果插入位置非法或表已满,则返回错误。

实现顺序表的删除函数,删除指定位置的元素,如果删除位置非法,则返回错误。

实现顺序表的查找函数,查找指定元素,如果找到则返回元素的位置,否则返回-1。

实现顺序表的遍历函数,输出表中的所有元素。

2、链表的实现定义链表的结构体,包括数据域和指向下一个节点的指针域。

实现链表的创建函数,创建一个空链表。

实现链表的插入函数,在指定位置插入元素,如果插入位置非法,则返回错误。

实现链表的删除函数,删除指定位置的元素,如果删除位置非法,则返回错误。

数据结构线性表实验报告

数据结构线性表实验报告数据结构线性表实验报告1.实验目的1.1 理解线性表的概念和操作方法1.2 学习线性表的顺序存储结构和链式存储结构1.3 掌握线性表的各种基本操作算法2.实验内容2.1 实现线性表的顺序存储结构a. 定义顺序存储结构的数据类型和长度b. 实现线性表的初始化操作c. 实现线性表的插入操作d. 实现线性表的删除操作e. 实现线性表的查找操作2.1.6 实现线性表的更新操作2.1.7 实现线性表的打印操作2.2 实现线性表的链式存储结构a. 定义链式存储结构的数据类型和长度b. 实现线性表的初始化操作c. 实现线性表的插入操作d. 实现线性表的删除操作e. 实现线性表的查找操作2.2.6 实现线性表的更新操作2.2.7 实现线性表的打印操作2.3 实现线性表的其他操作a. 实现线性表的长度计算b. 实现线性表的合并操作c. 实现线性表的排序操作3.实验步骤3.1 初始化线性表a. 选择合适的存储结构b. 设置线性表的初始状态c. 完成线性表的初始化工作3.2 插入操作a. 根据线性表的存储结构选择插入点b. 将要插入的元素放入插入点位置c. 调整线性表的长度和位置3.3 删除操作a. 根据线性表的存储结构选择删除点b. 删除指定位置的元素c. 调整线性表的长度和位置3.4 查找操作a. 根据线性表的存储结构选择查找方法b. 实现线性表的按值查找3.4.3 实现线性表的按位置查找3.5 更新操作a. 根据线性表的存储结构选择更新点b. 更新指定位置的元素c. 调整线性表的长度和位置3.6 打印操作a. 根据线性表的存储结构选择打印方法b. 实现线性表的打印功能4.实验结果4.1 实现了线性表的顺序存储结构,包括初始化、插入、删除、查找、更新和打印功能4.2 实现了线性表的链式存储结构,包括初始化、插入、删除、查找、更新和打印功能4.3 实现了线性表的其他操作,包括长度计算、合并和排序操作5.实验总结5.1 通过本次实验,掌握了线性表的基本概念和操作方法5.2 熟悉了线性表的顺序存储结构和链式存储结构的实现方式5.3 熟练使用了线性表的各种基本操作算法附件:●附件1:代码实现●附件2:实验数据法律名词及注释:1.著作权:著作权是指作者对其创作的文学、艺术和科学等作品享有的法律权利。

线性表的实验报告

线性表的实验报告线性表的实验报告概述:线性表是一种常见的数据结构,它是由一组具有相同数据类型的元素组成的序列。

本次实验旨在通过实际操作线性表,掌握线性表的基本操作以及了解其应用场景。

实验目的:1. 理解线性表的概念和基本操作;2. 掌握线性表的顺序存储结构和链式存储结构;3. 熟悉线性表的常见应用场景。

实验材料:1. 计算机;2. 编程软件(如C、C++、Java等);3. 实验教材或参考资料。

实验步骤:一、线性表的顺序存储结构实验1. 创建一个空的线性表;2. 向线性表中插入若干元素;3. 删除线性表中的某个元素;4. 根据索引查找线性表中的元素;5. 遍历线性表,输出所有元素。

二、线性表的链式存储结构实验1. 创建一个空的链表;2. 向链表中插入若干节点;3. 删除链表中的某个节点;4. 根据节点值查找链表中的节点;5. 遍历链表,输出所有节点。

实验结果:1. 顺序存储结构实验结果:- 成功创建空的线性表;- 成功插入若干元素;- 成功删除某个元素;- 成功根据索引查找元素;- 成功遍历线性表,输出所有元素。

2. 链式存储结构实验结果:- 成功创建空的链表;- 成功插入若干节点;- 成功删除某个节点;- 成功根据节点值查找节点;- 成功遍历链表,输出所有节点。

实验分析:1. 顺序存储结构适用于元素个数固定或变化不大的情况,插入和删除操作需要移动大量元素,效率较低;2. 链式存储结构适用于元素个数不固定的情况,插入和删除操作只需修改指针,效率较高;3. 线性表的应用场景包括但不限于:图书馆图书管理系统中的图书列表、学生信息管理系统中的学生列表等。

实验总结:通过本次实验,我深入了解了线性表的概念、基本操作以及两种常见存储结构。

顺序存储结构适用于元素个数固定的情况,而链式存储结构适用于元素个数不固定的情况。

线性表在实际应用中有着广泛的应用场景,如图书馆管理系统、学生信息管理系统等。

在以后的学习和工作中,我将灵活运用线性表,为解决实际问题提供便利。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

、格式已经给出,请同学们参考书写。

其中,第一项可补充,第二、三项不修改,第四项为可选项,第六项为参考程序,第五、七、八项需自己上机调试程序书写。

注意:红色字体为提示内容,大家不要往实验报告上抄。

实验一:线性表的顺序存储结构的表示和实验——学生成绩管理系统一、实验目的:通过上机调试程序,充分理解和掌握有关线性表的定义、实现及操作。

二、实验环境Win2003/win xp +Visual C++三、基本要求:利用顺序表来制作一个学生成绩表1、建立头文件,包含数据类型定义和基本操作。

2、建立程序文件利用顺序表表完成一个班级的一个学期的所有课程的管理:能够增加、删除、修改学生的成绩记录。

四、简要的需求分析与概要设计(本项为可选项,选作时参考课五、详细的算法描述:六、实验步骤(以下为参考程序,已经调试运行通过)#include<iostream>#include<fstream>using namespace std;const int LISTINITSIZE=100;const int LISTINCREMENT=10;struct student{char no[20];char name[20];int english;int math;};typedef student elemtype;struct sqlist{elemtype *elem;int length;int listsize;int incrementsize;};//初始化顺序表lvoid initlist(sqlist &l,int maxsize=LISTINITSIZE,int incresize=LISTINCREMENT){l.elem=new elemtype[maxsize];l.length=0;l.listsize=maxsize;l.incrementsize=incresize;//当线性表空间不足时,进行扩容操作void increment(sqlist &l){elemtype *a=new elemtype[l.listsize+l.incrementsize];for(int i=0;i<l.length ;i++){a[i]=l.elem[i];}delete []l.elem;l.elem=a;l.listsize+=l.incrementsize;}//在第i个元素之前插入元素evoid insertlist(sqlist &l,int i,elemtype e){//判断i的合法性1<=i<=l.length+1if(i<1||i>l.length +1){cout<<"插入位置不合法";exit(0);}//判断顺序表l是否有空闲空间if(l.length==l.listsize ) increment(l);//移动元素for(int j=l.length -1;j>=i-1;j--){l.elem [j+1]=l.elem [j];}//插入元素e到第i个元素之前l.elem [i-1]=e;//修改顺序表的长度l.length ++;}//输出线性表中指定元素evoid outputelem(elemtype e){cout<<"学号:"<<e.no<<" 姓名:"<< <<" 英语:"<<e.english <<" 数学:"<<e.math <<endl;}//输出整个线性表void outputlist(sqlist l){for(int i=0;i<l.length ;i++){outputelem(l.elem [i]);}}//在顺序表l中删除第i个元素,用e带回其值void deletelist(sqlist &l,int i,elemtype &e){//判断i值的合法性1<=i<=l.lengthif(i<1 || i>l.length ){cout<<"i值不合法!";exit(0);}//取被删的元素置于e中e=l.elem [i-1];//移动元素for(int j=i;j<l.length ;j++){l.elem [j-1]=l.elem [j];}//修改顺序表的长度l.length --;}//根据学号查找学生的位序int locateelembyno(sqlist l,elemtype e) {for(int i=0;i<l.length ;i++){if(strcmp(l.elem [i].no ,e.no)==0)return i+1;}return 0;}根据位序查找学生的信息elemtype locateelembypos(sqlist l,int i){return l.elem [i-1];}//将当前顺序表中的信息保存void save(sqlist l){ofstream out;out.open ("scorefile",ios::binary);for(int i=0;i<l.length;i++)out.write((char *)&l.elem[i],sizeof student);out.close ();}// 读取scorefile文件中的数据到顺序表l中,如果文件不存在,则创建该文件void openorcreate(sqlist &l){//以读取的方式打开指定的文件scorelist,若存在,则将文件//读出并插入到顺序表l中,若不存在,则根据用户的选择,决定是否创建该文件ifstream in;elemtype e;char answer;int i=0;in.open ("e:\\scorelist",ios_base::binary);if(in){while(in.peek()!=EOF){in.read((char *)&e,sizeof(student));insertlist(l,l.length +1,e);}}else{//创建该文件cout<<"文件scorelist不存在,要创建它吗?(y/n)";cin>>answer;if(answer=='Y' || answer=='y'){ofstream out("e:\\scorelist",ios_base::binary);if(out){do{cout<<"请输入学生的学号、姓名、英语成绩和数学成绩:"<<endl;cin>>e.no>>>>e.english>>e.math;out.write((char *)&e,sizeof(elemtype));insertlist(l,++i,e);cout<<"要继续输入吗?(y/n):";cin>>answer;}while(answer=='Y' || answer=='y');}else{cout<<"文件打开失败!";return;}}elsereturn;}}//逆置顺序表lvoid invertlist(sqlist &l){int i;elemtype temp;for(i=0;i<l.length/2;i++){temp=l.elem [i];l.elem [i]=l.elem [l.length -i-1];l.elem [l.length -i-1]=temp;}}//将顺序表l中前m个元素和后n个元素互换void exchange1(sqlist &l,int m,int n){int k,j;elemtype temp;for(k=1;k<=n;k++){temp=l.elem [m+k-1];for(j=m+k-2;j>=k-1;j--)l.elem [j+1]=l.elem [j];l.elem [k-1]=temp;}}//将数组R中下标从s到t的元素逆置void invert(elemtype R[],int s,int t) {elemtype temp;for(int k=s;k<=(s+t)/2;k++){temp=R[k];R[k]=R[t-k+s];R[t-k+s]=temp;}}//将顺序表l中前m个元素和后n个元素互换void exchange2(sqlist &l,int m,int n){invert(l.elem ,0,m+n-1);invert(l.elem ,0,n-1);invert(l.elem ,n,m+n-1);}//将非纯集合变成纯集合void purge(sqlist &lb){sqlist la;initlist(la);int i,j;for(i=0;i<lb.length ;i++){for(j=0;j<la.length ;j++)if(strcmp(lb.elem [i].no,la.elem [j].no)==0) break;if(j==la.length ){la.elem [la.length ]=lb.elem [i];la.length ++;}}delete []lb.elem ;lb.elem=la.elem;lb.length=la.length;}#include"SqList_h.h"#include<iostream>using namespace std;void main(){sqlist l;initlist(l);elemtype e;int m,n;int choice,pos;do{cout<<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<<"请选择要进行的操作(1--10):";cin>>choice;switch(choice){case 1:cout<<"请输入要插入学生的学号、姓名、英语、数学:"<<endl;cin>>e.no>>>>e.english>>e.math;cout<<"请输入插入位置:"<<endl;cin>>pos;insertlist(l,pos,e);break;case 2:cout<<"请输入要删除学生的学号:";cin>>e.no;pos=locateelembyno(l,e);if(pos==0){cout<<"要删除的学生不在该表中.";}else{cout<<"要删除的是表中的第"<<pos<<"个学生。

相关文档
最新文档