数据结构实验5 (1)
数据结构实验五矩阵的压缩存储与运算学习资料
数据结构实验五矩阵的压缩存储与运算第五章矩阵的压缩存储与运算【实验目的】1. 熟练掌握稀疏矩阵的两种存储结构(三元组表和十字链表)的实现;2. 掌握稀疏矩阵的加法、转置、乘法等基本运算;3. 加深对线性表的顺序存储和链式结构的理解。
第一节知识准备矩阵是由两个关系(行关系和列关系)组成的二维数组,因此对每一个关系上都可以用线性表进行处理;考虑到两个关系的先后,在存储上就有按行优先和按列优先两种存储方式,所谓按行优先,是指将矩阵的每一行看成一个元素进行存储;所谓按列优先,是指将矩阵的每一列看成一个元素进行存储;这是矩阵在计算机中用一个连续存储区域存放的一般情形,对特殊矩阵还有特殊的存储方式。
一、特殊矩阵的压缩存储1. 对称矩阵和上、下三角阵若n阶矩阵A中的元素满足= (0≤i,j≤n-1 )则称为n阶对称矩阵。
对n阶对称矩阵,我们只需要存储下三角元素就可以了。
事实上对上三角矩阵(下三角部分为零)和下三角矩阵(上三角部分为零),都可以用一维数组ma[0.. ]来存储A的下三角元素(对上三角矩阵做转置存储),称ma为矩阵A的压缩存储结构,现在我们来分析以下,A和ma之间的元素对应放置关系。
问题已经转化为:已知二维矩阵A[i,j],如图5-1,我们将A用一个一维数组ma[k]来存储,它们之间存在着如图5-2所示的一一对应关系。
任意一组下标(i,j)都可在ma中的位置k中找到元素m[k]= ;这里:k=i(i+1)/2+j (i≥j)图5-1 下三角矩阵a00 a10 a11 a20 … an-1,0 … an-1,n-1k= 0 1 2 3 …n(n-1)/2 …n(n+1)/2-1图5-2下三角矩阵的压缩存储反之,对所有的k=0,1,2,…,n(n+1)/2-1,都能确定ma[k]中的元素在矩阵A中的位置(i,j)。
这里,i=d-1,(d是使sum= > k的最小整数),j= 。
2. 三对角矩阵在三对角矩阵中,所有的非零元素集中在以主对角线为中心的带内状区域中,除了主对角线上和直接在对角线上、下方对角线上的元素之外,所有其它的元素皆为零,见图5-3。
数据结构实验报告
数据结构实验报告数据结构实验报告1-引言本实验旨在深入理解数据结构的基本知识,并通过实践掌握相关算法和数据结构的应用。
本报告详细描述了实验的背景、目的、实验环境、实验内容和实验结果分析等内容。
2-实验背景介绍数据结构的概念和作用,解释为什么数据结构在计算机科学中至关重要。
同时,介绍本次实验所涉及的具体数据结构和算法,如数组、链表、栈、队列、二叉树等。
3-实验目的明确本次实验的目标,如掌握数据结构的基本操作,理解不同数据结构的适用场景,评估不同算法的时间和空间复杂度等。
4-实验环境描述实验所使用的软硬件环境,包括计算机配置、操作系统、编程语言和相关的开发工具等。
5-实验内容详细描述实验的具体步骤和要求,包括以下几个部分:5-1 数据结构的创建和初始化:例如,创建一个数组或链表,并初始化数据。
5-2 数据结构的插入和删除操作:例如,在数组中插入一个元素或删除一个元素。
5-3 数据结构的遍历和搜索:例如,遍历树的节点或搜索链表中指定的元素。
5-4 数据结构的排序和查找:例如,对数组进行排序或在有序链表中查找指定元素。
5-5 实验的额外要求:例如,优化算法的实现、分析不同数据结构的性能等。
6-实验结果分析对实验的结果进行详细的分析和解释,包括各个数据结构和算法的性能比较、时间复杂度和空间复杂度的评估等。
7-结论总结本次实验的主要内容和收获,归纳实验结果,并对实验过程中遇到的问题和不足进行反思和改进。
附件:随报告一同提交的附件包括:源代码、实验数据集等相关文件。
法律名词及注释:1-版权:指作品的创作权、发表权和署名权等综合权利。
2-侵权:指未经权利人允许,在未向权利人支付报酬的情况下,使用受版权保护的作品的行为。
3-知识产权:包括著作权、商标权、专利权等,是指人们在创造性劳动中创造出的精神财富所享有的权利。
数据结构实验五(二叉树的建立及遍历)题目和源程序
实验5:二叉树的建立及遍历(第十三周星期三7、8节)一、实验目的1.学会实现二叉树结点结构和对二叉树的基本操作。
2.掌握对二叉树每种操作的具体实现,学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法。
二、实验要求1.认真阅读和掌握和本实验相关的教材内容。
2.编写完整程序完成下面的实验内容并上机运行。
3.整理并上交实验报告。
三、实验内容1.编写程序任意输入二叉树的结点个数和结点值,构造一棵二叉树,采用三种递归遍历算法(前序、中序、后序)对这棵二叉树进行遍历并计算出二叉树的高度。
2 .编写程序生成下面所示的二叉树,并采用中序遍历的非递归算法对此二叉树进行遍历。
四、思考与提高1.如何计算二叉链表存储的二叉树中度数为1的结点数?2.已知有—棵以二叉链表存储的二叉树,root指向根结点,p指向二叉树中任一结点,如何求从根结点到p所指结点之间的路径?/*----------------------------------------* 05-1_递归遍历二叉树.cpp -- 递归遍历二叉树的相关操作* 对递归遍历二叉树的每个基本操作都用单独的函数来实现* 水上飘2009年写----------------------------------------*/// ds05.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <iostream>typedef char ElemType;using namespace std;typedef struct BiTNode {ElemType data;//左右孩子指针BiTNode *lchild, *rchild;}BiTNode, *BiTree;//动态输入字符按先序创建二叉树void CreateBiTree(BiTree &T) {char ch;ch = cin.get();if(ch == ' ') {T = NULL;}else {if(ch == '\n') {cout << "输入未结束前不要输入回车,""要结束分支请输入空格!" << endl;}else {//生成根结点T = (BiTNode * )malloc(sizeof(BiTNode));if(!T)cout << "内存分配失败!" << endl;T->data = ch;//构造左子树CreateBiTree(T->lchild);//构造右子树CreateBiTree(T->rchild);}}}//输出e的值ElemType PrintElement(ElemType e) { cout << e << " ";return e;}//先序遍历void PreOrderTraverse(BiTree T) { if (T != NULL) {//打印结点的值PrintElement(T->data);//遍历左孩子PreOrderTraverse(T->lchild);//遍历右孩子PreOrderTraverse(T->rchild);}}//中序遍历void InOrderTraverse(BiTree T) {if (T != NULL) {//遍历左孩子InOrderTraverse(T->lchild);//打印结点的值PrintElement(T->data);//遍历右孩子InOrderTraverse(T->rchild);}}//后序遍历void PostOrderTraverse(BiTree T) { if (T != NULL) {//遍历左孩子PostOrderTraverse(T->lchild);//遍历右孩子PostOrderTraverse(T->rchild);//打印结点的值PrintElement(T->data);}}//按任一种遍历次序输出二叉树中的所有结点void TraverseBiTree(BiTree T, int mark) {if(mark == 1) {//先序遍历PreOrderTraverse(T);cout << endl;}else if(mark == 2) {//中序遍历InOrderTraverse(T);cout << endl;}else if(mark == 3) {//后序遍历PostOrderTraverse(T);cout << endl;}else cout << "选择遍历结束!" << endl;}//输入值并执行选择遍历函数void ChoiceMark(BiTree T) {int mark = 1;cout << "请输入,先序遍历为1,中序为2,后序为3,跳过此操作为0:";cin >> mark;if(mark > 0 && mark < 4) {TraverseBiTree(T, mark);ChoiceMark(T);}else cout << "此操作已跳过!" << endl;}//求二叉树的深度int BiTreeDepth(BiTNode *T) {if (T == NULL) {//对于空树,返回0并结束递归return 0;}else {//计算左子树的深度int dep1 = BiTreeDepth(T->lchild);//计算右子树的深度int dep2 = BiTreeDepth(T->rchild);//返回树的深度if(dep1 > dep2)return dep1 + 1;elsereturn dep2 + 1;}}int _tmain(int argc, _TCHAR* argv[]){BiTNode *bt;bt = NULL; //将树根指针置空cout << "输入规则:" << endl<< "要生成新结点,输入一个字符,""不要生成新结点的左孩子,输入一个空格,""左右孩子都不要,输入两个空格,""要结束,输入多个空格(越多越好),再回车!"<< endl << "按先序输入:";CreateBiTree(bt);cout << "树的深度为:" << BiTreeDepth(bt) << endl;ChoiceMark(bt);return 0;}/*----------------------------------------* 05-2_构造二叉树.cpp -- 构造二叉树的相关操作* 对构造二叉树的每个基本操作都用单独的函数来实现* 水上飘2009年写----------------------------------------*/// ds05-2.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <iostream>#define STACK_INIT_SIZE 100 //栈的存储空间初始分配量#define STACKINCREMENT 10 //存储空间分配增量typedef char ElemType; //元素类型using namespace std;typedef struct BiTNode {ElemType data; //结点值BiTNode *lchild, *rchild; //左右孩子指针}BiTNode, *BiTree;typedef struct {BiTree *base; //在栈构造之前和销毁之后,base的值为空BiTree *top; //栈顶指针int stacksize; //当前已分配的存储空间,以元素为单位}SqStack;//构造一个空栈void InitStack(SqStack &s) {s.base = (BiTree *)malloc(STACK_INIT_SIZE * sizeof(BiTree));if(!s.base)cout << "存储分配失败!" << endl;s.top = s.base;s.stacksize = STACK_INIT_SIZE;}//插入元素e为新的栈顶元素void Push(SqStack &s, BiTree e) {//栈满,追加存储空间if ((s.top - s.base) >= s.stacksize) {s.base = (BiTree *)malloc((STACK_INIT_SIZE+STACKINCREMENT) * sizeof(BiTree));if(!s.base)cout << "存储分配失败!" << endl;s.top = s.base + s.stacksize;s.stacksize += STACK_INIT_SIZE;}*s.top++ = e;}//若栈不空,则删除s的栈顶元素,并返回其值BiTree Pop(SqStack &s) {if(s.top == s.base)cout << "栈为空,无法删除栈顶元素!" << endl;s.top--;return *s.top;}//按先序输入字符创建二叉树void CreateBiTree(BiTree &T) {char ch;//接受输入的字符ch = cin.get();if(ch == ' ') {//分支结束T = NULL;} //if' 'endelse if(ch == '\n') {cout << "输入未结束前不要输入回车,""要结束分支请输入空格!(接着输入)" << endl;} //if'\n'endelse {//生成根结点T = (BiTNode * )malloc(sizeof(BiTree));if(!T)cout << "内存分配失败!" << endl;T->data = ch;//构造左子树CreateBiTree(T->lchild);//构造右子树CreateBiTree(T->rchild);} //Create end}//输出e的值,并返回ElemType PrintElement(ElemType e) {cout << e << " ";return e;}//中序遍历二叉树的非递归函数void InOrderTraverse(BiTree p, SqStack &S) {cout << "中序遍历结果:";while(S.top != S.base || p != NULL) {if(p != NULL) {Push(S,p);p = p->lchild;} //if NULL endelse {BiTree bi = Pop(S);if(!PrintElement(bi->data))cout << "输出其值未成功!" << endl;p = bi->rchild;} //else end} //while endcout << endl;}int _tmain(int argc, _TCHAR* argv[]){BiTNode *bt;SqStack S;InitStack(S);bt = NULL; //将树根指针置空cout << "老师要求的二叉树序列(‘空’表示空格):""12空空346空空空5空空,再回车!"<< endl << "请按先序输入一个二叉树序列(可另输入,但要为先序),""无左右孩子则分别输入空格。
数据结构与算法实验报告5-查找与排序
北京物资学院信息学院实验报告
课程名_数据结构与算法
实验名称查找与排序
实验日期年月日实验报告日期年月日姓名______ ___ 班级_____ ________ 学号___
一、实验目的
1.掌握线性表查找的方法;
2.了解树表查找思想;
3.掌握散列表查找的方法.
4.掌握插入排序、交换排序和选择排序的思想和方法;
二、实验内容
查找部分
1.实现顺序查找的两个算法(P307), 可以完成对顺序表的查找操作, 并根据查到和未查到两种情况输出结果;
2.实现对有序表的二分查找;
3.实现散列查找算法(链接法),应能够解决冲突;
排序部分
4.分别实现直接插入排序、直接选择排序、冒泡排序和快速排序算法
三、实验地点与环境
3.1 实验地点
3.2实验环境
(操作系统、C语言环境)
四、实验步骤
(描述实验步骤及中间的结果或现象。
在实验中做了什么事情, 怎么做的, 发生的现象和中间结果, 给出关键函数和主函数中的关键段落)
五、实验结果
六、总结
(说明实验过程中遇到的问题及解决办法;个人的收获;未解决的问题等)。
数据结构 实验报告
数据结构实验报告数据结构是计算机科学中重要的概念之一,它是计算机存储、组织数据的方式和方法。
在计算机科学的课程中,数据结构通常是一门重要的课程,也是程序设计的基础。
本文将围绕数据结构展开,介绍其基本概念、分类和应用。
一、基本概念数据结构是指数据元素之间的关系和操作方法的集合。
它包括两个方面的内容,一是数据元素之间的逻辑关系,二是数据元素的存储结构。
数据元素之间的逻辑关系可以是线性关系(如线性表、队列、栈等),也可以是非线性关系(如树、图等)。
数据元素的存储结构可以是顺序存储结构(如数组),也可以是链式存储结构(如链表)。
二、分类根据数据元素之间的关系,数据结构可以分为线性结构和非线性结构。
线性结构是指数据元素之间存在一对一的关系,如线性表、队列、栈等;非线性结构是指数据元素之间存在一对多或多对多的关系,如树、图等。
根据数据元素的存储结构,数据结构可以分为顺序存储结构和链式存储结构。
顺序存储结构是指数据元素按照一定的顺序存放在连续的存储单元中,如数组;链式存储结构是指数据元素按照不同的存储地址存放在不同的存储单元中,通过指针来连接,如链表。
三、应用数据结构在计算机科学中有广泛的应用。
首先,它是算法设计和分析的基础。
算法是解决问题的方法和步骤,而数据结构是算法的载体。
不同的数据结构适用于不同的算法,选择合适的数据结构可以提高算法的效率。
数据结构在数据库系统中起着重要的作用。
数据库是指存储和管理大量数据的系统,而数据结构是数据库的内部实现方式。
合理的数据结构设计可以提高数据库的查询和操作效率。
数据结构在图形学和计算机图像处理中也有重要的应用。
图形学是研究计算机图像的表示和处理方法的领域,而数据结构是图形学算法的基础。
例如,二叉树广泛应用于图形学中的空间划分和三维模型的表示。
数据结构还在人工智能和机器学习中发挥着重要的作用。
人工智能是研究如何使计算机能够模拟人类智能的学科,而机器学习是人工智能的一个重要分支。
数据结构实验五---查找的实现
实验五查找得实现一、实验内容1、建立一个线性表,对表中数据元素存放得先后次序没有任何要求.输入待查数据元素得关键字进行查找。
为了简化算法,数据元素只含一个整型关键字字段,数据元素得其余数据部分忽略不考虑.建议采用前哨得作用,以提高查找效率。
2、查找表得存储结构为有序表,输入待查数据元素得关键字利用折半查找方法进行查找.此程序中要求对整型量关键字数据得输入按从小到大排序输入。
二、源代码与执行结果1、#include〈iostream>using namespace std;#define MAX 100#define KeyType inttypedef struct{KeyType key ;}DataType;typedef struct{ﻩDataType elem[MAX] ;intlength ;}SeqTable ,*PSeqTable ;PSeqTable Init_SeqTable(){ﻩPSeqTable p =(PSeqTable)malloc(sizeof(SeqTable)) ;ﻩif(p !=NULL){p->length = 0 ;ﻩreturnp;}ﻩelse{ﻩcout〈<"Outof space!”〈〈endl ;ﻩreturn NULL;ﻩ}}int insert_SeqTable(PSeqTable p,KeyType x){if(p->length〉= MAX)ﻩ{ﻩcout〈<”overflow!"<<endl ;ﻩreturn 0 ;ﻩ}p—>elem[p—>length]、key= x ;p-〉length++;return 1 ;}int SeqSearch(SeqTable s ,KeyTypek){ﻩint n , i = 0;ﻩn = s、length ;s、elem[n]、key =k ;ﻩwhile(s、elem[i]、key != k)ﻩﻩi ++ ;ﻩif(i == n)return —1 ;elseﻩﻩreturn i ;}voidmain(){PSeqTable p ;inti , n;ﻩKeyType a ;p =Init_SeqTable();ﻩcout<〈"请输入数据个数:" ;cin>>n ;cout〈<"请输入数据:”<〈endl ;for(i = 0 ; i< n ;i++)ﻩ{ﻩcin〉>a ;ﻩinsert_SeqTable(p , a);}ﻩcout<<"请输入要查找得数据,输入32767结束:” ;cin〉〉a ;ﻩwhile(a != 32767)ﻩ{i =SeqSearch(*p, a) ;if(i == -1){ﻩﻩﻩcout<<”无此数据!请重新输入:"<〈endl ;ﻩﻩcin>>a ;ﻩ}ﻩﻩelseﻩﻩ{ﻩcout<〈"该数据得位置就是:"〈<i+1<<endl;ﻩcout〈<"请输入要查找得数据:" ;ﻩﻩcin〉〉a;ﻩ}ﻩ}}2、#include<iostream>using namespace std;#define MAX 100#define KeyType inttypedef struct{KeyType key ;}DataType;typedef struct{ﻩDataType elem[MAX] ;ﻩint length ;}BinTable ,*PBinTable ;PBinTable Init_BinTable(){ﻩPBinTable p = (PBinTable)malloc(sizeof(BinTable)) ;if(p != NULL){p->length= 0;ﻩﻩreturn p ;ﻩ}elseﻩ{ﻩcout〈<"Out of space!"〈<endl ;return NULL ;ﻩ}}int insert_BinTable(PBinTable p ,KeyType x){if(p—〉length >= MAX){ﻩcout<<"overflow!”<〈endl ;ﻩreturn 0 ;ﻩ}ﻩp-〉elem[p—>length]、key =x ;p->length ++ ;ﻩreturn 1;}int BinSearch(BinTable s ,KeyType k){ﻩint low,mid , high;ﻩlow = 0 ;high = s、length-1 ;while(low <= high){ﻩﻩmid=(low+high)/2 ;ﻩif(s、elem[mid]、key== k)ﻩﻩﻩreturnmid;ﻩelse if(s、elem[mid]、key >k)ﻩﻩhigh= mid- 1 ;ﻩﻩelseﻩlow = mid +1 ;ﻩ}ﻩreturn —1;}void main(){PBinTable p ;ﻩinti ,n ;ﻩKeyType a;p =Init_BinTable();cout<<”请输入数据个数:”;cin〉>n;ﻩcout<〈"请按从小到大得顺序输入数据:”〈<endl;for(i = 0 ;i〈 n; i ++)ﻩ{cin>〉a;ﻩinsert_BinTable(p,a);}ﻩcout<<"请输入要查找得数据,输入32767结束:” ;ﻩcin〉>a ;while(a!= 32767){ﻩi =BinSearch(*p , a);if(i ==-1)ﻩ{ﻩﻩcout〈〈"无此数据!请重新输入:"〈〈endl ;cin>>a;ﻩ}ﻩelse{ﻩcout<<"该数据得位置就是:”〈<i+1〈<endl ;ﻩﻩﻩcout<〈”请输入要查找得数据:" ;cin>〉a ;}ﻩ}}。
数据结构 实验报告
数据结构实验报告一、实验目的数据结构是计算机科学中非常重要的一门课程,通过本次实验,旨在加深对常见数据结构(如链表、栈、队列、树、图等)的理解和应用,提高编程能力和解决实际问题的能力。
二、实验环境本次实验使用的编程语言为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 。
数据结构实验报告
数据结构实验报告一、实验目的本次实验的目的是通过实际操作,深入理解数据结构的概念、特性和应用,并运用所学知识进行问题解决和算法设计。
二、实验内容本次实验主要包括以下内容:1. 数组的创建和操作:- 数组的定义和初始化- 数组元素的读取和修改- 数组的遍历和排序2. 链表的创建和操作:- 单链表的定义和初始化- 单链表的插入和删除- 单链表的遍历和逆序输出3. 栈和队列的创建和操作:- 栈的初始化和压栈、弹栈操作- 队列的初始化和入队、出队操作4. 树的创建和操作:- 二叉树的定义和初始化- 二叉树的遍历(前序、中序、后序遍历)- 二叉树的查找、插入和删除操作三、实验步骤和方法1. 数组的创建和操作:- 根据题目要求,声明和初始化数组;- 使用循环结构,遍历数组,并根据需求进行元素的修改;- 运用排序算法对数组进行排序,并验证排序结果的正确性。
2. 链表的创建和操作:- 根据题目要求,创建单链表的结构体和相关操作函数;- 使用动态内存分配函数malloc(),创建链表节点并插入到链表中;- 根据题目要求,设计相应的插入和删除函数,实现链表的插入和删除操作;- 遍历链表,并将链表节点的数据逆序输出。
3. 栈和队列的创建和操作:- 根据题目要求,创建栈和队列的结构体和相关操作函数;- 使用数组和指针实现栈和队列的功能,并初始化相关变量;- 实现栈的压栈和弹栈操作,并验证结果的正确性;- 实现队列的入队和出队操作,并验证结果的正确性。
4. 树的创建和操作:- 根据题目要求,创建二叉树的结构体和相关操作函数;- 使用动态内存分配函数malloc(),创建二叉树的节点,并根据题目要求插入到二叉树中;- 实现二叉树的遍历(前序、中序、后序遍历),并验证遍历结果的正确性;- 根据题目要求,实现二叉树的查找、插入和删除操作。
四、实验结果与分析在实验过程中,我按照题目的要求,使用所学的数据结构相关知识,设计了相应的代码,并通过调试和运行,得到了实验结果。
数据结构实验指导书及其答案pdf
引言概述正文内容
1.实验环境配置
1.1硬件要求
计算机硬件配置要求
操作系统要求
附加硬件设备要求(如虚拟机等)
1.2软件要求
编程语言要求(如C/C++、Java等)开发环境配置(如IDE、编译器等)1.3实验库和工具
实验需要使用的库文件和工具
如何获取和配置实验库和工具
2.实验内容介绍
2.1实验目标和背景
数据结构实验的作用和意义
实验背景和相关应用领域介绍
2.2实验概述
实验内容的大致流程和步骤
实验中可能遇到的问题和挑战
2.3实验要求
对学生实验流程和实验结果的要求
实验过程中需要注意的事项和技巧
3.实验步骤
3.1实验准备
配置实验环境
获取实验所需数据和文件
3.2实验具体步骤
根据实验要求将数据结构知识应用到具体问题中根据实验要求实现相应的算法和数据结构
3.3实验示例代码
提供示例代码以供学生参考和学习
解析示例代码中的关键步骤和实现细节
4.实验答案
4.1实验题目
实验题目及相关说明
确定实验的具体要求和目标
4.2实验答案解析
对实验答案的具体实现进行解析
对实验中可能遇到的问题和错误进行分析和解决4.3实验答案示例
提供实验答案的示例代码
解析实验答案中的关键实现步骤和说明
5.实验总结
5.1实验成果评估
对学生实验成果进行评估
分析实验结果的优点和不足
5.2实验心得
学生对本次实验的收获和感想
学生对未来实验的建议和展望
总结。
数据结构实验,线性表的插入和删除,单链表操作,Huffman编码树
{ int i,j,k,x1,x2,m1,m2;
for(i=1;i<(2*n);i++)
{ t[i].pa=t[i].lc=t[i].rc=0;
if(i<=n)
t[i].data=w[i];
else
t[i].data=0;
}
for(i=1;i<n;i++)
{ m1=m2=MAX;
x1=x2=0;
for(j=1;j<(n+i);j++)
ListCount=0;
int nOperateState;
while(TRUE)
{
printf( "选择你要操作的方法,1为插入,2为删除,3为查询!4为退出\r\n ");
scanf("%d",&nOperateState);
switch(nOperateState)
{
case 1:
InsertInfo();
{
printf("请不要重复插入相同学号的信息\r\n");
LocalFree(Info);
return;
}
ptemp=ptemp->pNext;
}
}
if (ListHead)
{
if (ListCount==1)
{
ListTail=Info;
ListTail->pNext=NULL;
ListHead->pNext=ListTail;
temp->stu_num,temp->stu_age,temp->stu_english_grade);
数据结构实验报告-线性表
1 线性表1. 实验题目与环境1.1实验题目及要求(1)顺序表的操作利用顺序存储方式实现下列功能:根据键盘输入数据建立一个线性表,并输出该线性表;对该线性表进行数据的插入、删除、查找操作,并在插入和删除数据后,再输出线性表。
(2)单链表的操作利用链式存储方式实现下列功能:根据键盘输入数据建立一个线性表,并输出该线性表;对该线性表进行数据的插入、删除、查找操作,并在插入和删除数据后,再输出线性表。
(3)线性表的应用约瑟夫环问题。
有n个人围坐一圈,现从某个人开始报数,数到M的人出列,接着从出列的下一个人开始重新报数,数到M的人又出列,如此下去,直到所有人都出列为止。
要求依次输出出列人的编码。
2.问题分析(1)顺序表的操作利用一位数组来描述顺序表,即将所有元素一词储存在数组的连续单元中,要在表头或中间插入一个新元素时,需要将其后的所有元素都向后移动一个位置来为新元素腾出空间。
同理,删除开头或中间的元素时,则将其后的所有元素向前移动一个位置以填补空位。
查找元素时,则需要利用循环语句,一一判断直到找出所要查找的元素(或元素的位置),输出相关内容即可(2)单链表的操作利用若干个结点建立一个链表,每个节点有两个域,即存放元素的数据域和存放指向下一个结点的指针域。
设定一个头指针。
在带头结点的单链表中的第i个元素之前插入一新元素,需要计数找到第i-1个结点并由一指针p指向它,再造一个由一指针s指向的结点,数据为x,并使x的指针域指向第i个结点,最后修改第i-1个结点的指针域,指向x结点。
删除第i个元素时,需要计数寻找到第i个结点,并使指针p指向其前驱结点,然后删除第i个结点并释放被删除结点的空间。
查找第i个元素,需从第一个结点开始计数找到第i个结点,然后输出该结点的数据元素。
(3)线性表的应用程序运行之后,首先要求用户指定初始报数的上限值,可以n<=30,此题中循环链表可不设头结点,而且必须注意空表和"非空表"的界限。
国开数据结构(本)数据结构课程实验报告
国开数据结构(本)数据结构课程实验报告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. 总结与展望通过本次数据结构课程的实验,我们深入了解并掌握了数据结构的基本概念、操作和应用。
中国农业大学_821数据结构_《数据结构》实验笔记(5)
实验5 二叉树与树
课程实验共安排8个难度各易的实验,训练重点在于掌握基本的数据结构,而不强调面面俱到。
通过实验,掌握抽象数据类型的概念和基本数据结构,掌握各种数据结构内在的逻辑关系,各种数据结构在计算机中的存储表示,基于各种数据结构上的基本运算、算法实现及算法分析。
●实验目的
(1) 进一步掌握指针变量、动态变量的含义。
(2) 掌握二叉树的结构特性,以及各种存储结构的特点及适用范围。
(3) 掌握用指针类型描述、访问和处理二叉树的运算。
●实验内容
(1) 试编写交换以二叉链表作存储结构的二叉树中所有结点的左、右子树的算法。
(2) 已知以二叉链表作存储结构,试编写按层次顺序遍历二叉树的算法。
(3) 已知二叉排序树以二叉链表作存储结构,试编写按从大到小的顺序输出二叉排序树的各结点的算法。
●实验要求
(1) 认真分析题目。
(2) 进行算法设计。
(3) 编写程序代码
(4) 上机调试程序。
(5) 保存和打印出程序的运行结果,并结合程序进行分析。
数据结构实验题目
数据结构实验题⽬实验⼀线性表1 实验⽬的通过选择下⾯四个题⽬之⼀进⾏实现,掌握如下内容:熟悉C++语⾔的基本编程⽅法,掌握集成编译环境的调试⽅法学习指针、模板类、异常处理的使⽤掌握线性表的操作的实现⽅法学习使⽤线性表解决实际问题的能⼒2 实验内容2.1题⽬1根据线性表的抽象数据类型的定义,选择下⾯任⼀种链式结构实现线性表,并完成线性表的基本功能。
线性表存储结构(五选⼀):1、带头结点的单链表2、不带头结点的单链表3、循环链表4、双链表5、静态链表线性表的基本功能:1、构造:使⽤头插法、尾插法两种⽅法2、插⼊:要求建⽴的链表按照关键字从⼩到⼤有序3、删除4、查找5、获取链表长度6、销毁7、其他:可⾃⾏定义编写测试main()函数测试线性表的正确性。
2.2题⽬2利⽤线性表实现⼀个通讯录管理,通信录的数据格式如下:struct DataType{int ID; //编号char name[10]; //姓名char ch; //性别char phone[13]; //电话char addr[31]; //地址};要求:实现通讯录的建⽴、增加、删除、修改、查询等功能能够实现简单的菜单交互,即可以根据⽤户输⼊的命令,选择不同的操作。
能够保存每次更新的数据(选作)能够进⾏通讯录分类,⽐如班级类、好友类、⿊名单等等(选作)编写测试main()函数测试线性表的正确性2.3题⽬3利⽤线性表实现⼀个⼀元多项式Polynomialf(x) = a+ a1x + a2x2 + a3x3+ … + a n x n提⽰:Polynomial的结点结构如下:struct term{float coef; //系数int expn; //指数};可以使⽤链表实现,也可以使⽤顺序表实现。
要求:能够实现⼀元多项式的输⼊和输出能够进⾏⼀元多项式相加能够进⾏⼀元多项式相减能够计算⼀元多项式在x处的值能够计算⼀元多项式的导数(选作)能够进⾏⼀元多项式相乘(选作)编写测试main()函数测试线性表的正确性2.4题⽬4利⽤循环链表实现约瑟夫问题的求解。
国开数据结构(本)数据结构课程实验报告(一)
国开数据结构(本)数据结构课程实验报告一、实验目的本实验旨在帮助学生掌握数据结构的基本概念,熟练掌握数据结构的基本操作,进一步提高学生的编程能力和数据处理能力。
二、实验内容1. 数据结构的基本概念在实验中,我们首先介绍了数据结构的基本概念,包括数据的逻辑结构和物理结构,以及数据结构的分类和应用场景。
2. 数据结构的基本操作接着,我们介绍了数据结构的基本操作,包括插入、删除、查找等操作,通过具体的案例和代码演示,让学生理解和掌握这些基本操作的实现原理和方法。
3. 编程实践在实验的第三部分,我们组织学生进行数据结构的编程实践,要求学生通过实际编写代码来实现各种数据结构的基本操作,加深对数据结构的理解和掌握。
三、实验过程1. 数据结构的基本概念在本部分,我们通过课堂讲解和案例分析的方式,向学生介绍了数据结构的基本概念,包括线性结构、树形结构、图形结构等,让学生对数据结构有一个整体的认识。
2. 数据结构的基本操作在这一部分,我们通过具体的案例和代码演示,向学生介绍了数据结构的基本操作,包括插入、删除、查找等操作的实现原理和方法,让学生掌握这些基本操作的具体实现。
3. 编程实践最后,我们组织学生进行数据结构的编程实践,要求他们通过实际编写代码来实现各种数据结构的基本操作,加深对数据结构的理解和掌握,同时也提高了他们的编程能力和数据处理能力。
四、实验结果与分析通过本次实验,学生们对数据结构有了更深入的理解和掌握,他们能够熟练地使用各种数据结构的基本操作,编写出高效、稳定的代码,提高了他们的编程能力和数据处理能力。
五、实验总结本实验对于学生掌握数据结构的基本概念和操作起到了很好的辅助作用,通过实际的编程实践,学生们不仅加深了对数据结构的理解和掌握,同时也提高了他们的编程能力和数据处理能力。
这对于他们今后的学习和工作都具有重要的意义。
六、参考文献1. 《数据结构与算法分析》2. 《数据结构(C语言版)》3. 《数据结构与算法》以上是我对“国开数据结构(本)数据结构课程实验报告”的详细报告,希望能够满足您的要求。
数据结构实验报告
数据结构实验报告一、实验目的数据结构是计算机科学中的重要基础课程,通过本次实验,旨在加深对常见数据结构(如数组、链表、栈、队列、树、图等)的理解和运用,提高编程能力和问题解决能力,培养算法设计和分析的思维。
二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。
三、实验内容1、数组与链表的实现与操作分别实现整数数组和整数链表的数据结构。
实现数组和链表的插入、删除、查找操作,并比较它们在不同操作下的时间复杂度。
2、栈与队列的应用用数组实现栈结构,用链表实现队列结构。
模拟栈的入栈、出栈操作和队列的入队、出队操作,解决实际问题,如表达式求值、任务调度等。
3、二叉树的遍历构建二叉树的数据结构。
实现先序遍历、中序遍历和后序遍历三种遍历算法,并输出遍历结果。
4、图的表示与遍历用邻接矩阵和邻接表两种方式表示图。
实现图的深度优先搜索(DFS)和广度优先搜索(BFS)算法,并分析它们的时间复杂度。
四、实验步骤1、数组与链表数组的实现:定义一个固定大小的整数数组,通过索引访问和操作数组元素。
链表的实现:定义链表节点结构体,包含数据和指向下一个节点的指针。
插入操作:对于数组,若插入位置在末尾,直接赋值;若不在末尾,需移动后续元素。
对于链表,找到插入位置的前一个节点,修改指针。
删除操作:数组需移动后续元素,链表修改指针即可。
查找操作:数组通过索引直接访问,链表需逐个节点遍历。
2、栈与队列栈的实现:用数组模拟栈,设置栈顶指针。
队列的实现:用链表模拟队列,设置队头和队尾指针。
入栈和出栈操作:入栈时,若栈未满,将元素放入栈顶,栈顶指针加 1。
出栈时,若栈不为空,取出栈顶元素,栈顶指针减 1。
入队和出队操作:入队时,在队尾添加元素。
出队时,取出队头元素,并更新队头指针。
3、二叉树构建二叉树:采用递归方式创建二叉树节点。
先序遍历:先访问根节点,再递归遍历左子树,最后递归遍历右子树。
中序遍历:先递归遍历左子树,再访问根节点,最后递归遍历右子树。
《数据结构》实验书
目录实验一线性表基本操作的编程实现 (201)实验二堆栈或队列基本操作的编程实现 (49)实验四二维数组基本操作的编程实现 (18)实验五二叉树基操作的编程实现 (20)实验六图基本操作的编程实现 (45)(特别提示:程序设计包含两个方面的错误。
其一是错误,其二是能错误。
为了提高学生的编程和能力,本指导书给出的程序代码并的两种错误。
并且也不保证程序的完整性,有一些语句已经故意删除,就是要求学生自己编制完成,这样才能达到我们的要求。
希望大家以自己所学高级语言的基本功和点为基础,不要过于依赖给出的参考代码,这样才能有所进步。
如果学生能够根据要求完全自己编制,那就不好了。
)实验一线性表基本操作的编程实现【实验目的】线性表基本操作的编程实现要求:线性表基本操作的编程实现(2学时,验证型),掌握线性表的建立、遍历、插入、删除等基本操作的编程实现,也可以进一步编程实现查找、逆序、排序等操作,存储结构可以在顺序结构或链表结分主要功能,也可以用菜单进行管理完成大部分功能。
还鼓励学生利用基本操作进行一些更实际的应用型程序设计。
【实验性质】【实验内容】把线性表的顺序存储和链表存储的数据插入、删除运算其中某项进行程序实现。
建议实现键盘输入数据以实现程序的通据的函数。
【注意事项】【思考问题】1.线性表的顺序存储和链表存储的差异?优缺点分析?2.那些操作引发了数据的移动?3.算法的时间效率是如何体现的?4.链表的指针是如何后移的?如何加强程序的健壮性?【参考代码】(一)利用顺序表完成一个班级学生课程成绩的简单管理1、预定义以及顺序表结构类型的定义(1)#define ListSize //根据需要自己设定一个班级能够容纳的最大学生数(2)typedef struct Stu{int num; //学生的学号char name[10]; //学生的姓名float wuli; //物理成绩float shuxue; //数学成绩float yingyu; //英语成绩}STUDENT; //存放单个学生信息的结构体类型typedef struct List{stu[ListSize]; //存放学生的数组定义,静态分配空间int length; //记录班级实际学生个数}LIST; //存放班级学生信息的顺序表类型2、建立班级的学生信息void listcreate(LIST *Li,int m) //m为该班级的实际人数{int i;Li->length=0;for(i=0;i<m;i++) //输入m个学生的所有信息{printf("please input the %dth student's information:\n",i+1);printf("num=");scanf("%d", ); //输入第i个学生的学号printf("name=");scanf("%s", ); //输入第i个学生的姓名printf("wuli=");scanf("%f", ); //输入第i个学生的物理成绩printf("shuxue=");scanf("%f", ); //输入第i个学生的数学成绩printf("yingyu=");scanf("%f", ); //输入第i个学生的英语成绩Li->length++; //学生人数加1}}3、插入一个学生信息int listinsert(LIST *Li,int i) //将学生插入到班级Li的第i个位置。
国开(电大)数据结构课程实验报告5
数据结构课程实验报告2、创建完毕后OS Lab 会自动打开这个新建的项目。
在“项目管理器”窗口中,树的根节点表示项目,可以看到项目的名称是“console”,各个子节点是项目包含的文件夹或者文件。
此项目的源代码主要包含一个头文件“console.h”和一个C语言源文件“console.c”,如图2所示。
2.2 生成项目在“生成”菜单中选择“生成项目”。
在项目的生成过程中,“输出”窗口会实时显示生成的进度和结果。
如果源代码中不包含语法错误,会在最后提示生成成功,如图3所示。
2.3 执行项目在OS Lab中选择“调试”菜单中的“开始执行(不调试)”,就可以执行此控制台应用程序。
启动执行后会弹出一个Windows控制台窗口,显示控制台应用程序输出的内容。
按任意键即可关闭此控制台窗口,结果如图4。
2.4 调试项目1、调试功能之前,对例子程序进行必要的修改,步骤如下:(1)右键点击“项目管理器”窗口中的“源文件”文件夹节点,在弹出的快捷菜单中选择“添加”中的“添加新文件”。
(2)在弹出的“添加新文件”对话框中选择“C 源文件”模板。
(3)在“名称”中输入文件名称“func”。
(4)点击“添加”按钮添加并自动打开文件func.c,此时的“项目管理器”窗口如图5所示。
2、在func.c 文件中添加函数:int Func (int n) {n = n + 1; return n; }3、点击源代码编辑器上方的console.c标签,切换到console.c文件。
将main 函数修改为:int main (int argc, char* argv[]) {int Func (int n); // 声明Func函数int n = 0;n = Func(10);printf ("Hello World!\n");return 0;}4、代码修改完毕后按F7(“生成项目”功能的快捷键)。
注意查看“输出”窗口中的内容,如果代码中存在语法错误,就根据提示进行修改,直到成功生成项目,结果如图6所示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》实验报告实验序号:5 实验项目名称:队列的操作学号姓名专业、班实验地点指导教师实验时间一、实验目的及要求1. 熟悉队列的基本概念;2. 掌握队列的链式表存储结构;3.掌握队列的应用。
二、实验设备(环境)及要求微型计算机;windows 操作系统;Microsoft Visual Studio 6.0集成开发环境。
三、实验内容与步骤1.C++的库函数中已经实现了队列,引用方法为#include <queue>,请上网查阅资料,完成习题。
①创建一个队列。
②将a、b、c、d、e、f依次入队。
③若队列不为空,将元素出队并打印输出。
2.以下的链式队列采用队头指针和队尾指针分别跟踪队列的头尾两端,请删除队尾指针,只使用队头指针实现队列的初始化、入队、出队和销毁队列。
#include <stdlib.h>#include <stdio.h>#define ERROR 1#define OK 0#define OVERFLOW 1typedef int QElemType;typedef int Status;//用 e 返回其值,并返回OK;否则返回ERRORQueuePtr 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;}int main(){int i,n=10;QElemType e;LinkQueue Q;InitQueue(Q); //初始化队列printf("元素入队");for(i=0;i<n;i++){printf(" %d ",i);EnQueue(Q,i); //元素入队}printf("\n元素出队");for(i=0;i<n;i++){DeQueue(Q,e); //元素出队printf(" %d ",e);}DestroyQueue(Q);return 0;}3.以下的循环队列采用空一个空间的方式来识别队列满与空,请修改程序,引入一个变量追踪循环队列被使用的空间数,从而达到100%队列空间可用。
#include <stdlib.h>#include <stdio.h>#define ERROR 1#define OK 0printf("元素入队列");for(i=0 ; i<10; i++){printf(" %d ",j);EnQueue(S,j); //元素入队列j++;}printf("\n元素出队列");for(i=0 ; i<10; i++){DeQueue(S,j); //元素出队列printf(" %d ",j);}}以下题目为选做题:4.参考P61-62的代码用链式表实现队列,并在主函数中测试。
四、实验结果与数据处理详细记录程序在调试过程中出现的问题及解决方法。
记录程序执行的结果(贴图)。
五、分析与讨论对上机实践结果进行分析,上机的心得体会。
六、教师评语签名:日期:成绩附源程序清单:11#include<stdio.h>#include<string.h>#include<queue>using namespace std;int main(){queue<char> q;int i;char f[5],m;for(i=0;i<5;i++){scanf("%c",&f[i]);q.push(f[i]);}for(i=0;i<5;i++){printf("%c ",q.front());q.pop();}return 0;}2#include <stdlib.h>#include <stdio.h>#define ERROR 1#define OK 0#define OVERFLOW 1typedef int QElemType;typedef int Status;typedef struct QNode {// 结点类型QElemType data;struct QNode *next;}QNode,*QueuePtr;typedef struct { // 链队列类型QueuePtr front; // 队头指针}LinkQueue;Status InitQueue (LinkQueue &Q) {// 构造一个空队列QQ.front=(QueuePtr)malloc(sizeof(QNode));if (!Q.front)exit (OVERFLOW);//存储分配失败Q.front->next = NULL;return OK;}Status DestroyQueue (LinkQueue &Q) {// 销毁队列QQ.front=NULL;return OK;}Status EnQueue (LinkQueue &Q,QElemType e) {// 如果是第一次进入队列,让队头指针跟他相等,之后每次入队在节点下一个为空前停住,让当前不为空节点等于新的产生的存储节点,完成入队//这个是循环次数结果入队,所以少一个传进函数的形式参量(记录入队次数的)QueuePtr p,q;p = (QueuePtr) malloc (sizeof (QNode));p->data = e;p->next = NULL;if(e==0){Q.front->next=p;}else{q=Q.front->next;while(q){if(q->next==NULL)break;q=q->next;}q->next=p;}if(!p)exit (OVERFLOW); //存储分配失败return OK;}Status DeQueue (LinkQueue &Q,QElemType &e) {// 若队列不空,则删除Q的队头元素(删除队尾就两说了)//用e 返回其值,并返回OK;否则返回ERRORQueuePtr p;if (Q.front->next==NULL)//当队头不为空,队列合法return ERROR;p=Q.front->next;e = p->data;Q.front->next = p->next;free (p);return OK;}int main(){int i,n=10;QElemType e;LinkQueue Q;InitQueue(Q); //初始化队列printf("元素入队");for(i=0;i<n;i++){printf(" %d ",i);EnQueue(Q,i); //元素入队}printf("\n元素出队");for(i=0;i<n;i++){DeQueue(Q,e); //元素出队printf(" %d ",e);}DestroyQueue(Q);return 0;}//destory删除队列函数有问题从写3#include <stdlib.h>#include <stdio.h>#define ERROR 1#define OK 0#define OVERFLOW 1typedef int QElemType;typedef int Status;#define MAXQSIZE 100 //最大队列长度typedef struct {QElemType *base; // 动态分配存储空间int front; // 头指针,若队列不空,指向队列头元素int rear; // 尾指针,若队列不空,//指向队列尾元素的下一个位置}SqQueue;Status InitQueue (SqQueue &Q) { // 构造一个空队列QQ.base = (QElemType *) malloc (MAXQSIZE *sizeof (QElemType));if (!Q.base)exit (OVERFLOW); //存储分配失败Q.front = Q.rear = 0;return OK;}Status EnQueue (SqQueue &Q, QElemType e) { // 插入元素e为Q的新的队尾元素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) { // 若队列不空,则删除Q的队头元素,用e 返回其值,并返回OK; 否则返回ERRORif (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;//追踪空间书}void main(){int i,a;QElemType j = 0;SqQueue S;InitQueue(S); //初始化队列printf("元素入队列");for(i=0 ; i<10; i++){printf("%d ",j);EnQueue(S,j); //元素入队列j++;printf("空间:");a=QueueLength(S);printf("%d ",a);}printf("\n元素出队列");for(i=0 ; i<10; i++){DeQueue(S,j); //元素出队列printf("%d ",j);printf("空间:");a=QueueLength(S);printf("%d ",a);}}4#include<stdio.h>#include<stdlib.h>#define ERROR 1#define OK 0#define MAXSIZE 100typedef int QElemType;typedef int Status;typedef struct QNode{Status data;struct QNode *next;}*Queueptr;typedef struct{Queueptr front;Queueptr rear ;Status *base;}Squeue;Status Initqueue(Squeue &Q){Q.front=Q.rear=(Queueptr)malloc(sizeof(QElemType));if(!Q.front)exit(ERROR);Q.front->next=NULL;return OK;}Status Enqueue(Squeue &Q,int e){Queueptr p;p=(Queueptr)malloc(sizeof(QNode));if(!p)exit(ERROR);p->data=e;p->next=NULL;Q.rear->next=p;Q.rear=p;return OK;}Status destoryQ(Squeue &Q){Queueptr p;while(Q.front){p=Q.front->next;Q.front->next=Q.front->next->next;free(p);}return OK;}Status deQueue(Squeue &Q,QElemType &e) {Queueptr p;p=Q.front->next;e=p->data;Q.front->next=p->next;free(p);return OK;}int main(){int i,j,k,o;Squeue Q;Initqueue(Q);scanf("%d",&i);for(j=0;j<i;j++){scanf("%d",&k);Enqueue(Q,k);}printf("\n");for(j=0;j<i;j++){deQueue(Q,o);printf("%d ",o);}destoryQ(Q);return 1;}。