1、数据结构实验报告 南昌大学实验报告学生姓名: 吕金石 学 号:6100408024 专业班级: 数字媒体081班 实验类型: 验证 综合 设计 创新 实验日期: 2010.3.26 实验成绩: 实验1:线性表及其应用一、实验目的帮助学生掌握线性表的基本操作在顺序和链表这两种存储结构上的实现,尤以链表的操作和应用作为重点。二、问题描述1、 构造一个空的线性表L。2、 在线性表L的第i个元素之前插入新的元素e;3、 在线性表L中删除第i个元素,并用e返回其值。三、实验要求1、 分别利用顺序和链表存储结构实现线性表的存储,并设计出在不同的存储结构中线性表的基本操作算法。2、 在实验过程中,对相同的操
2、作在不同的存储结构下的时间复杂度和空间复杂度进行分析。四、实验环境PC微机DOS操作系统或 Windows 操作系统Turbo C 程序集成环境或 Visual C+ 程序集成环境五、实验步骤#include #include #define MAXNUM 100#define INCREMENT 10typedef struct int *elem;int length;int listsize;SqList; void CreatList(SqList &l)int n;coutn;l.elem=(int*)malloc(MAXNUM*sizeof(int);for(int i=0;in;
3、i+)cout第i+1l.elemi;l.length=n;l.listsize=MAXNUM;void PrintList(SqList &l) cout顺序为表:;for(int i=0;il.length;i+)coutl.elemi ;coutendl;void ListInsert(SqList &l,int j ,int x) int *newbase;int *q,*p;coutj;coutx;cout在第j个元素前插入:x=l.listsize) newbase=(int*)realloc(l.elem,(l.listsize+INCREMENT)*sizeof(int);l.
4、elem=newbase;l.listsize+=INCREMENT;q=&(l.elemj-1);for(p=&(l.eleml.length-1);p=q;-p)*(p+1)=*p;*q=x;+l.length;void PrintInsert(SqList &l)cout插入后的顺序为:;for(int i=0;il.length;i+)coutl.elemi ;coutendl;void ListDelete(SqList &l,int j)int *p,*q;int x;coutj;p=&(l.elemj-1);q=l.elem+l.length-1;for(+p;p=q;+p)*(
5、p-1)=*p;-l.length;x=l.elemj-2;cout要删除第j个元素:x+1endl;void PrintDelete(SqList &l)cout删除后的顺序表为:;for(int i=0;il.length;i+)coutl.elemi ;coutendl;void main()SqList l;int j=0;int x=0;cout创建顺序表endl;CreatList(l);PrintList(l);ListInsert(l,j,x);PrintInsert(l);ListDelete(l,j);PrintDelete(l);六、实验结果七、实验总结未实现倒数第二行的
6、“要删除第二个元素:”输出数字与程序的一致,删除的位置不同,输出的元素不同。 南昌大学实验报告学生姓名: 吕金石 学 号: 6100408024 专业班级: 数字媒体081班 实验类型: 验证 综合 设计 创新 实验日期: 2010.5.29 实验成绩: 实验2:串及其应用一、实验目的掌握串类型的实现方法和文本模式匹配方法,熟悉一般文字处理软件的设计方法。二、问题描述全屏幕文本编辑器通过终端对文本文件进行创建、插入、删除、修改、存储等操作。用户可完成对文本的插入、删除、修改等功能。三、实验要求1、 对光标实现如下操作:上、下、左、右移动一个字符位置;向前、后翻页;光标移至文件首、尾;光标移至本
7、行首、尾。2、 实现基本编辑命令:I-在当前光标前插入内容,按ESC结束F-在当前光标后插入内容,按ESC结束D-删除光标所在行ND-删除光标位置开始的n行N-删除光标上的字符W-将修改后的文本保存下来Q-退出编辑状态。四、实验环境PC微机DOS操作系统或 Windows 操作系统Turbo C 程序集成环境或 Visual C+ 程序集成环境五、实验步骤1、 在内存开辟可容纳80行大小的编辑工作区和buffer 的修改缓冲区。2、 要求用户输入编辑文件名,对读入的文件建立相应的页表和行表,在文本编辑程序中设立页指针、行指针、字符指针,分别指示当前操作的页、行、字符。 3、执行插入、删除、修改
8、操作时,将本次操作内容放到缓冲区;4、操作确定后,将修改后的文本存到文件中。六、测试数据 自行设定。七、算法设计串的基本操作:一、串赋值:Status StrAssign(HString &T,char *chars) / 生成一个其值等于串常量chars的串T int i,j; if(T.ch) free(T.ch); / 释放T原有空间 i=strlen(chars); / 求chars的长度i if(!i) / chars的长度为0 T.ch=NULL; T.length=0; else / chars的长度不为0 T.ch=(char*)malloc(i*sizeof(char); /
9、 分配串空间 if(!T.ch) / 分配串空间失败 exit(OVERFLOW); for(j=0;ji;j+) / 拷贝串 T.chj=charsj; T.length=i; return OK; 二、串初始化void InitString(HString &T) / 初始化(产生空串)字符串T。另加 T.length=0; T.ch=NULL;八、实验内容和过程实验程序: #include#include #include #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 typedef int Status; / S
10、tatus是函数的类型,其值是函数结果状态代码,如OK等 struct HString char *ch; / 若是非空串,则按串长分配存储区,否则ch为NULL int length; / 串长度 ;/*文本编辑器的程序*/ #define MAX_LEN 50 / 文件最大行数 #define LINE_LEN 80 / 每行字符数最大值+1 #define NAME_LEN 20 / 文件名最大长度(包括盘符、路径)+1 Status StrAssign(HString &T,char *chars) / 生成一个其值等于串常量chars的串T int i,j; if(T.ch) fre
11、e(T.ch); / 释放T原有空间 i=strlen(chars); / 求chars的长度i if(!i) / chars的长度为0 T.ch=NULL; T.length=0; else / chars的长度不为0 T.ch=(char*)malloc(i*sizeof(char); / 分配串空间 if(!T.ch) / 分配串空间失败 exit(0); for(j=0;ji;j+) / 拷贝串 T.chj=charsj; T.length=i; return OK; void InitString(HString &T) / 初始化(产生空串)字符串T。另加 T.length=0;
12、T.ch=NULL; void StrPrint(HString T) / 输出T字符串。另加 int i; for(i=0;i0) StrAssign(Tn,str); n+; if(nMAX_LEN) printf(文件太大n); return; while(i0); fclose(fp); else printf(新文件n); void List() / 显示文件内容 int i; for(i=0;iMAX_LEN) printf(插入行太多n); return; if(n=k-1&k0) for(i=n-1;i=k-1;i-) Ti+m=Ti; n+=m; printf(请顺序输入待插
13、入内容:n); for(i=k-1;i=k+m-1&k0) for(i=k-1+m;in;i+) Ti-m=Ti; for(i=n-m;in;i+) InitString(Ti); n-=m; else printf(行超出范围n); void Save() / 存盘 int i; getchar(); fp=fopen(filename,w); if(fp) for(i=0;in;i+) Ti.chTi.length=0; fputs(Ti.ch,fp); fputc(10,fp); fputc(10,fp); fclose(fp); else printf(存盘失败n); void mai
14、n() Status s=TRUE; int i; char k; for(i=0;iMAX_LEN;i+) / 初始化串 InitString(Ti); while(s) printf(*n); printf(请选择相关的操作: n); printf(O.打开文件 L.显示文件内容n); printf(I.插入相应的内容 D.删除相应的某几行 n); printf(W.将修改后的文本保存下来 Q.退出编辑状态n); printf(*n); k=getchar(); switch(k) case O: Open();break; case L: List();break; case I: In
15、sert(); break; case D: Delete(); break; case W: Save(); case Q: s=FALSE; /*文本编辑器的程序*/测试数据:测试文档XLQ测试前:打开文件:显示文件内容:插入相应内容:删除某几行:保存文本:退出编辑状态:测试后文本:九、实验总结在经过对串的学习后,我们需要进行实际上机实验,运行程序,达到理论联系实际的目的,使我们更好的掌握该算法。这次实验要求我们熟悉串的基本操作,掌握串类型的实现方法和文本模式匹配方法,熟悉一般文字处理软件的设计方法。要求全屏幕文本编辑器通过终端对文本文件进行创建、插入、删除、修改、存储等操作,用户可完成对
16、文本的插入、删除、修改等功能。这次编的程序可以实现创建串、比较串、合并串和截取串的目的。函数中共有StrAssign()(串的创建)、StrCompare()(串的比较)、Comcat()(串的合并)、SubString()(返回串的一部分)四个实现函数以及一个print()函数用来方便的输出整个串。在主函数中对他们分别进行调用,使整个程序脉络比较清晰,可读性加强,但用的函数较少,整个程序相对比较复杂。 南昌大学实验报告学生姓名: 吕金石 学 号: 6100408024 专业班级: 数字媒体081班 实验类型: 验证 综合 设计 创新 实验日期: 2010.6.7 实验成绩: 实验3:二叉树及
17、其应用一、实验目的树是数据结构中应用极为广泛的非线性结构,本单元的实验达到熟悉二叉树的存储结构的特性,以及如何应用树结构解决具体问题。二、问题描述首先,掌握二叉树的各种存储结构和熟悉对二叉树的基本操作。其次,以二叉树表示算术表达式的基础上,设计一个十进制的四则运算的计算器。如算术表达式:a+b*(c-d)-e/f三、实验要求1、 如果利用完全二叉树的性质和二叉链表结构建立一棵二叉树,分别计算a) 统计叶子结点的个数。b) 求二叉树的深度。2、 十进制的四则运算的计算器可以接收用户来自键盘的输入。3、 由输入的表达式字符串动态生成算术表达式所对应的二叉树。4、 自动完成求值运算和输出结果。四、实
18、验环境PC微机DOS操作系统或 Windows 操作系统Turbo C 程序集成环境或 Visual C+ 程序集成环境五、实验步骤1、根据二叉树的各种存储结构建立二叉树;2、设计求叶子结点个数算法和树的深度算法;3、根据表达式建立相应的二叉树,生成表达式树的模块;4、根据表达式树,求出表达式值,生成求值模块;5、程序运行效果,测试数据分析算法。设计程序代码如下:#include #include #define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define ERROR 0#define NUMBER 1#define SIMBLE 2
19、int OP8 = +, -, *, /, (, ), #, 0 ;typedef union int Operator; / 操作符 float Operand; / 操作数 Int_Float;/ 表达式树typedef struct BinaryTreeNode Int_Float Data; int IsOperator; struct BinaryTreeNode *RChild; struct BinaryTreeNode *LChild;BiTreeNode, *lpBiTreeNode;/ 栈typedef struct lpBiTreeNode *base; lpBiTree
20、Node *top; int stacksize;SqStack;int InitStack( SqStack &s ) s.base = (lpBiTreeNode *)malloc( STACK_INIT_SIZE*sizeof(lpBiTreeNode) ); if(!s.base) return 0; s.top = s.base; s.stacksize = STACK_INIT_SIZE; return 1;int Push( SqStack &s, lpBiTreeNode e ) if( s.top - s.base = s.stacksize ) s.base = (lpBi
21、TreeNode *)realloc( s.base, (s.stacksize + STACKINCREMENT)*sizeof(lpBiTreeNode) ); if(!s.base) return 0; s.top = s.base + s.stacksize; s.stacksize += STACKINCREMENT; *s.top = e; s.top +; return 1;int Pop( SqStack &s, lpBiTreeNode &e ) if( s.top = s.base ) return 0; s.top -; e = *s.top; return 1;lpBi
22、TreeNode GetTop( SqStack s ) lpBiTreeNode e; if( s.top = s.base ) return NULL; e = *(s.top -1); return e;int IsEmpty( SqStack s ) if( s.top = s.base ) return 1; else return 0;int In( int c, int* op ) / 判断c 是否在op 中,op为以结尾的数组 while( *op != 0 ) if( c = *op ) return 1; op +; return 0; int Precede( int t
23、heta1, int theta2 ) int i, j; int op_look77 = , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , = ; switch( theta1 ) case +: i = 0; break; case -: i = 1; break; case *: i = 2; break; case /: i = 3; break; case (: i = 4; break; case ): i = 5; break; case #: i = 6; break; default: return 0; switch( theta2 ) case +: j = 0; break; case -: j = 1; break; case *: j = 2; break;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1