数据结构课程设计实验报告

合集下载

数据结构课程设计实验报告完整版

数据结构课程设计实验报告完整版

数据结构课程设计实验报告完整版【正文】一、实验目的本实验主要目的是通过实践,掌握数据结构的基本概念、常见数据结构的实现方式以及在实际应用中的应用场景和效果。

二、实验背景数据结构是计算机科学与技术领域中的一个重要概念,是研究数据的组织方式、存储方式、访问方式以及操作等方面的方法论。

在计算机科学领域,数据结构是实现算法和解决问题的基础,因此对数据结构的理解和应用具有重要意义。

三、实验内容本次数据结构课程设计实验主要分为以下几个部分:1. 实验环境的准备:包括选择合适的开发平台、安装必要的软件和工具。

2. 实验数据的收集和处理:通过合适的方式收集实验所需的数据,并对数据进行处理和整理。

3. 数据结构的选择和实现:根据实验需求,选择合适的数据结构,并进行相应的数据结构实现。

4. 数据结构的测试和优化:对所实现的数据结构进行测试,包括性能测试和功能测试,并根据测试结果对数据结构进行优化和改进。

5. 实验报告的撰写:根据实验过程和结果,撰写完整的实验报告,包括实验目的、实验背景、实验内容、实验结果和结论等。

四、实验过程1. 实验环境的准备本实验选择了Visual Studio作为开发平台,安装了相应版本的Visual Studio,并根据官方指引进行了相应的配置和设置。

2. 实验数据的收集和处理本实验选取了一份包含学生信息的数据集,包括学生姓名、学号、性别、年龄等信息。

通过编写Python脚本,成功提取了所需信息,并对数据进行了清洗和整理。

3. 数据结构的选择和实现根据实验需求,我们选择了链表作为数据结构的实现方式。

链表是一种常见的动态数据结构,能够高效地插入和删除元素,适用于频繁插入和删除的场景。

在实现链表时,我们定义了一个节点结构,包含数据域和指针域。

通过指针的方式将节点连接起来,形成一个链式结构。

同时,我们还实现了相关的操作函数,包括插入、删除、查找等操作。

4. 数据结构的测试和优化在完成链表的实现后,我们对其进行了性能测试和功能测试。

数据结构实验报告_实验报告_

数据结构实验报告_实验报告_

数据结构实验报告想必学计算机专业的同学都知道数据结构是一门比较重要的课程,那么,下面是小编给大家整理收集的数据结构实验报告,供大家阅读参考。

数据结构实验报告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一.实验内容:实现哈夫曼编码的生成算法。

数据结构课程设计实验报告

数据结构课程设计实验报告

数据结构课程设计实验报告引言数据结构课程设计实验是为了加深对数据结构基本概念和算法的理解和掌握,通过实际操作来加深对数据结构的认识和应用能力。

本实验报告将介绍在数据结构课程设计实验中所完成的内容,包括实验目的、实验环境、实验过程、实验结果以及实验总结。

实验目的通过本次实验,旨在掌握以下内容: - 理解并掌握线性表、栈、队列、链表、二叉树等基本数据结构的概念和实现; - 熟悉数据结构的插入、删除、查找等基本操作; - 学习并掌握基本排序算法和查找算法的实现; - 通过实验加深对数据结构和算法的理解,并能够灵活运用于实际问题的解决。

实验环境本次实验在以下环境下进行: - 操作系统:Windows 10 - 编程语言:C语言 - 集成开发环境:Visual Studio Code实验过程1. 线性表的操作设计1.1 定义结构体首先,定义表示线性表的结构体,包括数据域和指向下一个结点的指针。

typedef struct Node {int data; // 数据域struct Node* next; // 指向下一个结点的指针} Node;1.2 初始化线性表编写函数以初始化一个空的线性表。

void InitList(Node** head) {*head = (Node*)malloc(sizeof(Node));(*head)->next = NULL;}1.3 插入元素编写函数以在线性表的指定位置插入元素。

```C void Insert(Node* head, int pos, int data) { if (pos < 1) { printf(。

数据结构课程设计实验报告 完整版

数据结构课程设计实验报告 完整版

第一章链表的应用线性表是数据结构中最简单、最常用的一种线性结构,也是学习数据结构全部内容的基础,其掌握的好坏直接影响着后继课程的学习。

线性表的顺序存储结构,即顺序表的概念相对比较简单,因此,本章的主要任务是使用有关单链表的操作来实现通讯录信息系统的管理。

1.1设计要求本章的设计实验要求使用有关链表的操作来实现通讯录信息系统的管理。

为了验证算法,通讯录管理包括单通讯录链表的建立、通讯者的插入、通讯者的删除、通讯者的查询及通讯录表的输出等。

主控菜单的设计要求使用数字0—5来选择菜单项,其他输入则不起作用。

程序运行后,给出6个菜单项的内容和输入提示:1.通讯录链表的建立2. 通讯者结点的插入3. 通讯者结点的查询4. 通讯者结点的删除5. 通讯录链表的输出0. 退出管理系统请选择0—5:1.2设计分析1.2.1主控菜单函数设计分析1.实现循环和功能选择首先编写一个主控菜单驱动程序,输入0—5以进入相应选择项。

假设输入选择用变量sn存储,它作为menu_select函数的返回值给switch语句。

使用for循环实现重复选择,并在主函数main()中实现。

实际使用时,只有选择大于5或小于0的值,程序才能结束运行,这就要使用循环控制。

这里使用for循环语句实现菜单的循环选择,为了结束程序的运行,使用了“return”语句,也可以使用“exit(0);”语句。

2.得到sn的合理值如前所述,应该设计一个函数用来输出提示信息和处理输入,这个函数应该返回一个数值sn,以便供给switch语句使用。

假设函数名为menu_select,对于sn的输入值,在switch 中case语句对应数字1—5,对于不符合要求的输入,提示输入错误并要求重新输入。

将该函数与主函数合在一起,编译运行程序,即可检查并验证菜单选择是否正确。

1.2.2功能函数设计分析1.建立通讯录链表的设计这里实际上是要求建立一个带头结点的单链表。

建立单链表有两种方法,一种称之为头插法,另一种称为尾插法。

数据结构课程设计实践报告

数据结构课程设计实践报告

数据结构实验报告本文是范文,仅供参考写作,禁止抄袭本文内容上传提交,违者取消写作资格,成绩不合格!实验名称:排序算法比较提交文档学生姓名:提交文档学生学号:同组成员名单:指导教师姓名:排序算法比较一、实验目的和要求1、设计目的1.掌握各种排序的基本思想。

2.掌握各种排序方法的算法实现。

3.掌握各种排序方法的优劣分析及花费的时间的计算。

4.掌握各种排序方法所适应的不同场合。

2、设计内容和要求利用随机函数产生30000个随机整数,利用插入排序、起泡排序、选择排序、快速排序、堆排序、归并排序等排序方法进行排序,并统计每一种排序上机所花费的时间二、运行环境(软、硬件环境)软件环境:Vc6.0编程软件运行平台: Win32硬件:普通个人pc机三、算法设计的思想1、冒泡排序:bubbleSort()基本思想: 设待排序的文件为r[1..n]第1趟(遍):从r[1]开始,依次比较两个相邻记录的关键字r[i].key和r[i+1].key,若r[i].key>r[i+1].key,则交换记录r[i]和r[i+1]的位置;否则,不交换。

(i=1,2,...n-1)第1趟之后,n个关键字中最大的记录移到了r[n]的位置上。

第2趟:从r[1]开始,依次比较两个相邻记录的关键字r[i].key和r[i+1].key,若r[i].key>r[i+1].key,则交换记录r[i]和r[i+1]的位置;否则,不交换。

(i=1,2,...n-2)第2趟之后,前n-1个关键字中最大的记录移到了r[n-1]的位置上,作完n-1趟,或者不需再交换记录时为止。

2、选择排序:selSort()每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。

选择排序不像冒泡排序算法那样先并不急于调换位置,第一轮(k=1)先从array[k]开始逐个检查,看哪个数最小就记下该数所在的位置于minlIndex中,等一轮扫描完毕,如果找到比array[k-1]更小的元素,则把array[minlIndex]和a[k-1]对调,这时array[k]到最后一个元素中最小的元素就换到了array[k-1]的位置。

数据结构课程实验报告

数据结构课程实验报告

数据结构课程实验报告一、实验目的数据结构是计算机科学中一门重要的基础课程,通过本次实验,旨在加深对数据结构基本概念和算法的理解,提高编程能力和解决实际问题的能力。

具体目标包括:1、掌握常见数据结构(如数组、链表、栈、队列、树、图等)的基本操作和实现方法。

2、学会运用数据结构解决实际问题,培养算法设计和分析的能力。

3、提高程序设计的规范性和可读性,培养良好的编程习惯。

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

三、实验内容本次实验共包括以下几个部分:(一)线性表的实现与操作1、顺序表的实现定义一个顺序表结构体,包含数据元素数组和表的长度。

实现顺序表的初始化、插入、删除、查找等基本操作。

2、链表的实现定义链表节点结构体,包含数据域和指针域。

实现链表的创建、插入、删除、遍历等操作。

(二)栈和队列的实现与应用1、栈的实现采用顺序存储或链式存储实现栈。

实现栈的入栈、出栈、栈顶元素获取等操作,并应用于表达式求值。

2、队列的实现用循环队列或链式队列实现队列。

实现队列的入队、出队、队头元素获取等操作,应用于模拟排队系统。

(三)树的基本操作与遍历1、二叉树的实现定义二叉树节点结构体,包含数据域、左子树指针和右子树指针。

实现二叉树的创建、插入、删除节点等操作。

2、二叉树的遍历分别实现前序遍历、中序遍历和后序遍历,并输出遍历结果。

(四)图的表示与遍历1、邻接矩阵和邻接表表示图定义图的结构体,使用邻接矩阵和邻接表两种方式存储图的信息。

实现图的创建、添加边等操作。

2、图的遍历分别用深度优先搜索(DFS)和广度优先搜索(BFS)遍历图,并输出遍历序列。

四、实验步骤(一)线性表的实现与操作1、顺序表的实现首先,定义了一个结构体`SeqList` 来表示顺序表,其中包含一个整数数组`data` 用于存储数据元素,以及一个整数`length` 表示表的当前长度。

在初始化函数`InitSeqList` 中,将表的长度初始化为 0,并分配一定的存储空间给数组。

数据结构实验报告

数据结构实验报告

数据结构实验报告一、实验目的数据结构是计算机科学中重要的基础课程,通过本次实验,旨在深入理解和掌握常见数据结构的基本概念、操作方法以及在实际问题中的应用。

具体目的包括:1、熟练掌握线性表(如顺序表、链表)的基本操作,如插入、删除、查找等。

2、理解栈和队列的特性,并能够实现其基本操作。

3、掌握树(二叉树、二叉搜索树)的遍历算法和基本操作。

4、学会使用图的数据结构,并实现图的遍历和相关算法。

二、实验环境本次实验使用的编程环境为具体编程环境名称,编程语言为具体编程语言名称。

三、实验内容及步骤(一)线性表的实现与操作1、顺序表的实现定义顺序表的数据结构,包括数组和表的长度等。

实现顺序表的初始化、插入、删除和查找操作。

2、链表的实现定义链表的节点结构,包含数据域和指针域。

实现链表的创建、插入、删除和查找操作。

(二)栈和队列的实现1、栈的实现使用数组或链表实现栈的数据结构。

实现栈的入栈、出栈和栈顶元素获取操作。

2、队列的实现采用循环队列的方式实现队列的数据结构。

完成队列的入队、出队和队头队尾元素获取操作。

(三)树的实现与遍历1、二叉树的创建以递归或迭代的方式创建二叉树。

2、二叉树的遍历实现前序遍历、中序遍历和后序遍历算法。

3、二叉搜索树的操作实现二叉搜索树的插入、删除和查找操作。

(四)图的实现与遍历1、图的表示使用邻接矩阵或邻接表来表示图的数据结构。

2、图的遍历实现深度优先遍历和广度优先遍历算法。

四、实验结果与分析(一)线性表1、顺序表插入操作在表尾进行时效率较高,在表头或中间位置插入时需要移动大量元素,时间复杂度较高。

删除操作同理,在表尾删除效率高,在表头或中间删除需要移动元素。

2、链表插入和删除操作只需修改指针,时间复杂度较低,但查找操作需要遍历链表,效率相对较低。

(二)栈和队列1、栈栈的特点是先进后出,适用于函数调用、表达式求值等场景。

入栈和出栈操作的时间复杂度均为 O(1)。

2、队列队列的特点是先进先出,常用于排队、任务调度等场景。

数据结构 实验报告

数据结构 实验报告

数据结构实验报告一、实验目的数据结构是计算机科学中非常重要的一门课程,通过本次实验,旨在加深对常见数据结构(如链表、栈、队列、树、图等)的理解和应用,提高编程能力和解决实际问题的能力。

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

操作系统为 Windows 10。

三、实验内容1、链表的实现与操作创建一个单向链表,并实现插入、删除和遍历节点的功能。

对链表进行排序,如冒泡排序或插入排序。

2、栈和队列的应用用栈实现表达式求值,能够处理加、减、乘、除和括号。

利用队列实现银行排队系统的模拟,包括顾客的到达、服务和离开。

3、二叉树的遍历与操作构建一棵二叉树,并实现前序、中序和后序遍历。

进行二叉树的插入、删除节点操作。

4、图的表示与遍历用邻接矩阵和邻接表两种方式表示图。

实现图的深度优先遍历和广度优先遍历。

四、实验步骤及结果1、链表的实现与操作首先,定义了链表节点的结构体:```cppstruct ListNode {int data;ListNode next;ListNode(int x) : data(x), next(NULL) {}};```插入节点的函数:```cppvoid insertNode(ListNode& head, int val) {ListNode newNode = new ListNode(val);head = newNode;} else {ListNode curr = head;while (curr>next!= NULL) {curr = curr>next;}curr>next = newNode;}}```删除节点的函数:```cppvoid deleteNode(ListNode& head, int val) {if (head == NULL) {return;}ListNode temp = head;head = head>next;delete temp;return;}ListNode curr = head;while (curr>next!= NULL && curr>next>data!= val) {curr = curr>next;}if (curr>next!= NULL) {ListNode temp = curr>next;curr>next = curr>next>next;delete temp;}}```遍历链表的函数:```cppvoid traverseList(ListNode head) {ListNode curr = head;while (curr!= NULL) {std::cout << curr>data <<"";curr = curr>next;}std::cout << std::endl;}```对链表进行冒泡排序的函数:```cppvoid bubbleSortList(ListNode& head) {if (head == NULL || head>next == NULL) {return;}bool swapped;ListNode ptr1;ListNode lptr = NULL;do {swapped = false;ptr1 = head;while (ptr1->next!= lptr) {if (ptr1->data > ptr1->next>data) {int temp = ptr1->data;ptr1->data = ptr1->next>data;ptr1->next>data = temp;swapped = true;}ptr1 = ptr1->next;}lptr = ptr1;} while (swapped);}```测试结果:创建了一个包含 5、3、8、1、4 的链表,经过排序后,输出为 1 3 4 5 8 。

数据结构实验报告目的(3篇)

数据结构实验报告目的(3篇)

第1篇一、引言数据结构是计算机科学中一个重要的基础学科,它研究如何有效地组织、存储和操作数据。

在计算机科学中,数据结构的选择直接影响到算法的效率、存储空间和程序的可维护性。

为了使学生在实际操作中更好地理解数据结构的概念、原理和应用,本实验报告旨在明确数据结构实验的目的,指导学生进行实验,并总结实验成果。

二、实验目的1. 理解数据结构的基本概念和原理通过实验,使学生深入理解数据结构的基本概念,如线性表、栈、队列、树、图等,掌握各种数据结构的定义、性质和特点。

2. 掌握数据结构的存储结构及实现方法实验过程中,使学生熟悉各种数据结构的存储结构,如顺序存储、链式存储等,并掌握相应的实现方法。

3. 培养编程能力通过实验,提高学生的编程能力,使其能够熟练运用C、C++、Java等编程语言实现各种数据结构的操作。

4. 提高算法设计能力实验过程中,要求学生根据实际问题设计合适的算法,提高其算法设计能力。

5. 培养实际应用能力通过实验,使学生将所学知识应用于实际问题,提高解决实际问题的能力。

6. 培养团队合作精神实验过程中,鼓励学生进行团队合作,共同完成实验任务,培养团队合作精神。

7. 提高实验报告撰写能力通过实验报告的撰写,使学生学会总结实验过程、分析实验结果,提高实验报告撰写能力。

三、实验内容1. 线性表实验(1)实现线性表的顺序存储和链式存储结构;(2)实现线性表的基本操作,如插入、删除、查找等;(3)比较顺序存储和链式存储的优缺点。

2. 栈和队列实验(1)实现栈和队列的顺序存储和链式存储结构;(2)实现栈和队列的基本操作,如入栈、出栈、入队、出队等;(3)比较栈和队列的特点及适用场景。

3. 树和图实验(1)实现二叉树、二叉搜索树、图等数据结构的存储结构;(2)实现树和图的基本操作,如遍历、插入、删除等;(3)比较不同树和图结构的优缺点及适用场景。

4. 查找算法实验(1)实现二分查找、顺序查找、哈希查找等查找算法;(2)比较不同查找算法的时间复杂度和空间复杂度;(3)分析查找算法在实际应用中的适用场景。

数据结构课程实验报告

数据结构课程实验报告

数据结构课程实验报告一、实验目的。

本次实验旨在通过对数据结构课程所学知识的应用,加深对数据结构相关算法和数据操作的理解,提高学生的编程能力和实际应用能力。

二、实验内容。

1. 实现顺序表、链表、栈、队列等数据结构的基本操作;2. 设计并实现数据结构相关算法,如查找、排序等;3. 进行实验数据的输入、输出和结果展示;4. 对实验结果进行分析和总结。

三、实验过程。

1. 针对顺序表、链表、栈、队列等数据结构,首先进行了相关操作的实现。

在实现过程中,需要考虑数据结构的特点和操作规则,确保操作的正确性和高效性。

2. 针对数据结构相关算法,如查找、排序等,设计并实现了相应的算法。

在实现过程中,需要考虑算法的时间复杂度和空间复杂度,确保算法的效率和稳定性。

3. 进行了实验数据的输入、输出和结果展示。

通过编写测试用例,对实现的数据结构和算法进行了测试,验证其正确性和可靠性。

4. 对实验结果进行了分析和总结。

通过对实验数据和测试结果的分析,总结了实验中遇到的问题和解决方法,以及实验的收获和体会。

四、实验结果。

经过实验测试,实现的数据结构和算法均能正确运行并得到预期的结果。

通过实验,加深了对数据结构相关知识的理解,提高了编程能力和实际应用能力。

五、实验总结。

本次实验使我对数据结构相关知识有了更深入的理解,同时也提高了我的编程能力和实际应用能力。

在未来的学习和工作中,我将继续努力,不断提升自己的能力,为将来的发展打下坚实的基础。

六、实验感想。

通过本次实验,我深刻感受到了数据结构在实际应用中的重要性,也意识到了自己在数据结构方面的不足之处。

在今后的学习和工作中,我将更加努力地学习和应用数据结构知识,不断提高自己的能力,为未来的发展做好充分的准备。

七、参考文献。

1. 《数据结构与算法分析》。

2. 《C语言程序设计》。

3. 《数据结构课程实验指导书》。

以上就是本次数据结构课程实验的报告内容,希望能对大家有所帮助。

感谢您的阅读!。

数据结构课程设计实验报告

数据结构课程设计实验报告

1)问题描述1.建立包含学生基本信息、课程、选课记录的学生信息管理系统;2.完成对三个文件的读写操作;3.实现对三个对象的综合查询;4.建立对误操作的反馈机制。

2)解题思路这次程序设计我首先是按照学生学籍管理的思路先单独设计出了学生基本信息的录入、删除等功能,然后以此为模版设计出课程和选课的录入、删除等功能。

在完成上述功能后进行综合查询的设计,最后对学号、年龄、性别等编写一些限制性输入语句。

3)算法描述欢迎界面主菜单录入删除查询信息修改退出/保存4)程序设计#include<stdio.h>#include<string.h>#include<stdlib.h>#include<iostream>#include<fstream>#include<sstream>#include<iomanip>using namespace std;#define PF printf#define SF scanfstatic int n=0,m=0,o=0;//创建************************************************创建struct Student{int Sno;string Sname;string Ssex;int Sage;string Sdept;}stud[200]; //学生struct Course{int Cno;string Cname;float Ccredit;}cou[200];//课程struct SC{int Sno;int Cno;int Grade;}sc[200];//选课//读取************************************************读取void Read1(){char ch;int flag=0;ifstream if1;if1.open("student.txt");while((ch=if1.get())!=EOF){if1.seekg(flag*29);if1>>stud[n].Sno;if1>>stud[n].Sname;if1>>stud[n].Ssex;if1>>stud[n].Sage;if1>>stud[n].Sdept;n++;flag++;}if1.close();}//读取学生文件void Read2(){//读取课程文件}void Read3(){char ch;int flag=0;ifstream if3;if3.open("SC.txt");while((ch=if3.get())!=EOF){if3.seekg(19*flag);if3>>sc[o].Sno;if3>>sc[o].Cno;if3>>sc[o].Grade;o++;flag++;}if3.close();}//读取选课文件//添加***********************************************添加void Add1(){char j='Y';int h;while(j=='y'||j=='Y'){int b=0;system("cls"); /*清屏*/PF("\n");PF("\n请输入要添加的学号(8位):");while(b==0){int a=0;while(scanf("%u",&h)!=1||h<9999999||h>99999999||h==9999999.9){while(getchar()!='\n')//把缓冲区的字符全部拿走continue;printf("请输入8位正整数:");}//***********************************只允许输入8位整数for(int i=0;i<m;i++)if(h==stud[i].Sno){PF("编号重复,请重新输入:");a=1;break;}if(a!=1) {b=1;stud[n].Sno=h;}}//********************************判断添加的学号是否已经存在PF("\n请输入要添加的姓名:");cin>>stud[n].Sname;PF("\n请输入要添加的性别(男/女):");cin>>stud[n].Ssex;while(stud[n].Ssex!="男"&&stud[n].Ssex!="女"){PF("请输入正确的性别(男/女):");cin>>stud[n].Ssex;}PF("\n请输入要添加的年龄:");while(scanf("%u",&stud[n].Sage)!=1||stud[n].Sage<1||stud[n].Sage>150){while(getchar()!='\n')//把缓冲区的字符全部拿走continue;printf("请输入有效真实年龄:");}PF("\n请输入要添加的院系:");cin>>stud[n].Sdept;n++;PF("是否继续(Y/N)?:");getchar();j=getchar();}}//*******************添加学生的基本信息void Add2(){添加课程的基本信息}void Add3(){char j='Y';while(j=='y'||j=='Y'){system("cls"); /*清屏*/PF("\n");int b=0;while(b==0){int a=0;while(a==0){PF("\n请输入要添加学生的学号:");while(scanf("%u",&sc[o].Sno)!=1||sc[o].Sno<9999999 ||sc[o].Sno>99999999||sc[o].Sno==9999999.9) {while(getchar()!='\n')//把缓冲区的字符全部拿走continue;printf("请输入8位正整数:");}for(int i=0;i<n;i++)if(stud[i].Sno==sc[o].Sno){a=1;break;}if(a==0){PF("此学生不存在,请重新输入!\n");}//****************判断添加选课记录的学生是否存在}int c=0;while(c==0){PF("\n请输入要添加课程的编号:");while(scanf("%u",&sc[o].Cno)!=1||sc[o].Cno<0){while(getchar()!='\n')//把缓冲区的字符全部拿走continue;printf("请输入正整数:");}for(int i=0;i<n;i++)if(cou[i].Cno==sc[o].Cno){c=1;break;}if(c==0) PF("此课程不存在,请重新输入!\n");}//*******************判断添加选课记录的课程是否存在for(int i=0;i<o;i++){if(sc[i].Cno==sc[o].Cno&&sc[i].Sno==sc[o].Sno){printf("记录重复,请重新输入!\n");break;}}//***********************判断添加的选课记录是否重复if(i==o){PF("\n请输入要添加学生本课程的成绩:");while(scanf("%u",&sc[o].Grade)!=1||sc[o].Grade<0||sc[o].Grade>100){while(getchar()!='\n')//把缓冲区的字符全部拿走continue;printf("请输入有效的成绩:");}o++;b=1;break;}}PF("是否继续(Y/N)?:");getchar();j=getchar();}}//******************添加选课记录//删除*********************************删除void Del1(){int k=0,h,i;char j='Y';while(j=='y'||j=='Y'){system("cls"); /*清屏*/PF("\n请输入要删除的学号:");while(scanf("%u",&h)!=1||h<9999999||h>99999999||h==9999999.9){while(getchar()!='\n')//把缓冲区的字符全部拿走continue;printf("请输入8位正整数:");}for(i=0;i<n;i++)if(h==stud[i].Sno){PF(" 学号姓名性别年龄院系\n");cout<<setw(8)<<stud[i].Sno<<setw(14)<<stud[i].Sname<<setw(8)<<stud[i].Ssex<<setw(8)<<stud[i].Sage<<setw(8)<<stud[i].Sdept<<endl;k=1;break;//*查找记录}//***************************展示要删除的学生的基本信息if(k==1){PF("确定要删除此人吗?Y/N\n");getchar();char a=getchar();switch(a){case 'Y':case 'y'://****************询问是否删除{for(k=i;k<n-1;k++){stud[k]=stud[k+1];}n--;PF("此人基本信息已删除\n\n");/*删除记录*/for(i=0;i<o;i++){if(h==sc[i].Sno){for(k=i;k<o;k++){sc[k]=sc[k+1];}i--;o--;}else continue;}//****************删除此人的选课记录PF("此人相关信息已删除\n\n");}}}elsePF("找不到要删除的记录!\n");getchar();PF("是否继续(Y/N)?:");j=getchar();}}//**********************删除学生void Del2(){删除课程记录;}void Del3(){int k=0,a,b,i;char j='Y';while(j=='y'||j=='Y'){system("cls");PF("\n请输入要删除选课学生的学号:");while(scanf("%u",&a)!=1||a<9999999||a>99999999||a!=9999999.9){while(getchar()!='\n')//把缓冲区的字符全部拿走continue;printf("请输入8位正整数:");}PF("\n请输入要删除选课课程的编号:");while(scanf("%u",&b)!=1||b<0){while(getchar()!='\n')//把缓冲区的字符全部拿走continue;printf("请输入正整数:");}for(i=0;i<o;i++)if(a==sc[i].Sno&&b==sc[i].Cno){PF(" 学号课程编号成绩\n");cout<<setw(8)<<sc[i].Sno<<setw(8)<<sc[i].Cno<<setw(8)<<sc[i].Grade<<endl;k=1;break;}//********************查找并展示要删除的选课记录if(k==1){PF("确定要删除此选课记录吗?Y/N\n");getchar();char b=getchar();switch(b){case 'Y':case 'y'://询问是否删除{for(k=i;k<o-1;k++){sc[k]=sc[k+1];}o--;PF("此项选课信息已删除\n\n");}}}else PF("找不到要删除的记录!\n");getchar();PF("是否继续(Y/N)?:");j=getchar();}}//*******************删除选课记录//查询*********************************************查询void Find1(){int i,k,s=0;char j='Y';while(j=='y'||j=='Y'){s=0;system("cls"); /*清屏*/PF("\n请输入要查询的学号: ");while(scanf("%u",&k)!=1||k<9999999||k>99999999||k==9999999.9){while(getchar()!='\n')//把缓冲区的字符全部拿走continue;printf("请输入8位正整数:");}for(i=0;i<n;i++)if(k==stud[i].Sno){PF(" 学号姓名性别年龄院系\n");cout<<setw(8)<<stud[i].Sno<<setw(14)<<stud[i].Sname<<setw(8)<<stud[i].Ssex <<setw(8)<<stud[i].Sage<<setw(8)<<stud[i].Sdept<<endl;s=1;}if(s==0) PF("查无此人!\n");getchar();PF("是否继续(Y/N)?:");j=getchar();}}//********************************学生基本信息查找void Find2(){课程信息查找;}void Find3(){int k=0,a,b;char j='y';while(j=='y'||j=='Y'){system("cls"); /*清屏*/PF("\n请输入要修改选课记录学生学号:");while(scanf("%u",&a)!=1||a<9999999||a>99999999||a==9999999.9){while(getchar()!='\n')//把缓冲区的字符全部拿走continue;printf("请输入8位正整数:");}PF("\n请输入要修改选课记录的课程编号:");while(scanf("%u",&b)!=1||b<0){while(getchar()!='\n')//把缓冲区的字符全部拿走continue;printf("请输入正整数:");}getchar();for(int i=0;i<m;i++)if(a==sc[i].Sno&&b==sc[i].Cno) { k=1;break; } /*查找*/if(k==1) /*修改*/{PF(" 学号课程编号成绩\n");cout<<setw(8)<<sc[i].Sno<<setw(8)<<sc[i].Cno<<setw(8)<<sc[i].Grade<<endl;}else PF("找不到要修改的记录!\n");getchar();PF("是否继续(Y/N)?:");j=getchar();}}//**********************************选课信息查找void Find3_1(){int i,k,s=0;char j='Y';while(j=='y'||j=='Y'){s=0;system("cls"); /*清屏*/PF("\n请输入要查询的学号: ");while(scanf("%u",&k)!=1||k<9999999||k>99999999||k==9999999.9){while(getchar()!='\n')//把缓冲区的字符全部拿走continue;printf("请输入8位正整数:");}for(i=0;i<n;i++)if(k==stud[i].Sno){PF(" 学号姓名性别年龄院系\n");cout<<setw(8)<<stud[i].Sno<<setw(14)<<stud[i].Sname<<setw(8)<<stud[i].Ssex<<setw(8)<<stud[i].Sage<<setw(8)<<stud[i].Sdept<<endl;s=1;PF("\n他(她)选的课程及成绩为:\n");PF("课程编号课程名称成绩\n");for(i=0;i<o;i++){if(sc[i].Sno==k){int j=0;while(j<m){if(sc[i].Cno==cou[j].Cno)cout<<setw(8)<<sc[i].Cno<<setw(14)<<cou[j].Cname<<setw(8)<<sc[i].Grade<<endl;j++;}}}}if(s==0) PF("查无此人!\n");getchar();PF("是否继续(Y/N)?:");j=getchar();}}//**********************综合查找:通过学号查学生的所有选课记录void Find3_2_1(){int i,k,s=0;char j='Y';while(j=='y'||j=='Y'){system("cls"); /*清屏*/PF("\n请输入年龄: ");while(scanf("%u",&k)!=1||k<1||k>150){while(getchar()!='\n')//把缓冲区的字符全部拿走continue;printf("请输入有效真实年龄:");}PF(" 学号姓名性别年龄院系\n");for(i=0;i<n;i++){if(stud[i].Sage>k)cout<<setw(8)<<stud[i].Sno<<setw(14)<<stud[i].Sname<<setw(8)<<stud[i].Ssex<<setw(8)<<stud[i].Sage<<setw(8)<<stud[i].Sdept<<endl;}getchar();PF("是否继续(Y/N)?:");j=getchar();}}//******************综合查找:通过年龄查找符合条件的学生(大于)void Find3_2_2(){综合查找:通过年龄查找符合条件的学生(等于);}void Find3_2_3(){综合查找:通过年龄查找符合条件的学生(小于);}void Find3_3_1(){PF(" 学号姓名性别年龄院系\n");for(int i=0;i<n;i++){if(stud[i].Ssex=="男")cout<<setw(8)<<stud[i].Sno<<setw(14)<<stud[i].Sname<<setw(8)<<stud[i].Ssex <<setw(8)<<stud[i].Sage<<setw(8)<<stud[i].Sdept<<endl;}PF("按回车键返回!");getchar();getchar();}//*****************综合查找:通过性别查找符合条件的学生(男生)void Find3_3_2(){综合查找:通过性别查找符合条件的学生(女生);}void Find3_4(){int i,k,s=0;char j='Y';while(j=='y'||j=='Y'){s=0;system("cls"); /*清屏*/PF("\n请输入要查询的课程编号: ");while(scanf("%u",&k)!=1||k<0){while(getchar()!='\n')//把缓冲区的字符全部拿走continue;printf("请输入正整数:");}for(i=0;i<n;i++)if(k==cou[i].Cno){PF(" 编号课程名称学分\n");cout<<setw(4)<<cou[i].Cno<<setw(14)<<cou[i].Cname<<setw(8)<<cou[i].Ccredit<<endl;;s=1;PF("\n这门课程各学生成绩为:\n");PF("学号姓名成绩\n");for(i=0;i<o;i++){if(sc[i].Cno==k){int j=0;while(j<m){if(sc[i].Sno==stud[j].Sno)cout<<setw(8)<<sc[i].Sno<<setw(14)<<stud[j].Sname<<setw(8)<<sc[i].Grade<<endl;j++;}}}}if(s==0) PF("没有这门课!\n");getchar();PF("是否继续(Y/N)?:");j=getchar();}}//***************综合查找:通过课程编号查找所有选此课的学生//信息*************************信息void Show1(){int k,i;struct Student t;system("cls"); /*清屏*/PF(" 学号姓名性别年龄院系\n");for(k=0;k<n-1;k++)for(i=0;i<n-k-1;i++)if(stud[i].Sno>stud[i+1].Sno){t=stud[i];stud[i]=stud[i+1];stud[i+1]=t;}else continue;//**************按学号进行排序for(i=0;i<=n;i++)if(stud[i].Sno!=0)cout<<setw(8)<<stud[i].Sno<<setw(14)<<stud[i].Sname<<setw(8)<<stud[i].Ssex <<setw(8)<<stud[i].Sage<<setw(8)<<stud[i].Sdept<<endl;PF("按回车键返回!");getchar();getchar();}//***********************************展示学生信息void Show2(){展示课程信息;}void Show3(){展示选课信息;}//修改******************************************修改void Change1(){int k=0,a;char j='y';while(j=='y'||j=='Y'){system("cls"); /*清屏*/PF("\n请输入要修改学生记录的学号:");while(scanf("%u",&a)!=1||a<9999999||a>99999999){while(getchar()!='\n')//把缓冲区的字符全部拿走continue;printf("请输入8位正整数:");}getchar();for(int i=0;i<n;i++)if(a==stud[i].Sno) { k=1;break; } /*查找*/if(k==1) /*修改*/{PF("\n");PF("\n请输入修改后的姓名:");cin>>stud[i].Sname;PF("\n请输入修改后的性别(男/女):");cin>>stud[i].Ssex;while(stud[i].Ssex!="男"&&stud[i].Ssex!="女"){PF("请输入正确的性别(男/女):");cin>>stud[i].Ssex;}PF("\n请输入修改后的年龄:");while(scanf("%u",&stud[i].Sage)!=1||stud[i].Sage<1||stud[i].Sage>150){while(getchar()!='\n')//把缓冲区的字符全部拿走continue;printf("请输入有效真实年龄:");}PF("\n请输入修改后的院系:");cin>>stud[i].Sdept;PF("修改成功\n");}else PF("找不到要修改的记录!\n");getchar();PF("是否继续(Y/N)?:");j=getchar();}}//**********************修改学生基本信息void Change2(){修改课程信息;}void Change3(){int k=0,a,b;char j='y';while(j=='y'||j=='Y'){system("cls"); /*清屏*/PF("\n请输入要修改选课记录学生学号:");while(scanf("%u",&a)!=1||a<9999999||a>99999999){while(getchar()!='\n')//把缓冲区的字符全部拿走continue;printf("请输入8位正整数:");}PF("\n请输入要修改选课记录的课程编号:");while(scanf("%u",&b)!=1||b<0){while(getchar()!='\n')//把缓冲区的字符全部拿走continue;printf("请输入正整数:");}getchar();for(int i=0;i<m;i++)if(a==sc[i].Sno&&b==sc[i].Cno) { k=1;break; } /*查找*/if(k==1) /*修改*/{PF("\n");PF("\n请输入修改后的学生课程成绩:");while(scanf("%u",&sc[i].Grade)!=1||sc[i].Grade<0||sc[i].Grade>100){while(getchar()!='\n')//把缓冲区的字符全部拿走continue;printf("请输入有效的成绩:");}PF("修改成功\n");}else PF("找不到要修改的记录!\n");getchar();PF("是否继续(Y/N)?:");j=getchar();}}//********************************修改选课信息//主函数**************************************主函数void main(){Read1();Read2();Read3();int s=0;PF("\n\n\n\n\n\n\t\t\t 欢迎使用学生信息管理系统");PF("\n\n\n\n\n\t按回车键进入主菜单:");getchar();while(s==0){char j='\n';while(j=='\n'){system("cls");PF("\n\n\n\n\t\t\t\t ************\n");PF("\t\t\t\t * 主菜单*\n");PF("\t\t\t\t ************\n");PF("\t\t 1: 录入2: 删除\n\n");PF("\t\t 3: 查询4: 信息\n\n");PF("\t\t 5: 修改6: 保存退出\n\n");PF("\t 请选择[1/2/3/4/5/6]: ");j=getchar();}switch(j){case '1':{system("cls");录入次级菜单;getchar();char k=getchar();switch(k){case 'a': Add1();break;case 'b': Add2();break;case 'c': Add3();break;}}break;/*返回主菜单*/case '2':{system("cls");删除次级菜单;getchar();char k=getchar();switch(k){case 'a': Del1();break;case 'b': Del2();break;case 'c': Del3();break;}}break;/*返回主菜单*/case '3':{system("cls");查询次级菜单;getchar();char k=getchar();switch(k){case 'a': Find1();break;case 'b': Find2();break;case 'c': Find3();break;case 'd':{system("cls");综合次级查询菜单;getchar();char k=getchar();switch(k){case 'a': Find3_1();break;case 'b':{system("cls");年龄次级查询菜单;getchar();char k=getchar();switch(k){case 'a': Find3_2_1();break;case 'b': Find3_2_2();break;case 'c': Find3_2_3();break;}}break;case 'c':{system("cls");性别次级查询菜单;getchar();char k=getchar();switch(k){case 'a': Find3_3_1();break;case 'b': Find3_3_2();break;}}break;case 'd': Find3_4();break;}}}break;/*返回主菜单*/}break;case '4':{system("cls");信息次级菜单;getchar();char k=getchar();switch(k){case 'a': Show1();break;case 'b': Show2();break;case 'c': Show3();break;}}break;case '5':{system("cls");修改次级菜单;getchar();char k=getchar();switch(k){case 'a': Change1();break;case 'b': Change2();break;case 'c': Change3();break;}}break;case '6':{FILE *fp1;if((fp1=fopen("Student.txt","w"))==NULL){printf("Cannot open the file!");exit(0);}for(int i=0;i<n;i++){if(stud[i].Sno!=0)fprintf(fp1,"%9d%9s%3s%3d%3s\n",stud[i].Sno,stud[i].Sname.c_str(),stud[i].Ssex.c_str(),stud[i].Sage,stud[i].Sdept.c_str());}fclose(fp1);//**************将学生信息写入Student.txt将课程信息写入Course.txt;将选课信息写入SC.txt;exit(0);//*********退出系统}default:break;//在主菜单或次级菜单输入不符合的信息时返回主菜单}}}5)测试结果欢迎界面:主菜单:录入:录入学生:录入选课:删除:删除学生:综合查询:按学号查找学生成绩综合查询:按课程编号查找选课学生修改学生基本信息:学生信息展示:课程信息展示:选课记录展示:Student.txt:Course.txt:SC.txt:6)设计总结在这次数据结构中,让我感觉最困难的是对三个文件的读写操作,因为在这之前自己从未有过这方面的训练,这从我的读写程序中也可以看出来:读取文件(Read())用的是C++里的ifsteam(这是我室友教我的),而写入文件我用的是C中的FILE。

数据结构课程实验报告

数据结构课程实验报告

数据结构课程实验报告一、实验目的本次数据结构课程实验的主要目的是通过实践掌握常见数据结构的基本操作,包括线性结构、树形结构和图形结构。

同时,也要求学生能够熟练运用C++语言编写程序,并且能够正确地使用各种算法和数据结构解决具体问题。

二、实验内容本次实验涉及到以下几个方面:1. 线性表:设计一个线性表类,并且实现线性表中元素的插入、删除、查找等基本操作。

2. 栈和队列:设计一个栈类和队列类,并且分别利用这两种数据结构解决具体问题。

3. 二叉树:设计一个二叉树类,并且实现二叉树的遍历(前序遍历、中序遍历和后序遍历)。

4. 图论:设计一个图类,并且利用图论算法解决具体问题(如最短路径问题)。

三、实验过程1. 线性表首先,我们需要设计一个线性表类。

在这个类中,我们需要定义一些成员变量(如线性表大小、元素类型等),并且定义一些成员函数(如插入元素函数、删除元素函数等)。

在编写代码时,我们需要注意一些细节问题,如边界条件、异常处理等。

2. 栈和队列接下来,我们需要设计一个栈类和队列类。

在这两个类中,我们需要定义一些成员变量(如栈顶指针、队头指针等),并且定义一些成员函数(如入栈函数、出栈函数、入队函数、出队函数等)。

在编写代码时,我们需要注意一些细节问题,如空间不足的情况、空栈或空队列的情况等。

3. 二叉树然后,我们需要设计一个二叉树类,并且实现二叉树的遍历。

在这个类中,我们需要定义一个节点结构体,并且定义一些成员变量(如根节点指针、节点数量等),并且定义一些成员函数(如插入节点函数、删除节点函数、遍历函数等)。

在编写代码时,我们需要注意一些细节问题,如递归调用的情况、空节点的情况等。

4. 图论最后,我们需要设计一个图类,并且利用图论算法解决具体问题。

在这个类中,我们需要定义一个邻接矩阵或邻接表来表示图形结构,并且定义一些成员变量(如顶点数量、边的数量等),并且定义一些成员函数(如添加边函数、删除边函数、最短路径算法等)。

数据结构课程实验报告

数据结构课程实验报告

数据结构课程实验报告数据结构课程实验报告引言:数据结构是计算机科学中非常重要的一门课程,它研究了数据的组织、存储和管理方法。

在数据结构课程中,我们学习了各种数据结构的原理和应用,并通过实验来加深对这些概念的理解。

本文将对我在数据结构课程中的实验进行总结和分析。

实验一:线性表的实现与应用在这个实验中,我们学习了线性表这种基本的数据结构,并实现了线性表的顺序存储和链式存储两种方式。

通过实验,我深刻理解了线性表的插入、删除和查找等操作的实现原理,并掌握了如何根据具体应用场景选择合适的存储方式。

实验二:栈和队列的实现与应用栈和队列是两种常见的数据结构,它们分别具有后进先出和先进先出的特点。

在这个实验中,我们通过实现栈和队列的操作,加深了对它们的理解。

同时,我们还学习了如何利用栈和队列解决实际问题,比如迷宫求解和中缀表达式转后缀表达式等。

实验三:树的实现与应用树是一种重要的非线性数据结构,它具有层次结构和递归定义的特点。

在这个实验中,我们学习了二叉树和二叉搜索树的实现和应用。

通过实验,我掌握了二叉树的遍历方法,了解了二叉搜索树的特性,并学会了如何利用二叉搜索树实现排序算法。

实验四:图的实现与应用图是一种复杂的非线性数据结构,它由节点和边组成,用于表示事物之间的关系。

在这个实验中,我们学习了图的邻接矩阵和邻接表两种存储方式,并实现了图的深度优先搜索和广度优先搜索算法。

通过实验,我深入理解了图的遍历方法和最短路径算法,并学会了如何利用图解决实际问题,比如社交网络分析和地图导航等。

实验五:排序算法的实现与比较排序算法是数据结构中非常重要的一部分,它用于将一组无序的数据按照某种规则进行排列。

在这个实验中,我们实现了常见的排序算法,比如冒泡排序、插入排序、选择排序和快速排序等,并通过实验比较了它们的性能差异。

通过实验,我深入理解了排序算法的原理和实现细节,并了解了如何根据具体情况选择合适的排序算法。

结论:通过这些实验,我对数据结构的原理和应用有了更深入的理解。

数据结构实验报告(实验)

数据结构实验报告(实验)

数据结构实验报告(实验)数据结构实验报告(实验)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. 实验目的本次实验的主要目的是通过实际操作,掌握数据结构的基本概念、操作和应用。

通过对实验内容的了解和实际操作,达到对数据结构相关知识的深入理解和掌握。

2. 实验工具与环境本次实验主要使用C++语言进行编程,需要搭建相应的开发环境。

实验所需的工具和环境包括:C++编译器、集成开发环境(IDE)等。

3. 实验内容本次实验主要包括以下内容:3.1. 实现顺序存储结构的线性表3.2. 实现链式存储结构的线性表3.3. 实现栈和队列的顺序存储结构和链式存储结构3.4. 实现二叉树的顺序存储结构和链式存储结构3.5. 实现图的邻接矩阵和邻接表表示4. 实验步骤实验进行的具体步骤如下:4.1. 实现顺序存储结构的线性表- 定义数据结构- 实现插入、删除、查找等操作4.2. 实现链式存储结构的线性表- 定义数据结构- 实现插入、删除、查找等操作4.3. 实现栈和队列的顺序存储结构和链式存储结构- 定义数据结构- 实现入栈、出栈、入队、出队操作4.4. 实现二叉树的顺序存储结构和链式存储结构- 定义数据结构- 实现插入、删除、查找等操作4.5. 实现图的邻接矩阵和邻接表表示- 定义数据结构- 实现插入、删除、查找等操作5. 实验结果与分析通过对以上实验内容的实现和操作,得到了以下实验结果与分析: 5.1. 顺序存储结构的线性表- 实现了线性表的插入、删除、查找等操作- 通过实验数据进行性能分析,得出了相应的性能指标5.2. 链式存储结构的线性表- 实现了线性表的插入、删除、查找等操作- 通过实验数据进行性能分析,得出了相应的性能指标5.3. 栈和队列的顺序存储结构和链式存储结构- 实现了栈和队列的入栈、出栈、入队、出队操作- 通过实验数据进行性能分析,得出了相应的性能指标5.4. 二叉树的顺序存储结构和链式存储结构- 实现了二叉树的插入、删除、查找等操作- 通过实验数据进行性能分析,得出了相应的性能指标5.5. 图的邻接矩阵和邻接表表示- 实现了图的插入、删除、查找等操作- 通过实验数据进行性能分析,得出了相应的性能指标6. 总结与展望通过本次数据结构课程的实验,我们深入了解并掌握了数据结构的基本概念、操作和应用。

数据结构实习报告(共8篇)

数据结构实习报告(共8篇)

数据结构实习报告(共8篇)数据结构实习报告(共8篇)第1篇:数据结构实_报告附件:实_报告格式,如下:数据结构实_报告班级:姓名:xxx(1514)xxx(1514)xxx(1514)指导教师:日期:题目一、问题描述(把你所选的题目及要求说一下)二、概要设计(抽象数据类型定义)三、详细设计(主要算法和函数间的调用关系)四、调试分析(调式过程中出现的问题及如何改正)五、心得体会(组内成员的分工及实_期间的体会)六、用户手册(系统的使用方法介绍)可参照_题集上的实_报告格式。

第2篇:数据结构实_报告数据结构实_报告班级:13软件二班姓名:殷健学号:1345536225子集和数问题1:问题描述子集和数问题1:子集和问题的为W,c。

其中,W=w1,w2,.,wn是一个正整数的集合,子集和数问题判定是否存在W的一个子集W1,使得W1=cW(02:问题分析程序中设计了函数voidputeSumofSub(ints,intk,intr),其意义是从第k项开始,如果s(已经决策的和数)和wk(当前元素)之和为和数,就把结果输出来,否则如果s与,wk,wk+1之和小于和数,则调用puteSumofsub(s+wk,k+1,r-wk),意为选择此结点的左分支,再判断s和后面所有元素之和是否不小于M(所有的加起来都小,必定无解),并且s+wk+1M,也是无解),若条件符合即调用puteSumofSub(s,k+1,r-wk),即选择当前结点的右分支。

算法展示:#includeusingnamespacestd;#include#include#defineM50claSu mOfSubprivate:intwM;intm;intxM;public:SumOfSub(inta,intb, intn)for(inti=0;i=mvoidmain()intsum=0;intwM;srand(unsigne d)time(NULL);for(inti=0;icoutcoutcoutm;sum=m*sum;cout复杂性分析:对于不同的输入结果,算法的执行次数有所不同,最好情况是n,最坏情况是n*2n。

数据结构课程实验报告

数据结构课程实验报告

数据结构课程实验报告目录1. 实验简介1.1 实验背景1.2 实验目的1.3 实验内容2. 实验方法2.1 数据结构选择2.2 算法设计2.3 程序实现3. 实验结果分析3.1 数据结构性能分析3.2 算法效率比较3.3 实验结论4. 实验总结1. 实验简介1.1 实验背景本实验是数据结构课程的一次实践性操作,旨在帮助学生加深对数据结构的理解和运用。

1.2 实验目的通过本实验,学生将学会如何选择合适的数据结构来解决特定问题,了解数据结构与算法设计的关系并能将其应用到实际问题中。

1.3 实验内容本实验将涉及对一些经典数据结构的使用,如链表、栈、队列等,并结合具体问题进行算法设计和实现。

2. 实验方法2.1 数据结构选择在实验过程中,需要根据具体问题选择合适的数据结构,比如针对需要频繁插入删除操作的情况可选择链表。

2.2 算法设计针对每个问题,需要设计相应的算法来实现功能,要考虑算法的效率和实际应用情况。

2.3 程序实现根据算法设计,编写相应的程序来实现功能,并进行调试测试确保程序能够正确运行。

3. 实验结果分析3.1 数据结构性能分析在实验过程中,可以通过对不同数据结构的使用进行性能分析,如时间复杂度和空间复杂度等,以便选择最优的数据结构。

3.2 算法效率比较实验完成后,可以对不同算法在同一数据结构下的效率进行比较分析,找出最优算法。

3.3 实验结论根据实验结果分析,得出结论并总结经验教训,为后续的数据结构和算法设计提供参考。

4. 实验总结通过本次实验,学生将对数据结构与算法设计有更深入的了解,并能将所学知识应用到实际问题中,提高自己的实践能力和解决问题的能力。

数据结构实验报告

数据结构实验报告

数据结构实验报告一、实验目的数据结构是计算机科学中的重要基础课程,通过实验可以更深入地理解和掌握数据结构的概念、原理和应用。

本次实验的主要目的包括:1、熟悉常见的数据结构,如链表、栈、队列、树和图等。

2、掌握数据结构的基本操作,如创建、插入、删除、遍历等。

3、提高编程能力和解决实际问题的能力,能够运用合适的数据结构解决具体的问题。

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

三、实验内容1、链表的实现与操作单向链表的创建、插入和删除节点。

双向链表的实现和基本操作。

循环链表的特点和应用。

2、栈和队列的实现栈的后进先出特性,实现入栈和出栈操作。

队列的先进先出原则,完成入队和出队功能。

3、树的操作二叉树的创建、遍历(前序、中序、后序)。

二叉搜索树的插入、查找和删除操作。

4、图的表示与遍历邻接矩阵和邻接表表示图。

深度优先搜索和广度优先搜索算法的实现。

四、实验步骤及结果1、链表的实现与操作单向链表:首先,定义了链表节点的结构体,包含数据域和指向下一个节点的指针域。

通过创建链表头节点,并使用循环依次插入新节点,实现了链表的创建。

插入节点时,根据指定位置找到插入点的前一个节点,然后修改指针完成插入操作。

删除节点时,同样找到要删除节点的前一个节点,修改指针完成删除。

实验结果:成功创建、插入和删除了单向链表的节点,并正确输出了链表的内容。

双向链表:双向链表节点结构体增加了指向前一个节点的指针。

创建、插入和删除操作需要同时维护前后两个方向的指针。

实验结果:双向链表的各项操作均正常,能够双向遍历链表。

循环链表:使链表的尾节点指向头节点,形成循环。

在操作时需要特别注意循环的边界条件。

实验结果:成功实现了循环链表的创建和遍历。

2、栈和队列的实现栈:使用数组或链表来实现栈。

入栈操作将元素添加到栈顶,出栈操作取出栈顶元素。

实验结果:能够正确进行入栈和出栈操作,验证了栈的后进先出特性。

数据结构实验报告实验1

数据结构实验报告实验1

数据结构实验报告实验1一、实验目的本次实验的主要目的是通过实际操作和编程实现,深入理解和掌握常见的数据结构,如线性表、栈、队列等,并能够运用所学知识解决实际问题。

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

三、实验内容与步骤(一)线性表的实现与操作1、顺序表的实现定义一个固定大小的数组来存储线性表的元素。

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

2、链表的实现定义链表节点结构体,包含数据域和指针域。

实现链表的创建、插入、删除、遍历等操作。

(二)栈的实现与应用1、栈的实现使用数组或链表实现栈的数据结构。

实现入栈、出栈、栈顶元素获取等操作。

2、栈的应用利用栈实现表达式求值。

(三)队列的实现与应用1、队列的实现使用循环数组或链表实现队列。

实现入队、出队、队头元素获取等操作。

2、队列的应用模拟银行排队系统。

四、实验结果与分析(一)线性表1、顺序表插入操作:在指定位置插入元素时,需要移动后续元素,时间复杂度为 O(n)。

删除操作:删除指定位置的元素时,同样需要移动后续元素,时间复杂度为 O(n)。

查找操作:可以直接通过索引访问元素,时间复杂度为 O(1)。

2、链表插入操作:只需修改指针,时间复杂度为 O(1)。

删除操作:同样只需修改指针,时间复杂度为 O(1)。

查找操作:需要遍历链表,时间复杂度为 O(n)。

(二)栈1、表达式求值能够正确计算简单的四则运算表达式,如 2 + 3 4。

对于复杂表达式,如(2 + 3) 4,也能得到正确结果。

(三)队列1、银行排队系统模拟了客户的到达、排队和服务过程,能够反映出队列的先进先出特性。

五、实验中遇到的问题及解决方法(一)线性表1、顺序表的空间浪费问题问题描述:当预先分配的空间过大而实际使用较少时,会造成空间浪费。

解决方法:可以采用动态分配空间的方式,根据实际插入的元素数量来调整存储空间。

2、链表的指针操作错误问题描述:在链表的插入和删除操作中,容易出现指针指向错误,导致程序崩溃。

数据结构实验报告

数据结构实验报告

数据结构实验报告一、实验目的数据结构是计算机科学中的重要基础课程,通过本次实验,旨在加深对常见数据结构(如数组、链表、栈、队列、树、图等)的理解和运用,提高编程能力和问题解决能力,培养算法设计和分析的思维。

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

三、实验内容1、数组与链表的实现与操作分别实现整数数组和整数链表的数据结构。

实现数组和链表的插入、删除、查找操作,并比较它们在不同操作下的时间复杂度。

2、栈与队列的应用用数组实现栈结构,用链表实现队列结构。

模拟栈的入栈、出栈操作和队列的入队、出队操作,解决实际问题,如表达式求值、任务调度等。

3、二叉树的遍历构建二叉树的数据结构。

实现先序遍历、中序遍历和后序遍历三种遍历算法,并输出遍历结果。

4、图的表示与遍历用邻接矩阵和邻接表两种方式表示图。

实现图的深度优先搜索(DFS)和广度优先搜索(BFS)算法,并分析它们的时间复杂度。

四、实验步骤1、数组与链表数组的实现:定义一个固定大小的整数数组,通过索引访问和操作数组元素。

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

插入操作:对于数组,若插入位置在末尾,直接赋值;若不在末尾,需移动后续元素。

对于链表,找到插入位置的前一个节点,修改指针。

删除操作:数组需移动后续元素,链表修改指针即可。

查找操作:数组通过索引直接访问,链表需逐个节点遍历。

2、栈与队列栈的实现:用数组模拟栈,设置栈顶指针。

队列的实现:用链表模拟队列,设置队头和队尾指针。

入栈和出栈操作:入栈时,若栈未满,将元素放入栈顶,栈顶指针加 1。

出栈时,若栈不为空,取出栈顶元素,栈顶指针减 1。

入队和出队操作:入队时,在队尾添加元素。

出队时,取出队头元素,并更新队头指针。

3、二叉树构建二叉树:采用递归方式创建二叉树节点。

先序遍历:先访问根节点,再递归遍历左子树,最后递归遍历右子树。

中序遍历:先递归遍历左子树,再访问根节点,最后递归遍历右子树。

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

青岛理工大学数据结构课程设计报告题目一:魔王语言解释题目二:文学研究助手院(系):计算机工程学院学生姓名: 龚剑勇班级:计算机科学与技术092学号:200907079起迄日期: 2011/6/20——2011/6/30指导教师: 张艳2010—2011年度第 2 学期题目一:魔王语言解释一、需求分析[问题描述]有一个魔王总是使用自己的一种非常精练而又抽象的语言讲话,没有人能听得懂,但他的语言是可以逐步解释成人能听懂的语言,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:(1)α-> β1β2…βm(2)(θδ1δ2…δn)->θδnθδn-1…θδ1θ在这两种形式中,从左到右均表示解释。

试写一个魔王语言的解释系统,把他的话解释成人能听得懂的话。

[基本要求]用下述两条具体规则和上述规则形式(2)实现。

设大写字母表示魔王语言的词汇;小写字母表示人的语言词汇;希腊字母表示可以用大写字母或小写字母代换的变量。

魔王语言可含人的词汇。

(1)B -> tAdA(2)A -> sae[测试数据]B(ehnxgz)B解释成tsaedsaeezegexenehetsaedsae若将小写字母与汉字建立下表所示的对应关系,则魔王说的话是:“天上一只鹅地上一只鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一只鹅地上一只鹅”。

t d s a e z g x n h天地上一只鹅追赶下蛋恨二、概要设计1,程序设计思路(1)以一维数组demon[ i ]表示魔王语言.(2)魔王语言由用户输入,初始保存在demon[ i ]中.(3)魔王语言与人类语言对应关系固化在程序中.(4)实现过程:A:初始,魔王语言接收后存放在demon[ i ]中.B:初次遍历数组,将数组中括号内的元素入栈,同时插入相应首字母;C:再次遍历数组,将数组元素依次入队。

(小写字母直接入队;大写字母经翻译成相应字符后入队;遇到括号,将栈中保存的元素依次出栈入队)在翻译过程中,如果依旧包含大写字母,则置flag为1,否则为0。

D:将队列中元素赋值给demon[ i ]。

如果此时flag=1,则再次重复C过程。

直至所有元素为人类语言。

E:输出demon[ i ]。

此时数组中元素为对应的人类语言。

注:如果程序中没有相应的对应关系,则翻译成“”。

2.数据结构设计:1:设定栈的抽象数据类型定义:ADT stack{数据对象:D={ai|ai∈CharSet,i=1,2,…,n,n>=0}数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=2,…,n}基本操作:initstack (&s)操作结果:构造一个空栈s.push (&s,e)初始条件:栈s已存在.操作结果:在栈s的栈顶插入新的栈顶元素e.pop(&s,&e)初始条件:栈s已存在.操作结果:删除s的栈顶元素,并以e返回其值.}ADT stack2:设定队列的抽象数据类型:ADT queue{数据对象:D={ai|ai∈Elemset,i=1,2,…,n,n>=0}数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=2,…,n}基本操作:initqueue(&q)操作结果: 构造一个空队列q.enqueue(&q, e)初始条件: 队列q已存在.操作结果: 插入元素e为q的新队尾元素.dequeue(&q,&e)初始条件: q为非空队列.操作结果: 删除q的队头元素,并用e返回其值. }ADT queue3:本程序包含四个模块:1)主函数模块.其中主函数为:status main(){初始化栈;初始化队列;接收魔王语言输入到数组demon[i ];遍历数组将括号中元素进栈;while(数组demon[i ]中元素有大写字母){ 翻译排序处理后入队列;将对列元素保存在数组demon[i ];}输出人类语言(数组demon[ i]);}2)括号内元素入栈处理模块.tempstack(&temps)将括号内元素入栈,依次插入首字符.举例:(abcd)->adacaba.3)排序入队列模块.sort(&s,&q){遍历数组;{遇到小写字母,直接入队列;遇到大写字母,翻译大写后入队列;遇到括号,将栈中保存的元素依次出栈入队列; }}4)翻译大写处理模块.spenqueue(&*q,key){switch(key){找到各个大写字母对应的字符串.没有相应的则解释为’***’}}#各模块之间调用关系:三、详细设计1.定义全局变量#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define NULL 0#define OVERFLOW -2#define MAXSIZE 100#define stack_init_size 100#define stackincrement 10typedef char selemtype;typedef char qelemtype;typedef char elemtype;typedef int status;char e;char demon[MAXSIZE];2.栈类型及其基本操作typedef struct{selemtype *base; //栈底指针selemtype *top; //栈顶指针int stacksize; //栈存储空间的大小}sqstack;status initstack (sqstack *s){s->base=(selemtype *)malloc(stack_init_size*sizeof(selemtype)); if(!s->base) exit (OVERFLOW);s->top=s->base;s->stacksize=stack_init_size;return OK;}/*创建栈*/status push (sqstack *s,selemtype e){if(s->top-s->base>=s->stacksize){s->base=(elemtype *)realloc(s->base,(s->stacksize+stackincrement)*sizeof(elemtype)); if(!s->base) exit(OVERFLOW);s->top=s->base+s->stacksize;s->stacksize+=stackincrement;}*(s->top++)=e;return OK;}/*入栈*/status pop(sqstack *s,selemtype *e){if(s->top==s->base) return ERROR;*e=*(--(s->top));return OK;}/*出栈*/3.队列类型及其基本操作typedef struct qnode{qelemtype data;struct qnode *next;}qnode,*queueptr;typedef struct{queueptr front; //队头指针queueptr rear; //队尾指针}linkqueue;status initqueue(linkqueue *q){q->front=q->rear=(queueptr)malloc(sizeof(qnode)); if(!q->front) exit(OVERFLOW);q->front->next=NULL;return OK;}/*创建队列*/status enqueue(linkqueue *q,qelemtype e){queueptr p;p=(queueptr)malloc(sizeof(qnode));if(!p) exit(OVERFLOW);p->data=e;p->next=NULL;q->rear->next=p;q->rear=p;return OK;}/*入队*/status dequeue(linkqueue *q,qelemtype *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;}/*出队*/4.括号内元素入栈处理函数void tempstack(sqstack *temps){int i=0;char t;char c;c=demon[i ];for(i=0;c!='#';i++)/*遍历数组*/{c=demon[i ];if(c=='(')/*遇到开括号*/{t=demon[i+1];/*取括号中的首字母*/push(temps,t);/*入栈*/i++;/*指向首字母*/do{i++;c=demon[i ];push(temps,c)/*第一次循环将次字母入栈*/; push(temps,t);/*再将首字母进栈*/}while(c!=')');/*直到括号中元素全部进栈*/ pop(temps,&t);/*将多余进栈的首字母t出栈*/ pop(temps,&t); /*将多余进栈的’)’出栈*/ }}}/*临时栈*/5.特殊入队函数void spenqueue(linkqueue *q,char key){int j=0;char a[5];switch(key) /*判断大写字母对应的字符串*/{case'A':strcpy(a,"sae");break;case'B':strcpy(a,"tAdA");break;case'C':strcpy(a,"abc");break;case'D':strcpy(a,"def");break;case'E':strcpy(a,"ghi");break;case'F':strcpy(a,"klm");break;case'G':strcpy(a,"mop");break;case'H':strcpy(a,"jkk");break;default:strcpy(a,""); /*不能翻译的魔王语言以””输出*/}while(a[j]!='\0') /*如果数组还有字母*/{enqueue(q,a[j]);/*进队*/j++;}}/*特殊入队*/6.排序入队处理函数status sort(sqstack *s,linkqueue *q){qnode b;int flag=0;/*大写字母监视哨置零*/int i;for(i=0;demon[ i]!='#';i++)/*遍历数组*/{b.data=demon[ i];if( ('a'<=b.data&&b.data<='z') || b.data=='?') /*如果是小写字母或者’?’则直接入队*/{enqueue(q,b.data);}else{if('A'<=b.data&&b.data<='Z') /*如果是大写字母,则调用特殊入队函数,*/{spenqueue(q,b.data);flag=1; /*发现大写字母监视哨置1*/}else{if(b.data=='(')/*如果是括号*/{do{pop(s,&e);enqueue(q,e);}while(!(s->top==s->base)); /*只要栈不为空,则出栈进队*/while (b.data!=')') /*只要还指向括号内元素,就继续往后移,保证原括号内的元素不再进栈*/{i++;b.data=demon[ i];}}}}}return flag;}/*排序*/status main(){sqstack s1;linkqueue q1;int k=0;int flag=1;printf("\n\n\n\t\t\t欢迎使用\n");printf("\t***************************************\n");printf("\t请输入魔王语言:\n\t");printf("!: 以'#'结束: )\n\t");printf("***************************************\n\t");printf("魔王语言:\n\t");scanf("%s",demon);printf("\n\t***************************************");initstack(&s1); /*创建栈*/initqueue(&q1); /*创建队*/tempstack(&s1); /*调用函数*/while (flag==1) /*如果有大写字母*/{k=0;flag=sort(&s1,&q1);while(q1.front!=q1.rear) /*重写demon[i ]*/{dequeue(&q1,&e);demon[k]=e;k++;}demon[k]='#';}demon[k]='\0';printf("\n\t翻译后的人类语言为:\n\t%s",demon);printf("\n\n\t***************************************");printf("\n\t\t\tTHANK YOU!\n\t");printf("Please press any key to exit...");} /*主函数*/7.函数之间的调用关系四、调试分析1. 函数调用比较多,因而得仔细对待数值和地址的传递.2. 由于魔王语言中’B’中仍然包含着大写字母(tAdA).所以考虑设置flag.3. 函数数组遍历.进栈出栈.入队出队中都要牵扯指针的移动,所以要仔细考虑一循环的条件以及进栈元素的个数.4.程序只适用于字符的翻译,对其它类型数据不适用。

相关文档
最新文档