1、实验报告线性表的顺序表示和实现数学与计算科学学院实 验 报 告实验项目名称 :线性表的顺序表示和实现 所属课程名称 : 数据结构A 实 验 类 型 : 验证性 实 验 日 期 : 2012年4月5号 班 级 : 学 号: 姓 名: 成 绩 : 一、实验概述:【实验目的】(1)、线性表的逻辑结构特征。 、总存在第一个和最后一个元素。 、除第一个元素以外,每一个元素总存在唯一一个直接前驱元素。 、除最后一个元素以外,每一个元素总存在唯一一个直接后驱元素。(2)、顺序表的特征。 、逻辑关系上相邻的物理位置上也相邻。 、是一种随机存储结构,可以用一个简单直观的公式来表示每一个元素的地址。(3)、通过上
2、机实验验证线性表的顺序结构的正确性,了解算法与程序的区别。【实验原理】/-线性表的动态分配顺序存储结构-#define LIST_INIT_SIZE 5 /线性表存储空间的初始分配量#define LISTINCREMENT 2 /线性表存储空间的分配增量typedef struct ElemType *elem; /存储空间基址 int length; /当前长度 int listsize; /当前分配的存储容量(以sizeof(ElemType)为单位)SqList;【实验环境】 实验的环境:VC+二、实验内容:【实验方案】 编写主函数,调用初始化,建立顺序表的算法以及插入和删除算法。调试
3、运行输入数据得出结果并进行分析。【实验过程】(实验步骤、记录、数据、分析)实验步骤:(1)、在VC+环境下输入各个算法和主函数。(2)、输完以上的东西后,再对程序进行编译。编译完后主要出现以下几个主要错误: 、算法和函数中出现了一些系统无法识别的变量,照成程序出现了错误。 、程序中出现了这样的错误:D:软件Microsoft Visual C+ V6.0 简体中文企业版Cpp1.cpp(50) : error C2018: unknown character 0xa3、程序中的错误:D:软件Microsoft Visual C+ V6.0 简体中文企业版Cpp1.cpp(8) : error
4、C2144: syntax error : missing ; before type int、在程序中还出现了大量的输入的错误。比如大小写的问题,前后的函数名不一致的问题等等。 编译完成以后,接下来是找到错误进行调试。调试过程中找出错误的原因,然后进行分析。 发生错误的主要原因如下: 、在输入程序的过程中由于粗心造成了大量的输入错误。、没有注意算法与源程序的区别。算法是简单的对源程序进行描述的,是给人阅读的,所以有些变量没有定义我们就能看懂。而程序中的变量一定要先定义才能够被引用,才能被计算机识别。、强制类型转换也是C语言中的一个语句,所以语句完成以后后面要加分号来表示语句结束。所以才会出现
5、第三的错误。、在C程序的输入过程中。一律要在英文字母的条件下进行输入,否则就会出现第二种错误,使系统无法识别。 (3)、调试完成以后,程序中没有了错误。然后执行。在命令窗口中输入数据进行验证。出现了如下图所示的错误: 在进行删除的算法的过程中,最后那个数字“5”出现了两次,与实验要求的结果不一致。后来经老师的指点,找出了原因的所在。 原因:在执行删除算法以后,变长要减1.经改正以后得出了正确的结论。最后成功完成了实验,得出了正确的结果。【实验结论】(结果)实验的结果如下图:【实验小结】(收获体会)第一点:在变写算法和程序的过程是一个心细的过程,一定要注意每一个细节,要不然就会出现很多错误,得不
6、到自己想要的结果。第二点:要熟练的掌握有关C语言的知识,要充分明白算法与程序的区别,在编写程序的过程中要保持清醒的头脑,时刻注意那些容易出错的地方。 第三点:每次进行删除算法之后表长都要减一。否则会造成数据冗余,浪费内存。第四点:最终的收获是我已经掌握了顺序表的建立及相关算法的操作。三、指导教师评语及成绩:评 语评语等级优良中及格不及格1.实验报告按时完成,字迹清楚,文字叙述流畅,逻辑性强2.实验方案设计合理3.实验过程(实验步骤详细,记录完整,数据合理,分析透彻)4实验结论正确. 成 绩: 指导教师签名: 批阅日期:附录1:源 程 序#include#include#define OK 1#
7、define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2 typedef int Status; typedef int ElemType;#define LIST_INIT_SIZE 5 / 初始分配存储量#define LISTINCREMENT 2 /分配增量 typedef struct ElemType *elem; /存储空间基址 int length; /当前长度 int listsize; /当前分配存储量 Sqlist; Status InitList_Sq(Sqlist &L) / 构造一个空的线性表L L.elem=(E
8、lemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType); if(!L.elem) exit(OVERFLOW); /存储分配失败 L.length=0; /空表长度为0 L.listsize=LIST_INIT_SIZE; /初始存储容量 return OK; Status ListInsert_Sq(Sqlist &L,int i, ElemType e) / 在线性表L中第i个元素之前插入元素e, i的合法值为1= i = ListLength_Sq(L)+1 ElemType *newbase ,*p,*q; /定义变量p,q if(iL.len
9、gth+1) return ERROR; / i值不合法 if(L.length=L.listsize) / 当前空间满,增加分配 newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType); if(!newbase) exit(OVERFLOW); ); / 存储分配失败 L.elem=newbase; / 新基址 L.listsize+=LISTINCREMENT; / 增加存储容量 q=&(L.elemi-1); / q为插入位置 for(p=&(L.elemL.length-1);p=q;
10、-p) *(p+1)=*p; *q=e; +L.length; / 插入e,表长增1 return OK; Status ListDelete_Sq(Sqlist &L,int i, ElemType &e)/ 在线性表L中删除第i个元素,并用e返回其值,i的合法值为1= i = ListLength_Sq(L) ElemType *p,*q; /定义变量p,q if(iL.length) return ERROR; / i值不合法 p=&(L.elemi-1); / p为被删除元素位置 e=*p; / 被删除元素值赋给e q=L.elem+L.length-1; / 表尾元素的位置 for(
11、+p;p=q;+p) *(p-1)=*p; / 后面元素左移 -L.length; / 表长减1 return OK; void main() Sqlist L; int i; InitList_Sq(L); / 构造一个空的线性表L for (i=0;iL.listsize;i+) scanf(%d,&L.elemi); +L.length;/输入数据 for(i=0;iL.listsize;i+)printf(%d ,*(L.elem+i); /输出表中的数据 printf(n); ElemType e;scanf(%d%d,&i,&e); ListInsert_Sq(L,i,e);/ 在线性表L中第i个元素之前插入元素e for(i=0;iL.length;i+) printf(%d ,L.elemi);/输出新的线性表中的数据 printf(n); scanf(%d,&i);ListDelete_Sq(L,i,e); / /在线性表L中删除第i个元素,并用e返回其值for(i=0;iL.length;i+)printf(%d ,L.elemi);/输出新的线性表表中的数据 printf(n); printf(e=%dn,e);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1