数据结构大作业实验报告2010302521 刘恋
数据结构实验报告_实验报告_
数据结构实验报告想必学计算机专业的同学都知道数据结构是一门比较重要的课程,那么,下面是小编给大家整理收集的数据结构实验报告,供大家阅读参考。
数据结构实验报告1一、实验目的及要求1)掌握栈和队列这两种特殊的线性表,熟悉它们的特性,在实际问题背景下灵活运用它们。
本实验训练的要点是“栈”和“队列”的观点;二、实验内容1) 利用栈,实现数制转换。
2) 利用栈,实现任一个表达式中的语法检查(选做)。
3) 编程实现队列在两种存储结构中的基本操作(队列的初始化、判队列空、入队列、出队列);三、实验流程、操作步骤或核心代码、算法片段顺序栈:Status InitStack(SqStack &S){S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemTyp e));if(!S.base)return ERROR;S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;}Status DestoryStack(SqStack &S){free(S.base);return OK;}Status ClearStack(SqStack &S){S.top=S.base;return OK;}Status StackEmpty(SqStack S){if(S.base==S.top)return OK;return ERROR;}int StackLength(SqStack S){return S.top-S.base;}Status GetTop(SqStack S,ElemType &e){if(S.top-S.base>=S.stacksize){S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemTyp e));if(!S.base) return ERROR;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;Status Push(SqStack &S,ElemType e){if(S.top-S.base>=S.stacksize){S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemTyp e));if(!S.base)return ERROR;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;}Status Pop(SqStack &S,ElemType &e){if(S.top==S.base)return ERROR;e=*--S.top;return OK;}Status StackTraverse(SqStack S){ElemType *p;p=(ElemType *)malloc(sizeof(ElemType));if(!p) return ERROR;p=S.top;while(p!=S.base)//S.top上面一个...p--;printf("%d ",*p);}return OK;}Status Compare(SqStack &S){int flag,TURE=OK,FALSE=ERROR; ElemType e,x;InitStack(S);flag=OK;printf("请输入要进栈或出栈的元素:"); while((x= getchar)!='#'&&flag) {switch (x){case '(':case '[':case '{':if(Push(S,x)==OK)printf("括号匹配成功!\n\n"); break;case ')':if(Pop(S,e)==ERROR || e!='('){printf("没有满足条件\n");flag=FALSE;}break;case ']':if ( Pop(S,e)==ERROR || e!='[')flag=FALSE;break;case '}':if ( Pop(S,e)==ERROR || e!='{')flag=FALSE;break;}}if (flag && x=='#' && StackEmpty(S)) return OK;elsereturn ERROR;}链队列:Status InitQueue(LinkQueue &Q) {Q.front =Q.rear=(QueuePtr)malloc(sizeof(QNode));if (!Q.front) return ERROR;Q.front->next = NULL;return OK;}Status DestoryQueue(LinkQueue &Q) {while(Q.front){Q.rear=Q.front->next;free(Q.front);Q.front=Q.rear;}return OK;}Status QueueEmpty(LinkQueue &Q){if(Q.front->next==NULL)return OK;return ERROR;}Status QueueLength(LinkQueue Q){int i=0;QueuePtr p,q;p=Q.front;while(p->next){i++;p=Q.front;q=p->next;p=q;}return i;}Status GetHead(LinkQueue Q,ElemType &e) {QueuePtr p;p=Q.front->next;if(!p)return ERROR;e=p->data;return e;}Status ClearQueue(LinkQueue &Q){QueuePtr p;while(Q.front->next ){p=Q.front->next;free(Q.front);Q.front=p;}Q.front->next=NULL;Q.rear->next=NULL;return OK;}Status EnQueue(LinkQueue &Q,ElemType e) {QueuePtr p;p=(QueuePtr)malloc(sizeof (QNode));if(!p)return ERROR;p->data=e;p->next=NULL;Q.rear->next = p;Q.rear=p; //p->next 为空return OK;}Status DeQueue(LinkQueue &Q,ElemType &e) {QueuePtr p;if (Q.front == Q.rear)return ERROR;p = Q.front->next;e = p->data;Q.front->next = p->next;if (Q.rear == p)Q.rear = Q.front; //只有一个元素时(不存在指向尾指针) free (p);return OK;}Status QueueTraverse(LinkQueue Q){QueuePtr p,q;if( QueueEmpty(Q)==OK){printf("这是一个空队列!\n");return ERROR;}p=Q.front->next;while(p){q=p;printf("%d<-\n",q->data);q=p->next;p=q;}return OK;}循环队列:Status InitQueue(SqQueue &Q){Q.base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType)); if(!Q.base)exit(OWERFLOW);Q.front=Q.rear=0;return OK;}Status EnQueue(SqQueue &Q,QElemType e){if((Q.rear+1)%MAXQSIZE==Q.front)return ERROR;Q.base[Q.rear]=e;Q.rear=(Q.rear+1)%MAXQSIZE;return OK;}Status DeQueue(SqQueue &Q,QElemType &e){if(Q.front==Q.rear)return ERROR;e=Q.base[Q.front];Q.front=(Q.front+1)%MAXQSIZE;return OK;}int QueueLength(SqQueue Q){return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;}Status DestoryQueue(SqQueue &Q){free(Q.base);return OK;}Status QueueEmpty(SqQueue Q) //判空{if(Q.front ==Q.rear)return OK;return ERROR;}Status QueueTraverse(SqQueue Q){if(Q.front==Q.rear)printf("这是一个空队列!");while(Q.front%MAXQSIZE!=Q.rear){printf("%d<- ",Q.base[Q.front]);Q.front++;}return OK;}数据结构实验报告2一.实验内容:实现哈夫曼编码的生成算法。
数据结构实验报告
姓名:学号:班级:2010年12月15日实验一线性表的应用【实验目的】1、熟练掌握线性表的基本操作在顺序存储和链式存储上的实现。
、;2、以线性表的各种操作(建立、插入、删除、遍历等)的实现为重点;3、掌握线性表的动态分配顺序存储结构的定义和基本操作的实现;4、通过本章实验帮助学生加深对C语言的使用(特别是函数的参数调用、指针类型的应用和链表的建立等各种基本操作)。
【实验内容】约瑟夫问题的实现:n只猴子要选猴王,所有的猴子按1,2,…,n编号围坐一圈,从第一号开始按1,2…,m报数,凡报到m号的猴子退出圈外,如此次循环报数,知道圈内剩下一只猴子时,这个猴子就是猴王。
编写一个程序实现上述过程,n和m由键盘输入。
【实验要求】1、要求用顺序表和链表分别实现约瑟夫问题。
2、独立完成,严禁抄袭。
3、上的实验报告有如下部分组成:①实验名称②实验目的③实验内容:问题描述:数据描述:算法描述:程序清单:测试数据算法:#include <stdio.h>#include <stdlib.h>typedef struct LPeople{int num;struct LPeople *next;}peo;void Joseph(int n,int m) //用循环链表实现{int i,j;peo *p,*q,*head;head=p=q=(peo *)malloc(sizeof(peo));p->num=0;p->next=head;for(i=1;i<n;i++){p=(peo *)malloc(sizeof(peo));p->num=i;q->next=p;p->next=head;}q=p;p=p->next;i=0;j=1;while(i<n){if(j%m==0){q->next=p->next;p=q->next;printf("%4d",j%n);i++;}else{q=p;p=p->next;}j++;}printf("\n");}void main(){int n,m; /*人的个数*/printf("Please Enter n amd m(n>m):\n");scanf("%d%d",&n,&m);Joseph(n,m);}实验二树和图的应用【实验目的】1.熟练掌握数的基本概念、二叉树的基本操作及在链式存储结构上的实现。
数据结构实验报告
数据结构实验报告
本次数据结构实验的任务主要包括两部分,分别是学习使用链表数据结构和掌握链表排序算法。
在此基础上,我们完成了一组关于链表基本操作和排序算法的实验。
实验一:链表基本操作
在这个实验中,我们学习了链表的插入、删除、查找等基本操作。
链表的插入和删除操作是通过一个链表节点来实现的。
链表节点包括一个数据域和一个指向下一个节点的指针域。
通过修改指针域,我们就可以实现节点的插入和删除操作。
具体来说,我们编写了一个基本的链表程序,其中包括链表头指针初始化、链表节点插入、链表节点删除、查找指定节点等操作。
通过对程序的调试和功能测试,我们验证了链表操作的正确性。
实验二:链表排序算法
在这个实验中,我们学习了链表排序算法,并编写了链表的快速排序和归并排序两种算法。
快速排序是一种分治思想的排序算法,通过选择一个基准元素,分别将小于和大于基准元素的元素分别放在它的左右两边,再递归地对左右两个子序列进行排序,最终得到有序序列。
归并排序是另一种经典的排序算法,它利用归并思想,将两个有序序列合并成一个更大的有序序列,这个过程不断重复,最终得到完整的有序序列。
通过实现这两种排序算法,并在大样本数据下进行测试,我们验证了算法的正确性和效率。
实验总结:
通过本次实验,我们深入学习了链表数据结构的相关基本操作和排序算法的实现原理。
同时,在实际编程实践中,我们也掌握了链表程序的调试、测试和优化技术。
这些都是我们今后从事软件开发工作需要掌握的重要技能,在这个方面的积累将会对我们有很大帮助。
《数据结构》实验报告
《数据结构》实验报告实验一一、实验目的及要求理解线性表的顺序存储结构;熟练掌握顺序表结构及其有关算法的设计;理解线性表的链式存储结构;熟练掌握动态链表结构及其有关算法的设计;根据具体问题的需要,设计出合理的表示数据的链表结构,并设计相关算法;深入了解栈和队列的特性,以便在实际问题背景下灵活运用他们;同时巩固对这两种结构的构造方法的理解。
二、实验环境硬件:计算机软件:Microsoft Visual C++三、实验内容1.以顺序表作存储结构,实现线性表的插入、删除;2.以单链表作存储结构,实现有序表的合并;3.利用栈(以顺序栈作存储结构)实现进制转换,并用队列(以链队列作存储结构)计算并打印杨辉三角。
四、源程序清单五、实验结果六、总结实验二一、实验目的及要求掌握二叉树的动态存储结构--二叉链表,掌握二叉树的三种遍历方法,会运用三种遍历的方法求解有关问题。
二、实验环境硬件:计算机软件:Microsoft Visual C++三、实验内容1.以二叉链表作存储结构,建立一棵二叉树;2.输出其先序、中序、后序遍历序列;3.求出它的深度;4.统计其叶子结点数四、源程序清单五、实验结果六、总结实验三一、实验目的及要求掌握图的存储结构及其建立算法,熟练掌握图的两种遍历算法及其应用。
二、实验环境硬件:计算机软件:Microsoft Visual C++三、实验内容1.以邻接矩阵法作存储结构,建立一个无向图;2.输出该图的深度优先搜索序列;3.输出该图的广度优先搜索序列;4. 设计算法求出该图的连通分量个数及边的数目。
四、源程序清单五、实验结果六、总结实验四一、实验目的及要求掌握顺序表的查找方法,尤其是折半查找方法。
掌握二叉排序树的查找算法。
二、实验环境硬件:计算机软件:Microsoft Visual C++三、实验内容1.建立一个顺序表,用顺序查找的方法对其实施查找;2.建立一个有序表,用折半查找的方法对其实施查找;3.建立一个二叉排序树,根据给定值对其实施查找;4.对同一组数据,试用三种方法查找某一相同数据,并尝试进行性能分析。
数据结构实验报告
《数据结构》实验报告姓名:学号:班级:学院:实验一单链表实验(一)实验目的1.理解线性表的链式存储结构。
2.熟练掌握动态链表结构及有关算法的设计。
3.根据具体问题的需要,设计出合理的表示数据的链表结构,并设计相关算法。
(二)实验任务编写算法实现下列问题的求解1.求链表中第i个结点的指针(函数),若不存在,则返回NULL。
2.在第i个结点前插入值为x的结点。
3.删除链表中第i个元素结点。
4.在一个递增有序的链表L中插入一个值为x的元素,并保持其递增有序特性。
5.将单链表L中的奇数项和偶数项结点分解开,并分别连成一个带头结点的单链表,然后再将这两个新链表同时输出在屏幕上,并保留原链表的显示结果,以便对照求解结果。
6.求两个递增有序链表L1和L2中的公共元素,并以同样方式连接成链表L3。
(三)主要仪器设备PC机,Windows操作平台,Visual C++(四)实验分析顺序表操作:定义一个顺序表类,该类包括顺序表的存储空间、存储容量和长度,以及构造、插入、删除、遍历等操作的方法(五)源程序头文件文件名:linklist.h#include<iostream>using namespace std;struct node{int data;node *next;};class list{public:list();int length()const{return count; //求链表长度}~list();void create(); //链表构建,以0为结束标志void output(); //链表输出int get_element(const int i)const; //按序号取元素node *locate(const int x) const; //搜索对应元素int insert(const int i,const int x); //插入对应元素int delete_element(const int i); //删除对应元素node *get_head(){return head; //读取头指针}void insert2(const int x);friend void SplitList(list L1, list&L2, list &L3);friend void get_public(list L1, list L2, list &L3);private:int count;node *head;};list::list(){head=new node;head->next=NULL;count=0;}void list::create() //链表构建,以0为结束标志{int x;cout<<"请输入当前链表,以0为结束符。
数据结构实训实验报告
一、实验背景数据结构是计算机科学中一个重要的基础学科,它研究如何有效地组织和存储数据,并实现对数据的检索、插入、删除等操作。
为了更好地理解数据结构的概念和原理,我们进行了一次数据结构实训实验,通过实际操作来加深对数据结构的认识。
二、实验目的1. 掌握常见数据结构(如线性表、栈、队列、树、图等)的定义、特点及操作方法。
2. 熟练运用数据结构解决实际问题,提高算法设计能力。
3. 培养团队合作精神,提高实验报告撰写能力。
三、实验内容本次实验主要包括以下内容:1. 线性表(1)实现线性表的顺序存储和链式存储。
(2)实现线性表的插入、删除、查找等操作。
2. 栈与队列(1)实现栈的顺序存储和链式存储。
(2)实现栈的入栈、出栈、判断栈空等操作。
(3)实现队列的顺序存储和链式存储。
(4)实现队列的入队、出队、判断队空等操作。
3. 树与图(1)实现二叉树的顺序存储和链式存储。
(2)实现二叉树的遍历、查找、插入、删除等操作。
(3)实现图的邻接矩阵和邻接表存储。
(4)实现图的深度优先遍历和广度优先遍历。
4. 算法设计与应用(1)实现冒泡排序、选择排序、插入排序等基本排序算法。
(2)实现二分查找算法。
(3)设计并实现一个简单的学生成绩管理系统。
四、实验步骤1. 熟悉实验要求,明确实验目的和内容。
2. 编写代码实现实验内容,对每个数据结构进行测试。
3. 对实验结果进行分析,总结实验过程中的问题和经验。
4. 撰写实验报告,包括实验目的、内容、步骤、结果分析等。
五、实验结果与分析1. 线性表(1)顺序存储的线性表实现简单,但插入和删除操作效率较低。
(2)链式存储的线性表插入和删除操作效率较高,但存储空间占用较大。
2. 栈与队列(1)栈和队列的顺序存储和链式存储实现简单,但顺序存储空间利用率较低。
(2)栈和队列的入栈、出队、判断空等操作实现简单,但需要考虑数据结构的边界条件。
3. 树与图(1)二叉树和图的存储结构实现复杂,但能够有效地表示和处理数据。
数据结构图实验报告
数据结构图实验报告数据结构图实验报告1. 引言数据结构是计算机科学中的重要概念之一,它研究数据的组织、存储和管理方式。
图作为一种重要的数据结构,广泛应用于各个领域,如网络拓扑、社交网络分析等。
本实验旨在通过实际操作,深入理解数据结构图的基本概念和操作。
2. 实验目的本实验的主要目的是掌握图的基本概念和相关操作,包括图的创建、遍历、搜索和最短路径算法等。
3. 实验环境本实验使用C++语言进行编程,采用图的邻接矩阵表示法进行实现。
4. 实验内容4.1 图的创建在实验中,我们首先需要创建一个图。
通过读取输入文件中的数据,我们可以获得图的顶点数和边数,并根据这些信息创建一个空的图。
4.2 图的遍历图的遍历是指从图的某个顶点出发,按照一定的规则依次访问图中的其他顶点。
常用的图的遍历算法有深度优先搜索(DFS)和广度优先搜索(BFS)。
我们可以通过实验来比较这两种遍历算法的效率和应用场景。
4.3 图的搜索图的搜索是指从图的某个顶点出发,找到与之相关的特定顶点或边。
常用的图的搜索算法有深度优先搜索和广度优先搜索。
在实验中,我们可以通过输入特定的顶点或边,来观察图的搜索算法的执行过程和结果。
4.4 图的最短路径算法图的最短路径算法是指在图中找到两个顶点之间的最短路径。
常用的最短路径算法有迪杰斯特拉算法和弗洛伊德算法。
通过实验,我们可以比较这两种算法的执行效率和应用场景。
5. 实验结果与分析通过实验,我们可以得到以下结论:- 图的邻接矩阵表示法在创建和操作图的过程中具有较高的效率。
- 深度优先搜索算法适用于查找图中的连通分量和回路等问题。
- 广度优先搜索算法适用于查找图中的最短路径和最小生成树等问题。
- 迪杰斯特拉算法适用于求解单源最短路径问题,而弗洛伊德算法适用于求解多源最短路径问题。
6. 实验总结通过本次实验,我们深入学习了数据结构图的基本概念和相关操作。
图作为一种重要的数据结构,具有广泛的应用价值。
在今后的学习和工作中,我们可以运用所学的知识,解决实际问题,提高工作效率。
数据结构实验报告
数据结构实验报告一、实验目的数据结构是计算机科学中重要的基础课程,通过本次实验,旨在深入理解和掌握常见数据结构的基本概念、操作方法以及在实际问题中的应用。
具体目的包括:1、熟练掌握线性表(如顺序表、链表)的基本操作,如插入、删除、查找等。
2、理解栈和队列的特性,并能够实现其基本操作。
3、掌握树(二叉树、二叉搜索树)的遍历算法和基本操作。
4、学会使用图的数据结构,并实现图的遍历和相关算法。
二、实验环境本次实验使用的编程环境为具体编程环境名称,编程语言为具体编程语言名称。
三、实验内容及步骤(一)线性表的实现与操作1、顺序表的实现定义顺序表的数据结构,包括数组和表的长度等。
实现顺序表的初始化、插入、删除和查找操作。
2、链表的实现定义链表的节点结构,包含数据域和指针域。
实现链表的创建、插入、删除和查找操作。
(二)栈和队列的实现1、栈的实现使用数组或链表实现栈的数据结构。
实现栈的入栈、出栈和栈顶元素获取操作。
2、队列的实现采用循环队列的方式实现队列的数据结构。
完成队列的入队、出队和队头队尾元素获取操作。
(三)树的实现与遍历1、二叉树的创建以递归或迭代的方式创建二叉树。
2、二叉树的遍历实现前序遍历、中序遍历和后序遍历算法。
3、二叉搜索树的操作实现二叉搜索树的插入、删除和查找操作。
(四)图的实现与遍历1、图的表示使用邻接矩阵或邻接表来表示图的数据结构。
2、图的遍历实现深度优先遍历和广度优先遍历算法。
四、实验结果与分析(一)线性表1、顺序表插入操作在表尾进行时效率较高,在表头或中间位置插入时需要移动大量元素,时间复杂度较高。
删除操作同理,在表尾删除效率高,在表头或中间删除需要移动元素。
2、链表插入和删除操作只需修改指针,时间复杂度较低,但查找操作需要遍历链表,效率相对较低。
(二)栈和队列1、栈栈的特点是先进后出,适用于函数调用、表达式求值等场景。
入栈和出栈操作的时间复杂度均为 O(1)。
2、队列队列的特点是先进先出,常用于排队、任务调度等场景。
数据结构实验报告
实验报告题目数据结构实验学生姓名学号系部专业班级指导教师二〇一〇年十二月实验1:顺序表实验一、实验目的:1.学会定义线性表的顺序存储类型,实现C程序的基本结构对线性表的一些基本操作和具体的函数定义。
2.掌握顺序表的基本操作,实现顺序表的插入,删除,查找基本运算。
3.掌握对于多函数程序的输入,编辑,调试和运算过程。
二、实验要求:1.预习C语言中结构体的定义和基本的操作方法。
2.对顺序表每个基本操作用一个单独函数实现。
3.编写完整程序完成下面实验内容并且上机运行。
三、实验内容:编写完整程序完成下面基本操作并且上机运行1.初始化顺序表La;2.将顺序表La设置为空表;3.测试顺序表La是否上空表;4.在顺序表La插入一个新元素;5.删除顺序表La中某个元素;6.在顺序表La中查找某个元素,查找成功,返回位序,否则返回0;7.建立顺序表La;8.打印顺序表La所有元素;10.输入n个元素建立顺序表La;11.归并非递减表La和Lb成为非递减表Lc。
要求编写一个主菜单调用上面各个基本操作。
四、程序体现:#include<stdio.h>#include <conio.h>#include <stdlib.h>#define LIST_INIT_SIZE 10#define LISTINCREMENT 3#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2#define Null 0typedef int status;typedef int elemtype;typedef struct {int *elem;int length;int listsize;}sqlist;status InitList(sqlist &L){L.elem=(int*)malloc(LIST_INIT_SIZE*sizeof(int));if(!L.elem)exit(OVERFLOW);L.length=10;L.listsize=LIST_INIT_SIZE;return OK;}status ClearList(sqlist &L){L.elem=Null;return OK;}status TestList(sqlist &L){if(L.elem=Null)return TRUE;elsereturn FALSE;}status ListInsert(sqlist &L,int i,int e){printf("经修改后,链表为:");int *p,*q;if(i<1||i>L.length+1)return ERROR;if(L.length>=L.listsize){int *newbase;newbase=(int *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(int));if(!newbase)exit(OVERFLOW);L.elem=newbase;L.listsize+=LISTINCREMENT;}q=&(L.elem[i-1]);for(p=&(L.elem[L.length-1]);p>=q;--p)*(p+1)=*p;*q=e;++L.length;return OK;}status ListDelete(sqlist &L,int i,elemtype &e){ elemtype *q, *p;if((i<1)||(i>L.length))return ERROR;p=&(L.elem[i-1]);e=*p;q=L.elem+L.length-1;for(++p;p<=q;++p)*(p-1)=*p;--L.length;return OK;}int LocateElem(sqlist L,int e){int i = 0;for (i = 0; i < L.length; i++){if (L.elem[i] == e)return i + 1;}return FALSE;}void MergeList(sqlist L1,sqlist L2,sqlist &L3){printf("经合并后的新表为:");int *pa,*pb,*pc,*pa_last,*pb_last;pa=L1.elem;pb=L2.elem;L3.listsize=L3.length=L1.length+L2.length;pc=L3.elem=(int *)malloc(L3.listsize*sizeof(int));if(!L3.elem)exit(OVERFLOW);pa_last=L1.elem+L1.length-1;pb_last=L2.elem+L2.length-1;while(pa<=pa_last&&pb<=pb_last){if(*pa<=*pb)*pc++=*pa++;else *pc++=*pb++;}while(pa<=pa_last)*pc++=*pa++;while(pb<=pb_last)*pc++=*pb++;}void main(){sqlist La,Lb,Lc;int i,j,m,n,p,q,s,r;printf("创建一个新的线性表,请输入十个数字:");InitList(La);for(i=0;i<LIST_INIT_SIZE;i++)scanf("%d",&La.elem[i]);for(i=0;i<LIST_INIT_SIZE;i++)printf("%d ",La.elem[i]);printf("\n");printf("现插入一个数据,请输入它的位数和大小:");int a,b;scanf("%d%d",&a,&b);ListInsert(La,a,b);for(s=0;s<La.length;s++)printf("%d ",La.elem[s]);printf("\n");printf("现删除一个数据,请输入它的位数和大小:");int c,d;scanf("%d%d",&c,&d);ListDelete(La,c,d);for(j=0;j<La.length;j++)printf("%d ",La.elem[j]);printf("\n");printf("现查找一个数据,请输入它的位数:");int e;scanf("%d",&e);n=LocateElem(La,e);printf("n=%d",n);printf("再次创建一个新表.");InitList(Lb);for(q=0;q<LIST_INIT_SIZE;q++)scanf("%d ",&Lb.elem[q]);printf("\n");printf("现将两个线性表进行合并...");printf("\n");MergeList(La,Lb,Lc);for(r=0;r<2*LIST_INIT_SIZE;r++)printf("%d ",Lc.elem[r]);printf("\n");printf("测试线性表La是否为空,如果返回值为1,则为空:");m=TestList(La);printf("m=%d",m);printf("\n");printf("现将线性表La置为空,如果返回值为1,则置空成功.");p=ClearList(La);printf("p=%d",p);printf("\n");printf("The End!");}实验2:单链表实验一、实验目的:1.学会定义线性表的链表存储类型,实现C程序的基本结构对线性表的一些基本操作和具体的函数定义。
数据结构 实验报告完整版
四川师范大学计算机学院实验报告册院系名称:计算机科学学院课程名称:数据结构实验学期2010 年至2011 年第一学期专业班级:2010级教育技术学姓名:学号:指导教师:实验最终成绩:实验报告须知1.学生填写实验报告应按规范填写,填写格式见由任课老师给出的实验报告样本;2.学生应填写的内容包括:封面相关栏目、第一页中‘本学期(年)开设实验课程情况一览表’中的实验名称、学时数;每次报告中的实验性质、同组人姓名、实验日期、以及实验报告中的一至五项;3.教师填写内容为:实验评价、每次报告成绩、第一页中‘本学期(年)开设实验课程情况一览表’中成绩、及封面的实验最终成绩;4.学生实验结束后,教师应对学生实验结果进行核实,学生方可离开实验室。
5、实验成绩等级分为(90-100分)优,(80-89分)良,(70-79分)中,(60-69分)及格,(59分)不及格。
6.本实验册应妥善保管,本课程实验结束后应交回实验室。
本学期(年)开设实验课程情况一览表实验报告(1)分析:(1)类C语言面对对象,而C语言面对过程;(2)核心算法就相当于C语言的程序;(3)初步了解三元组的建立等知识;(4)初步了解利用C++编程的步骤及编程的组成部分;(5)初次接触还是对很多地方倍感疑惑,需要多多操作理解;实验报告(2)实验名称线性表实验:顺序存储、链式存储同组人姓名实验性质□基本操作■验证性■综合性□设计性实验日期2010年10月9日实验成绩教师评价:实验预习□实验操作□实验结果□实验报告□其它□五、实验结果的分析与评价结果:1)顺序存储2)链式存储分析:实验报告(3)五、实验结果的分析与评价结果:1)括号匹配2)队列存储1.链式存储队列2.循环存储队列分析:通过此次的数据结构实验,让我对队列的基本结构有了进一步了解了,以及队列上一些基本操作的实现,掌握了队列在我们实际生活中的应用以及在编程时的基本技巧.不过在编程过程中还是出现了让人头疼的地方,不过同过自己的翻阅资料还是可以独立的解决编程中的问题的,通过本次的实验让自己所学的知识得到了进一步的巩固,加深了对C语言的了解.实验报告(4)实验名称稀疏矩阵实验同组人姓名实验性质□基本操作□验证性■综合性□设计性实验日期实验成绩教师评价:实验预习□实验操作□实验结果□实验报告□其它□教师签名:分析:注意与C语言的矩阵转置相区分;不要混淆这两个的方案;实验报告(5)。
数据结构实验报告
数据结构实验报告一、实验目的本实验旨在通过对数据结构的学习和实践,掌握基本的数据结构概念、原理及其应用,培养学生的问题分析与解决能力,提升编程实践能力。
二、实验背景数据结构是计算机科学中的重要基础,它研究数据的存储方式和组织形式,以及数据之间的关系和操作方法。
在软件开发过程中,合理选用和使用数据结构,能够提高算法效率,优化内存利用,提升软件系统的性能和稳定性。
三、实验内容本次实验主要涉及以下几个方面的内容:1.线性表的基本操作:包括线性表的创建、插入、删除、查找、修改等操作。
通过编程实现不同线性表的操作,掌握它们的原理和实现方法。
2.栈和队列的应用:栈和队列是常用的数据结构,通过实现栈和队列的基本操作,学会如何解决实际问题。
例如,利用栈实现括号匹配,利用队列实现银行排队等。
3.递归和回溯算法:递归和回溯是解决很多求解问题的常用方法。
通过编程实现递归和回溯算法,理解它们的思想和应用场景。
4.树和二叉树的遍历:学习树和二叉树的遍历方法,包括前序、中序和后序遍历。
通过编程实现这些遍历算法,加深对树结构的理解。
5.图的基本算法:学习图的基本存储结构和算法,包括图的遍历、最短路径、最小生成树等。
通过编程实现这些算法,掌握图的基本操作和应用。
四、实验过程1.具体实验内容安排:根据实验要求,准备好所需的编程环境和工具。
根据实验要求逐步完成实验任务,注意记录并整理实验过程中遇到的问题和解决方法。
2.实验数据采集和处理:对于每个实验任务,根据要求采集并整理测试数据,进行相应的数据处理和分析。
记录实验过程中的数据和结果。
3.实验结果展示和分析:将实验结果进行适当的展示,例如表格、图形等形式,分析实验结果的特点和规律。
4.实验总结与反思:总结实验过程和结果,回顾实验中的收获和不足,提出改进意见和建议。
五、实验结果与分析根据实验步骤和要求完成实验任务后,得到了相应的实验结果。
对于每个实验任务,根据实验结果进行适当的分析。
数据结构的实验报告
一、实验目的本次实验旨在让学生掌握数据结构的基本概念、逻辑结构、存储结构以及各种基本操作,并通过实际编程操作,加深对数据结构理论知识的理解,提高编程能力和算法设计能力。
二、实验内容1. 线性表(1)顺序表1)初始化顺序表2)向顺序表插入元素3)从顺序表删除元素4)查找顺序表中的元素5)顺序表的逆序操作(2)链表1)创建链表2)在链表中插入元素3)在链表中删除元素4)查找链表中的元素5)链表的逆序操作2. 栈与队列(1)栈1)栈的初始化2)入栈操作3)出栈操作4)获取栈顶元素5)判断栈是否为空(2)队列1)队列的初始化2)入队操作3)出队操作4)获取队首元素5)判断队列是否为空3. 树与图(1)二叉树1)创建二叉树2)遍历二叉树(前序、中序、后序)3)求二叉树的深度4)求二叉树的宽度5)二叉树的镜像(2)图1)创建图2)图的深度优先遍历3)图的广度优先遍历4)最小生成树5)最短路径三、实验过程1. 线性表(1)顺序表1)初始化顺序表:创建一个长度为10的顺序表,初始化为空。
2)向顺序表插入元素:在顺序表的第i个位置插入元素x。
3)从顺序表删除元素:从顺序表中删除第i个位置的元素。
4)查找顺序表中的元素:在顺序表中查找元素x。
5)顺序表的逆序操作:将顺序表中的元素逆序排列。
(2)链表1)创建链表:创建一个带头结点的循环链表。
2)在链表中插入元素:在链表的第i个位置插入元素x。
3)在链表中删除元素:从链表中删除第i个位置的元素。
4)查找链表中的元素:在链表中查找元素x。
5)链表的逆序操作:将链表中的元素逆序排列。
2. 栈与队列(1)栈1)栈的初始化:创建一个栈,初始化为空。
2)入栈操作:将元素x压入栈中。
3)出栈操作:从栈中弹出元素。
4)获取栈顶元素:获取栈顶元素。
5)判断栈是否为空:判断栈是否为空。
(2)队列1)队列的初始化:创建一个队列,初始化为空。
2)入队操作:将元素x入队。
3)出队操作:从队列中出队元素。
数据结构实验报告
数据结构实验报告一、实验目的本次实验的目的是通过实际操作,深入理解数据结构的概念、特性和应用,并运用所学知识进行问题解决和算法设计。
二、实验内容本次实验主要包括以下内容:1. 数组的创建和操作:- 数组的定义和初始化- 数组元素的读取和修改- 数组的遍历和排序2. 链表的创建和操作:- 单链表的定义和初始化- 单链表的插入和删除- 单链表的遍历和逆序输出3. 栈和队列的创建和操作:- 栈的初始化和压栈、弹栈操作- 队列的初始化和入队、出队操作4. 树的创建和操作:- 二叉树的定义和初始化- 二叉树的遍历(前序、中序、后序遍历)- 二叉树的查找、插入和删除操作三、实验步骤和方法1. 数组的创建和操作:- 根据题目要求,声明和初始化数组;- 使用循环结构,遍历数组,并根据需求进行元素的修改;- 运用排序算法对数组进行排序,并验证排序结果的正确性。
2. 链表的创建和操作:- 根据题目要求,创建单链表的结构体和相关操作函数;- 使用动态内存分配函数malloc(),创建链表节点并插入到链表中;- 根据题目要求,设计相应的插入和删除函数,实现链表的插入和删除操作;- 遍历链表,并将链表节点的数据逆序输出。
3. 栈和队列的创建和操作:- 根据题目要求,创建栈和队列的结构体和相关操作函数;- 使用数组和指针实现栈和队列的功能,并初始化相关变量;- 实现栈的压栈和弹栈操作,并验证结果的正确性;- 实现队列的入队和出队操作,并验证结果的正确性。
4. 树的创建和操作:- 根据题目要求,创建二叉树的结构体和相关操作函数;- 使用动态内存分配函数malloc(),创建二叉树的节点,并根据题目要求插入到二叉树中;- 实现二叉树的遍历(前序、中序、后序遍历),并验证遍历结果的正确性;- 根据题目要求,实现二叉树的查找、插入和删除操作。
四、实验结果与分析在实验过程中,我按照题目的要求,使用所学的数据结构相关知识,设计了相应的代码,并通过调试和运行,得到了实验结果。
数据结构课程实验报告
数据结构课程实验报告一、实验目的本次数据结构课程实验的主要目的是通过实践掌握常见数据结构的基本操作,包括线性结构、树形结构和图形结构。
同时,也要求学生能够熟练运用C++语言编写程序,并且能够正确地使用各种算法和数据结构解决具体问题。
二、实验内容本次实验涉及到以下几个方面:1. 线性表:设计一个线性表类,并且实现线性表中元素的插入、删除、查找等基本操作。
2. 栈和队列:设计一个栈类和队列类,并且分别利用这两种数据结构解决具体问题。
3. 二叉树:设计一个二叉树类,并且实现二叉树的遍历(前序遍历、中序遍历和后序遍历)。
4. 图论:设计一个图类,并且利用图论算法解决具体问题(如最短路径问题)。
三、实验过程1. 线性表首先,我们需要设计一个线性表类。
在这个类中,我们需要定义一些成员变量(如线性表大小、元素类型等),并且定义一些成员函数(如插入元素函数、删除元素函数等)。
在编写代码时,我们需要注意一些细节问题,如边界条件、异常处理等。
2. 栈和队列接下来,我们需要设计一个栈类和队列类。
在这两个类中,我们需要定义一些成员变量(如栈顶指针、队头指针等),并且定义一些成员函数(如入栈函数、出栈函数、入队函数、出队函数等)。
在编写代码时,我们需要注意一些细节问题,如空间不足的情况、空栈或空队列的情况等。
3. 二叉树然后,我们需要设计一个二叉树类,并且实现二叉树的遍历。
在这个类中,我们需要定义一个节点结构体,并且定义一些成员变量(如根节点指针、节点数量等),并且定义一些成员函数(如插入节点函数、删除节点函数、遍历函数等)。
在编写代码时,我们需要注意一些细节问题,如递归调用的情况、空节点的情况等。
4. 图论最后,我们需要设计一个图类,并且利用图论算法解决具体问题。
在这个类中,我们需要定义一个邻接矩阵或邻接表来表示图形结构,并且定义一些成员变量(如顶点数量、边的数量等),并且定义一些成员函数(如添加边函数、删除边函数、最短路径算法等)。
数据结构实验报告
数据结构实验报告摘要:本实验是针对数据结构概念与应用的课程要求进行的,主要目的是通过实践掌握各种数据结构的基本操作和应用场景。
在实验中,我们学习了线性表、栈、队列、二叉树等数据结构,并实现了它们的各种操作。
通过实验,我们深入理解了数据结构的原理和应用,并且掌握了如何在实际项目中应用各种数据结构来解决问题。
1. 引言数据结构是计算机科学中的一个重要概念,它研究如何组织和存储数据以及如何在这些数据上进行操作。
它对于算法的设计和优化起着至关重要的作用。
本次实验旨在通过实践,加深对数据结构的理解,并掌握其基本操作和应用场景。
2. 实验目的本实验的主要目的是:(1) 理解线性表、栈、队列和二叉树等数据结构的概念和特点;(2) 掌握各种数据结构的基本操作,如插入、删除、查找等;(3) 学会在实际项目中应用各种数据结构,解决实际问题。
3. 实验工具本实验使用的工具有:(1) 编程语言:C++;(2) 集成开发环境:Visual Studio;(3) 相关库:标准模板库(STL)。
4. 实验内容和步骤4.1 线性表线性表是最基本的数据结构之一,它包括顺序表和链表两种形式。
在本实验中,我们实现了一个基于顺序表的线性表。
具体步骤如下:(1) 定义线性表的数据结构和基本操作函数;(2) 实现线性表的初始化、插入、删除、查找、修改等基本操作;(3) 编写测试代码,验证线性表的功能和正确性。
4.2 栈栈是一种特殊的线性表,它遵循先进后出(LIFO)的原则。
在本实验中,我们实现了一个基于数组的栈。
具体步骤如下:(1) 定义栈的数据结构和基本操作函数;(2) 实现栈的初始化、入栈、出栈、查看栈顶元素等基本操作;(3) 编写测试代码,验证栈的功能和正确性。
4.3 队列队列是另一种特殊的线性表,它遵循先进先出(FIFO)的原则。
在本实验中,我们实现了一个基于链表的队列。
具体步骤如下:(1) 定义队列的数据结构和基本操作函数;(2) 实现队列的初始化、入队、出队、查看队首元素等基本操作;(3) 编写测试代码,验证队列的功能和正确性。
数据结构实验报告
数据结构实验报告一、引言数据结构是计算机科学中的重要概念,它涉及到组织和管理数据的方式和算法。
数据结构实验是计算机科学专业的必修实践课程之一,通过实验,我们可以探索不同的数据结构类型,并理解它们的优势和应用。
本报告旨在总结我在数据结构实验中的学习和实践经验。
二、实验目的本次实验的主要目的是熟练掌握线性表、二叉树和图等常见数据结构的构建与操作方法。
通过编写代码,我们可以加深对这些数据结构的理解并且通过实验验证其性能。
三、实验过程1.线性表实验:在这一部分,我们使用C++语言实现了顺序表和链表两种线性表的数据结构,并比较了它们在插入、删除、查找等操作上的性能差异。
2.二叉树实验:我们在实验中实现了二叉树的构建和遍历算法,包括前序遍历、中序遍历和后序遍历。
通过实验,我们发现不同的遍历算法对于不同的问题有不同的效果。
3.图实验:本次实验中,我们实现了图的邻接矩阵和邻接表两种存储结构,并比较了它们在图的遍历和搜索等操作上的性能差异。
同时,我们还实现了最小生成树和最短路径算法,这些算法对实际应用具有重要意义。
四、实验结果根据我们的实验结果,我们可以得出以下结论:1.对于插入和删除等频繁变动的操作,链表比顺序表更适合,因为链表的插入和删除操作时间复杂度为O(1),而顺序表的插入和删除操作时间复杂度为O(n)。
2.在二叉树的遍历中,前序遍历是最简单和常用的一种方式,而中序遍历和后序遍历在某些特定情况下更有用。
例如,在寻找路径上的节点时,后序遍历可以更方便地找出叶子节点。
3.在图的存储中,邻接表比邻接矩阵更节省空间,特别在稀疏图的情况下。
而邻接矩阵在搜索操作中更高效,因为邻接矩阵可以在O(1)的时间内检查两个节点之间是否存在边。
4.最小生成树和最短路径算法在实际生活中有很多应用,例如在城市规划和网络布线中。
通过实验可以发现,Prim算法和Dijkstra算法都可以有效地解决这些问题。
五、实验总结通过本次实验,我对线性表、二叉树和图等常见数据结构有了更深入的了解,并且通过实践中的编码和测试,提高了我的编程能力和问题解决能力。
数据结构实验报告(实验)
数据结构实验报告(实验)数据结构实验报告(实验)1. 实验目的1.1 理解数据结构的基本概念和操作1.2 学会使用数据结构解决实际问题1.3 掌握常用数据结构的实现和应用2. 实验环境2.1 操作系统:Windows 102.2 编程语言:C++2.3 开发工具:Visual Studio3. 实验内容3.1 实验一:线性表的实现和应用3.1.1 设计并实现线性表的基本操作函数3.1.2 实现线性表的插入、删除、查找等功能 3.1.3 实现线性表的排序算法3.1.4 应用线性表解决实际问题3.2 实验二:栈和队列的实现和应用3.2.1 设计并实现栈的基本操作函数3.2.2 设计并实现队列的基本操作函数3.2.3 实现栈和队列的应用场景3.2.4 比较栈和队列的优缺点3.3 实验三:树的实现和应用3.3.1 设计并实现二叉树的基本操作函数3.3.2 实现二叉树的创建、遍历和查找等功能3.3.3 实现树的遍历算法(前序、中序、后序遍历)3.3.4 应用树解决实际问题4. 数据结构实验结果4.1 实验一的结果4.1.1 线性表的基本操作函数实现情况4.1.2 线性表的插入、删除、查找功能测试结果4.1.3 线性表的排序算法测试结果4.1.4 线性表解决实际问题的应用效果4.2 实验二的结果4.2.1 栈的基本操作函数实现情况4.2.2 队列的基本操作函数实现情况4.2.3 栈和队列的应用场景测试结果4.2.4 栈和队列优缺点的比较结果4.3 实验三的结果4.3.1 二叉树的基本操作函数实现情况4.3.2 二叉树的创建、遍历和查找功能测试结果 4.3.3 树的遍历算法测试结果4.3.4 树解决实际问题的应用效果5. 实验分析与总结5.1 实验问题与解决方案5.2 实验结果分析5.3 实验总结与心得体会6. 附件附件一:实验源代码附件二:实验数据7. 法律名词及注释7.1 版权:著作权法规定的对原创作品享有的权利7.2 专利:国家授予的在一定时间内对新型发明享有独占权利的证书7.3 商标:作为标识企业商品和服务来源的标志的名称、符号、图案等7.4 许可协议:指允许他人在一定条件下使用自己的知识产权的协议。
数据结构实验报告
数据结构实验报告
数据结构实验报告1.引言1.1 问题背景在计算机科学领域中,数据结构是研究和操作数据的一种方式。
它涉及到如何组织和存储数据,以便能够高效地检索和修改。
1.2 实验目的本实验旨在让学生深入了解一些常见的数据结构,并通过实践掌握它们的实际应用。
具体实验目的如下:________1) 熟悉线性数据结构,如数组、链表和栈。
2) 熟悉非线性数据结构,如树和图。
3) 学习并实现一些常见的数据结构算法,如排序和搜索算法。
4) 测试和分析数据结构的性能。
2.线性数据结构2.1 数组a. 定义和用途数组是一种线性数据结构,由相同类型的元素组成,并通过索引访问。
它被广泛应用于存储和访问大量数据的场景。
b. 实验要求在此实验中,我们将实现一个简单的整数数组,并提供一些基本的操作,如插入、删除和查找。
2.2 链表a. 定义和用途链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。
它可以灵活地分配内存,并且插入和删除操作比数组更高效。
b. 实验要求在此实验中,我们将实现一个单链表,并提供一些基本的操作,如插入、删除和查找。
2.3 栈a. 定义和用途栈是一种特殊的线性数据结构,遵循后进先出(LIFO)的原则。
它可以用于处理函数调用、表达式求值和追踪程序执行等场景。
b. 实验要求在此实验中,我们将实现一个简单的栈,并提供一些基本的操作,如压栈、出栈和查看栈顶元素。
3.非线性数据结构3.1 树a. 定义和用途树是一种非线性数据结构,由一组节点组成,通过边连接起来。
它常用于模拟分层结构和组织数据。
b. 实验要求在此实验中,我们将实现一个二叉树,并提供一些基本的操作,如插入、删除和查找。
3.2 图a. 定义和用途图是一种非线性数据结构,由一组节点和连接这些节点的边组成。
它可以用于建模网络、社交关系、路径查找等问题。
b. 实验要求在此实验中,我们将实现一个简单的图,并提供一些基本的操作,如添加节点、添加边和查找路径。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》实验报告班级:_10011006_ 姓名:__刘恋__ 学号:_2010302521_ E-mail:_1020383169@_ 日期:_2011年12月30日_◎实验题目:构建一个字典树,并实现相关的查找任务◎实验目的:设计存储结构完成字典树的构建以及设计程序完成其他功能◎实验内容:一、需求分析1、输入的形式和输入值的范围:从文本中读入单词2、输出的形式:将相应的查找结果输出到文本中3、程序所能达到的功能:生成字典树并完成查找单词等的功能4、测试数据:文本“vocabulary.txt”,“PrefixFrequenceWord.txt”,“TotPrefixWord.txt”,“SearchWordInVocabulary.txt”中的数据二概要设计PTireNode TireTree(PTireNode node);生成26叉树。
void InitTireTree(PTireNode Head, char str[], int num);初始化字典。
void SearchWord(PTireNode Head, char str[], int num, FILE *f);查找单词。
void ExportWord(PTireNode node, FILE *f);按字典序顺序输出具有相同词头的单词。
void GetTenPreWord(PTireNode node);找到频率最高的十个单词。
PTireNode ReadPrefix(PTireNode Head, char str[], char word[]);读入词头并判断词头是否存在。
主程序流程:第一步:输出提示语,用户输入数据。
第二步:判断用户的输入值,选择对应的程序实现相应的功能。
第三步:直至用户输入结束程序指令,否则重复执行第一步和第二步。
主程序中除去几个提示语句的输出,其余的操作全部调用函数完成。
三详细设计实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法;对主程序和其他模块也都需要写出伪码算法;画出函数的调用关系。
Main()Inputchar(from 1 to 6)Switch()Case 1: task1Case 2: task2Case 3: task3Case 4: task4Case 5: task5Case 6: exit programEnd四使用说明、测试分析及结果1、说明如何使用你编写的程序;根据程序的提示语句便可使用。
2、测试结果与分析;测试结果和给予的程序调试结果相同3、调试过程中遇到的问题是如何解决提以及对设计与实现的回顾讨论和分析;在编写第一个程序,也就是构建字典树时,并没有遇到很大问题,然而在开始编写查找单词的有关程序时便遇到了困难。
其中,最主要的是对26叉树的递归遍历没能很好的写出,始终纠结在遍历算法中,没有正确认识递归的使用方法,使得我在编写程序时始终不能完成程序的功能,最终,在网上以及和同学探讨之后,理解了递归程序编写的要诀,进而完成了26叉树的递归遍历,为以后的程序奠定了基础,也让我对递归有了更深刻的认识。
同时,在编写程序过程中,对递归过程中数据的记录有了更好的领悟。
自己设计了一个存储结构体完成了对第三、第四、第五题的辅助存储,让程序能够顺利完成,但对于时间复杂度和空间复杂度没能很好的控制,程序的运行时间比参考时间长,很明显的是第四和第五题。
或许是程序的存储结构需要改进,这个我会在接下来的时间里不断尝试,改进程序。
4、运行界面。
程序的提示文字会引导用户使用此程序程序1 程序2 程序3 程序4 程序5 程序6五、实验总结加深了我对递归程序的理解,更加全面的让我认识到了递归操作在程序编写中所起的重要作用。
同时,面对不同的问题构造不同的数据结构也让我对“数据结构”这门课程有了新的认识,提高了我将逻辑结构转化为物理结构的能了,增强了程序的编写能力。
(一)需求分析本程序主要是完成一个字典的构建以及相关的搜索功能(二) 概要设计根据程序需求,设计用26叉树完成字典树的建立的查询1.基本操作:void GetTenPreWord(PTireNode node)操作结果:找到频率最高的十个单词。
void ExportWord(PTireNode node, FILE *f)初始条件:字典树构建完成;操作结果:按字典序顺序输出具有相同词头的单词。
void SearchWord(PTireNode Head, char str[], int num, FILE *f) 初始条件:字典树构建完成;操作结果:查找单词并输出结果到文本中。
PTireNode TireTree(PTireNode node)操作结果:生成26叉树,进而生成字典。
2.本程序包含三个模块:(1)主程序模块;(2)判断用户输入并选择程序功能模块(3)运算和输出模块;模块调用图:主程序模块判断用户输入并选择程序功能模块运算和输出(三) 详细设计1.元素类型,结点类型和指针类型:typedef struct TireNode//存储的结构体:26叉树{char letter;int tag,frequency;long order;//单词输入的次序TireNode *add[MAX_VERTEX_NUM];}TireNode,*PTireNode;typedef struct Record//用于作为中间存储的结构体{char record[50];//记录单词int frequency;//记录相应单词的频率long order;//记录相应单词的输入顺序}record;2.每个模块的分析:(1)主程序模块:int main(){char tag;WelcomeDesk();//调用函数输出程序开始界面do{tag=getchar();//用户输入选项Selection(tag);//判断用户的输入并调用函数完成程序的功能}while(1);return 0;}(2)判断用户输入并选择程序功能;void Selection(char tag){//调用Task1—Task5完成程序的功能switch(tag){case '1': {Task1();system("cls");WelcomeDesk();break;}case '2': {Task2();system("cls");WelcomeDesk();break;}case '3': {Task3();system("cls");WelcomeDesk();break;}case '4': {Task4();system("cls");WelcomeDesk();break;}case '5': {Task5();system("cls");WelcomeDesk();break;}case '6': {system("cls");printf("\n\n\n\n感谢您的使用!\n");Sleep(2000);exit(-1);break;}}}函数调用关系图main()Switch(program)end3.完整的程序:(见源文件).(四) 程序使用说明及测试结果1.程序使用说明(1)本程序的运行环境为VC6.0。
(2)进入演示程序后即显示提示信息:/*****************************************/欢迎使用本程序!请按照选项进行操作1:建立字典树2:查找单词3:输出前缀单词(按字典序顺序)4:输出频率最高的十个前缀单词5:输出字典中所有单词中频率最高的十个单词6:退出程序/*****************************************/请选择程序的功能:2.测试结果结果分别输出“SearchWordInVocabulary_Result.txt”,“PrefixFrequence_Result.txt”,“TotPrefixWord_Result.txt”,“MostFrequenceWord.txt”中。
3.调试中的错误及解决办法。
(遇到时给出)一开始编写递归输出查询的单词,总是将新的单词连接到之前输出的单词后面,在调试过程中发现在我使用的简介存储结构字符串中,需要对字符串的下一个字母位置进行标记,从而在递归的过程中明确每一个存入的字母的位置,进而使用了“depth”这个“指针”指示字母的位置:进入递归的时候指针后移,跳出递归的时候指针回退。
这样就完成了对字典树上不同层的字母的存储和输出,解决了遇到的问题。
4.运行界面在每次程序完成功能后都会返回欢迎界面等待用户的再次选择,直到用户选择关闭程序才退出程序界面。
(所有的操作结果输出到指定的文本中)(五)、实验总结(实验心得)本次程序实验大课,每天平均6个小时的程序编写让我真切的感受到一个计算机学院学生应该有的大学生活,虽然说长时间面对电脑不是一件好事,不过对于我们这个专业而言,只有长时间的在电脑上调试自己的程序才能对课本上学到的东西有更深刻的理解。
同时,在编写程序过程中,和同学的交流也是至关重要的,互相的交流可能没有什么实际的结果,但会给自己的思路提供一个更广阔的平台,减少“弯路”,更快的达到程序的目的。
同时,在程序实践中不能因为学习的越多,思路就越复杂。
程序的目的是完成相应的功能,一昧的讲究程序结构的建设可能会抹杀我们程序的初衷,在本次试验过程中我就经历过这样的事情,一位同学用很简单,很直接的思路解决了一个问题,但我还是纠结在结构的构架上。
虽然他的思路被证实在数据只要多一点点就无法执行,但也给我不少启示,程序的编写结构固然重要,但是思路的清晰和明了才是最重要的,否则程序只能是一团乱麻,并且还降低了编写程序的信心。
实验大课结束了,但我还有后面几道题没能完成,其实第六题已经能够查找1000个文件了,但是数量一多程序就崩溃了,希望在以后的时间里我能够完成本次实验的所有题目,并对之前的程序加以优化。
教师评语:实验成绩:指导教师签名:批阅日期:。