链队列和循环队列数据结构实验
- 格式:doc
- 大小:202.00 KB
- 文档页数:11
计算机科学与技术系实验报告专业名称计算机科学与技术课程名称数据结构与算法项目名称实验三队列实验班级学号 1姓名同组人员无实验日期实验三队列实验实验题目:建立含有若干个元素的循环队列和链队列,并分别实现循环队列和链队列的入队和出对操作。
(1)先实现循环队列的入队和出队操作1.问题分析本程序要求实现建立含有若干个元素的循环队列,并实现循环队列的入队和出队操作。
完成该实验需要以下4个子任务:○1定义一个循环队列的存储结构,定义队列的基本算法。
○2定义一个display()函数实现队列元素的输出看入队是否成功○3通过队列的基本算法实现队列的出队操作○4在主函数中完成操作测试数据设计如下:1 2 3 4 562.概要设计为了实现上述程序功能,需要:○1声明一个循环队列○2定义出队列的基本算法,○3通过键盘输入5个整数,入队,出队○4在主函数中先往队列里输入5个元素,然后入队,输出,看入队是否成功,然后出队,再调用display()函数看是否出队。
1)本程序包含7个函数:1主函数main()2.置空队:InitQueue()3.判对空: QueueEmpty()4.判队满:QueueFull()5.入队:Add()6.出队:Delete()7.display()各函数关系如下:I nitQueue()QueueEmpty() Main () QueueFull()Add()MainDelete()display()3、详细设计实现概要设计中定义的所有的数据类型,对每个操作给出了算法和代码,主程序和模块都需要代码。
(1)循环队列#define maxlen 10typedef struct{int data [maxlen];int front;int rear;}SeqQueue;(2)队列基本算法SeqQueue *InitQueue(SeqQueue *q) //建立一个空循环队列{q=(SeqQueue *)malloc(sizeof (SeqQueue));q->front=0;q->rear=0;return q;}int QueueFull (SeqQueue *q){ //判断队列是否为满if (q->front==(q->rear+1)%maxlen)return 1;* * else return 0;}int QueueEmpty(SeqQueue *q){ //判断队列是否为空if (q->rear==q->front)return 1;else return 0;}void Add (SeqQueue *q,int x) //入队{if(!QueueFull(q)){q->rear=(q->rear+1)%maxlen;q->data[q->rear]=x;}else printf ("queue full");}void Delete(SeqQueue *q){ //出队if (!QueueEmpty(q))q->front=(q->front+1)%maxlen;else printf ("queue Empty");}* *(3)用display()函数输出循环队列元素void display(SeqQueue *q) //输出循环队列q的元素{int i;if(q->front!=q->rear) //循环队列非空,输出队列元素{printf("输出循环队列元素:");i=q->front;do{i=(i+1)%maxlen;printf("%d",q->data[i]);}while(i!=q->rear);}elseprintf("队列为空!");}(4)在主函数中先往队列里输入5个元素,输出,看入队是否成功,然后出队,再调用display()函数看是否出队。
数据结构实验实验内容和目的:掌握几种基本的数据结构:集合、线性结构、树形结构等在求解实际问题中的应用,以及培养书写规范文档的技巧。
学习基本的查找和排序技术。
让我们在实际上机中具有编制相当规模的程序的能力。
养成一种良好的程序设计风格。
实验教材:数据结构题集(C语言版)清华大学出版社2007年实验项目:实验一、栈和循环队列㈠、实验内容:①栈掌握栈的特点(先进后出FILO)及基本操作,如入栈、出栈等,栈的顺序存储结构和链式存储结构,以便在实际问题背景下灵活应用。
本程序采用的是链栈结构,具有初始化一个栈、PUSH、POP、显示所有栈里的元素四个功能。
②循环队列掌握队列的特点(先进先出FIFO)及基本操作,如入队、出队等,学会循环队列的实现,以便在实际问题背景下灵活运用。
本程序具有初始化一个队列、入队、出队、显示队列的所有元素、队列长度五个功能。
㈡、实验代码①栈程序代码:#include <stdio.h>#include <malloc.h>#define Stack_Size 6#define ERROR 0#define OK 1typedef int SElemType;typedef struct SNode{SElemType data;struct SNode *next;}SNode,*LinkStack;int CreatTwo(LinkStack &head,int n){int i;SNode *p;head=(LinkStack)malloc(sizeof(SNode));head->next=NULL;printf("请输入数据(数字):\n");for(i=n;i>0;--i){p=(SNode *)malloc(sizeof(SNode));scanf("%d",&p->data);p->next=head->next;head->next=p;}return 1;}int menu_select(){int sn;for(;;){scanf("%d",&sn);if(sn<1||sn>6)printf("\n\t输入错误,请重新输入\n");elsebreak;}return sn;}int Push(LinkStack &top,SElemType e){SNode *q;q=(LinkStack)malloc(sizeof(SNode));if(!q){printf("溢出!\n");return(ERROR);}q->data=e;q->next=top->next;top->next=q;return(OK);}int Pop(LinkStack &top,SElemType &e){SNode *q;if(!top->next){printf("error!\n");return(ERROR);}e=top->next->data;q=top->next;top->next=q->next;free(q);return(OK);}void main(){ int e;LinkStack top;printf("1.初始化一个栈;\n2.PUSH;\n3.POP;\n4.显示所有栈里的元素;\n5.结束;\n");while(1){switch(menu_select()){case 1:if(CreatTwo(top,Stack_Size))printf("Success!\n");break; case 2:printf("Push:\n");scanf("%d",&e);if(Push(top,e))printf("Success!\n");break;case 3:if(Pop(top,e))printf("Success!\n");printf("%d\n",e);break;case 4:LinkStack p;printf("所有栈里的元素:\n");p=top;while(p->next){p=p->next;printf("%7d",p->data);}printf("\n");break;case 5:return;}}}运行结果:②循环队列程序代码:#include<stdlib.h>#include<stdio.h>#define OVERFLOW -1#define OK 1#define ERROR 0#define MAXSIZE 100typedef struct{int *elem;//队列存储空间int front;int rear;}SqQueue;//判断选择是否正确int menu_select(){int sn;for(;;){scanf("%d",&sn);if(sn<1||sn>6)printf("\n\t输入错误,请重新输入\n");elsebreak;}return sn;}//参数(传出)SqQueue &Q,循环队列(空)int InitQueue(SqQueue &Q){Q.elem=(int *)malloc(MAXSIZE*sizeof(int));if(!Q.elem)exit(OVERFLOW);Q.front=Q.rear=-1;for(int i=0;i<MAXSIZE;i++)Q.elem[i]=-1;return OK;}//返回Q的元素个数int QueueLength(SqQueue Q){return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;}//显示队列的元素void Display(SqQueue Q){for(int i=0;i<=QueueLength(Q);i++)if(Q.elem[i]!=-1)printf("%d ",Q.elem[i]);printf("\n");}//入队int EnQueue(SqQueue &Q,int e){Q.rear=(Q.rear+1)%MAXSIZE;if(Q.rear==Q.front)return ERROR;Q.elem[Q.rear]=e;return OK;}//出队int DeQueue(SqQueue &Q,int &e){if(Q.front==Q.rear)return ERROR;e=Q.elem[Q.front+1];Q.elem[Q.front+1]=-1;Q.front=(Q.front+1)%MAXSIZE;return OK;}void main(){SqQueue Q;InitQueue(Q);int elem,e;printf("请输入队列元素(以0结束):\n");scanf("%d",&elem);while(elem!=0){EnQueue(Q,elem);scanf("%d",&elem);}printf("队列为:\n");Display(Q);printf("1.初始化一个队列;\n2.入队;\n3.出队;\n4.显示队列的所有元素;\n5.队列长度:\n6.结束;\n");while(1){switch(menu_select()){case 1:printf("请输入队列元素(以0结束):\n");scanf("%d",&elem);while(elem!=0){EnQueue(Q,elem);scanf("%d",&elem);}printf("队列为:\n");Display(Q);fflush(stdin);break;case 2:scanf("%d",&elem);EnQueue(Q,elem);printf("队列为:\n");Display(Q);fflush(stdin);break;case 3:DeQueue(Q,elem);printf("队列为:\n");Display(Q);break;case 4:printf("\n队列的所有元素:\n");Display(Q);break;case 5:printf("%d\n",QueueLength(Q));break;case 6:return;}}}运行结果:实验二、数组㈠、实验内容:数组一般不做插入或删除操作,也就是说,一旦建立了数组,则结构中的数据元素个数和元素之间的关系就不再发生变动。
数据结构与算法分析实验报告一、实验目的本次实验旨在通过实际操作和分析,深入理解数据结构和算法的基本概念、原理和应用,提高解决实际问题的能力,培养逻辑思维和编程技巧。
二、实验环境本次实验使用的编程语言为 Python,使用的开发工具为 PyCharm。
操作系统为 Windows 10。
三、实验内容(一)线性表的实现与操作1、顺序表的实现使用数组实现顺序表,包括插入、删除、查找等基本操作。
通过实验,理解了顺序表在内存中的存储方式以及其操作的时间复杂度。
2、链表的实现实现了单向链表和双向链表,对链表的节点插入、删除和遍历进行了实践。
体会到链表在动态内存管理和灵活操作方面的优势。
(二)栈和队列的应用1、栈的实现与应用用数组和链表分别实现栈,并通过表达式求值的例子,展示了栈在计算中的作用。
2、队列的实现与应用实现了顺序队列和循环队列,通过模拟银行排队的场景,理解了队列的先进先出特性。
(三)树和二叉树1、二叉树的遍历实现了先序、中序和后序遍历算法,并对不同遍历方式的结果进行了分析和比较。
2、二叉搜索树的操作构建了二叉搜索树,实现了插入、删除和查找操作,了解了其在数据快速查找和排序中的应用。
(四)图的表示与遍历1、邻接矩阵和邻接表表示图分别用邻接矩阵和邻接表来表示图,并比较了它们在存储空间和操作效率上的差异。
2、图的深度优先遍历和广度优先遍历实现了两种遍历算法,并通过对实际图结构的遍历,理解了它们的应用场景和特点。
(五)排序算法的性能比较1、常见排序算法的实现实现了冒泡排序、插入排序、选择排序、快速排序和归并排序等常见的排序算法。
2、算法性能分析通过对不同规模的数据进行排序实验,比较了各种排序算法的时间复杂度和空间复杂度。
四、实验过程及结果(一)线性表1、顺序表在顺序表的插入操作中,如果在表头插入元素,需要将后面的元素依次向后移动一位,时间复杂度为 O(n)。
删除操作同理,在表头删除元素时,时间复杂度也为 O(n)。
实验一线性表的操作实验类型:验证性实验要求:必修实验学时: 2学时一、实验目的:参照给定的线性表顺序表类和链表类的程序样例,验证给出的线性表的常见算法。
二、实验要求:1、掌握线性表顺序表类和链表类的特点。
掌握线性表的常见算法。
2、提交实验报告,报告内容包括:目的、要求、算法描述、程序结构、主要变量说明、程序清单、调试情况、设计技巧、心得体会。
三、实验内容:1.设计一个静态数组存储结构的顺序表类,要求编程实现如下任务:建立一个线性表,首先依次输人数据元素1,2,3,…,10,然后删除数据元素6,最后依次显示当前线性表中的数据元素。
要求采用顺序表实现,假设该顺序表的数据元素个数在最坏情况下不会超过10个。
第一题源代码:#include<iostream>using namespace std;template <class T> //定义模板类SeqListclass SeqList{private:int length,x,j,data[10];public:public:SeqList( ) //无参构造函数{length=0;}SeqList(T a[ ], int n) //有参构造函数{for(int i=0;i<n;i++)data[i]=a[i];length=n;}~SeqList( ) //析构函数为空{}int Length( ) //求线性表的长度{return length;}T Get(int i) //按位查找,取线性表的第i个元素{}int Locate(T x ) //按值查找,求线性表中值为x的元素序号{}void Insert(int i, T x) //在线性表中第i个位置插入值为x的元素{}T Delete(int i) //删除线性表的第i个元素{if(length==0)throw"下溢";if(i<1||i>length)throw"位置异常";x=data[i-1];for(j=i;j<length;j++)data[j-1]=data[j]; //注意此处j已经是元素所在的数组下标length--;return x;}void PrintList( ) //遍历线性表,按序号依次输出各元素{for(int i=0;i<length;i++)cout<<data[i]<<" ";cout<<endl;}};void main(){int n=10,a[10]={1,2,3,4,5,6,7,8,9,10};SeqList<int> theseqlist(a,n);cout<<"删除前元素:";for(int i=0;i<n;i++)cout<<a[i]<<" ";cout<<endl;theseqlist.Delete(6);theseqlist.PrintList();}运行结果:---------------------------------------------------------------------------------------------------------------------- 2.设计一个带头结点的单链表类,要求:(1)带头结点单链表类的成员函数包括取数据元素个数、插入元素、删除所有值为k的元素、取数据元素。
实验一单链表的基本操作(必做)一、实验目的1.掌握单链表的存储、初始化、插入、删除等操作的程序实现。
2.加深对单链表基本概念,基本理论及相应算法的掌握与理解。
3.了解链表的处理方式,学习体会简单的单链表程序实现相关知识。
二、实验内容1.建立一个链表、设计链表的基本操作实现算法、输出一个链表表,调试并输出结果。
2.编写一个程序实现如下功能:让计算机产生出50个0~9之间的随机数并依次保存到单链表中;输出遍历单链表;从单链表中删除与给定值相等的所有结点;输出遍历单链表;输出单链表长度,调试并输出结果。
三、实验步骤1.定义一个链表结构体。
2.利用插入功能插入一个结点。
3.利用删除功能删除一个结点。
四、程序运行测试1.利用插入功能插入一个结点。
2.利用删除功能删除一个结点。
五、实验报告要求1.绘制链表操作实现的流程图。
2.详细给出程序运行测试结果(包括测试数据和测试结果)。
3.选试验步骤2-3中的任意一个,给出程序的详细注释。
4.参考程序中某一部分功能的改进(选做)5.实验心得与体会6.附录,实验用源程序六、参考源代码#include <iostream.h>#include <malloc.h>typedef struct LNode{int data;struct LNode *next;}Lnode, *LinkList;//假设下面的单链表均为带头结点。
void CreatLinkList(LinkList &L,int j){//建立一个单链表L,数据为整数,数据由键盘随机输入。
LinkList p,q;L=(LinkList )malloc(sizeof(Lnode));L->next=NULL;q=L;cout<<"在单链表内输入整数:"<<endl;for(int i=0;i<j;i++) p=(LinkList)malloc(sizeof(Lnode)); cin>>p->data;p->next=q->next;q->next=p;q=p; }int PrintLinkList(LinkList &L){//输出单链表L的数据元素LinkList p;p=L->next;if(L->next==NULL){cout<<"链表没有元素!"<<endl;return 0;}cout<<"单链表的数据元素为:";while(p){cout<<p->data<<" ";p=p->next;}cout<<endl;return 1;}void LinkListLengh(LinkList &L){//计算单链表L的数据元素个数。
一、实验目的1. 理解顺序循环队列的概念和原理。
2. 掌握顺序循环队列的初始化、入队、出队等基本操作。
3. 通过编程实现顺序循环队列,并验证其功能。
二、实验原理顺序循环队列是一种利用一维数组实现队列的存储结构。
它将一维数组看作是首尾相连的循环结构,队列的头部和尾部在数组的两端。
顺序循环队列的特点是:队列满时,头指针和尾指针相差一个数组的长度;队列空时,头指针和尾指针相等。
顺序循环队列的基本操作如下:1. 初始化:创建一个顺序循环队列,并设置头指针和尾指针。
2. 入队:将元素插入队列尾部。
3. 出队:从队列头部删除元素。
4. 判断队列是否为空或满。
三、实验内容1. 创建顺序循环队列类。
2. 实现顺序循环队列的初始化、入队、出队等基本操作。
3. 编写测试代码,验证顺序循环队列的功能。
四、实验步骤1. 创建顺序循环队列类,定义队列长度、头指针、尾指针等属性。
2. 实现顺序循环队列的初始化方法,初始化头指针和尾指针。
3. 实现顺序循环队列的入队方法,判断队列是否已满,如果未满,将元素插入队列尾部,并更新尾指针;如果已满,则提示队列已满。
4. 实现顺序循环队列的出队方法,判断队列是否为空,如果为空,则提示队列已空;如果未空,则从队列头部删除元素,并更新头指针。
5. 编写测试代码,创建顺序循环队列实例,执行入队和出队操作,验证顺序循环队列的功能。
五、实验结果与分析1. 初始化顺序循环队列```pythonclass CircularQueue:def __init__(self, size):self.queue = [None] sizeself.head = 0self.tail = 0self.count = 0self.maxsize = size```2. 入队操作```pythondef enqueue(self, item):if self.count == self.maxsize:print("Queue is full")else:self.queue[self.tail] = itemself.tail = (self.tail + 1) % self.maxsizeself.count += 1```3. 出队操作```pythondef dequeue(self):if self.count == 0:print("Queue is empty")else:item = self.queue[self.head]self.queue[self.head] = Noneself.head = (self.head + 1) % self.maxsize self.count -= 1return item```4. 测试代码```pythondef test_circular_queue():queue = CircularQueue(5)print("Enqueue 1 to 5:")for i in range(1, 6):queue.enqueue(i)print(queue.queue)print("Dequeue 1 to 5:")for _ in range(5):print(queue.dequeue())print(queue.queue)test_circular_queue()```实验结果分析:通过测试代码,我们可以看到顺序循环队列在初始化、入队和出队操作时都能正确执行。
循环队列实验报告心得与体会循环队列是数据结构中一个非常经典的概念,相对于其他队列结构,循环队列可以优化存储空间的使用,减少空间的浪费。
循环队列的操作也比较高效,能够快速执行入队和出队操作。
本次实验,我们对循环队列结构进行了深入的了解与实践,更深刻地认识到了数据结构的重要性。
在实验中,我们首先对循环队列的基本概念进行了学习,通过查阅相关资料和教材,我们了解到循环队列是一种环形的特殊队列,其队尾指针在达到数组的末尾时,再从数组的第一个位置开始存储数据,如此循环下去。
这样一来,就可以充分利用数组中的元素,减少不必要的空间浪费,提高队列结构的空间利用率。
在深入了解循环队列的概念之后,我们开始实现循环队列的基本操作,包括入队、出队、判空、判满等。
通过实现这些基础操作,我们更加熟悉了循环队列的内部结构和操作流程,同时也掌握了程序设计中的一些基本思路和技巧。
在实验过程中,我们还注意到了循环队列一些常见的问题和局限性。
当队列元素数量达到数组大小时,会出现队列满的情况,此时需要进行特殊处理。
由于循环队列是基于数组实现的,所以其大小是固定的,不能动态调整,这也是循环队列的一个缺陷。
在实验结束后,我们对循环队列的性能进行了一些简单分析。
通过测试,我们发现循环队列在入队和出队操作的时间复杂度都是O(1),即不受元素数量的影响,具有较高的效率。
这进一步证明了循环队列是一种高效的数据结构。
本次实验让我们深入了解了循环队列的内部结构和基本操作,也发现了循环队列存在的问题和局限性。
通过这次实验的实践,我们进一步理解了数据结构的重要性,同时也锻炼了自己的程序设计能力和思维能力。
除了实现循环队列的基本操作,我们还对循环队列进行了扩展,添加了一些实用的操作,比如获取队列长度、获取队首和队尾元素等。
这些操作虽然不是必要的,但是在实际的应用中却非常实用,可以方便我们处理队列中的元素。
我们在实验中还掌握了一些编程技巧和调试工具,来提高程序的效率和可靠性。
第1篇一、实验背景数据结构是计算机科学中一个重要的基础学科,其中队列作为一种常用的数据结构,在计算机科学和实际应用中具有广泛的应用。
队列是一种先进先出(FIFO)的线性表,它允许在表的一端进行插入操作,在另一端进行删除操作。
本实验旨在通过实现队列的基本操作,加深对队列数据结构概念和特性的理解,并掌握其在实际应用中的运用。
二、实验目的1. 理解队列数据结构的概念和特性。
2. 掌握队列的存储结构,包括顺序存储和链式存储。
3. 熟悉队列的基本操作,如入队、出队、队列长度、队列状态判断等。
4. 通过实际编程,提高数据结构应用能力。
三、实验内容1. 队列的顺序存储结构实现:- 定义队列结构体,包含队列长度、队列最大长度、队列首尾指针等。
- 实现队列的初始化、入队、出队、判断队列是否为空、判断队列是否已满等操作。
2. 队列的链式存储结构实现:- 定义队列节点结构体,包含队列数据、指针等。
- 实现队列的初始化、入队、出队、判断队列是否为空、判断队列是否已满等操作。
3. 队列的实际应用:- 使用队列实现广度优先搜索(BFS)算法。
- 使用队列实现单链表反转。
- 使用队列实现表达式求值。
四、实验步骤1. 创建队列结构体,定义队列的基本属性和操作函数。
2. 实现队列的顺序存储结构,包括队列的初始化、入队、出队、判断队列是否为空、判断队列是否已满等操作。
3. 实现队列的链式存储结构,包括队列的初始化、入队、出队、判断队列是否为空、判断队列是否已满等操作。
4. 通过实际编程,验证队列的基本操作是否正确。
5. 使用队列实现实际应用,验证队列在解决问题中的应用价值。
五、实验结果与分析1. 顺序存储结构实现:- 队列的初始化、入队、出队、判断队列是否为空、判断队列是否已满等操作均能正常进行。
- 队列的顺序存储结构在插入和删除操作时,需要移动队列中的元素,因此时间复杂度为O(n)。
2. 链式存储结构实现:- 队列的初始化、入队、出队、判断队列是否为空、判断队列是否已满等操作均能正常进行。
链式队列实验报告一、实验目的本实验的目的是通过链式队列的实现,掌握队列基本操作的实现过程,理解队列的特性及应用场景,并实现队列的基本运算。
二、实验原理队列是一种数据结构,它有先进先出(FIFO)的特点,即先进入队列的元素先出队。
队列有两种实现方式:顺序队列和链式队列。
链式队列的实现原理是通过链表来实现队列的基本操作,即入队和出队,同时要实现队列的初始化、判空、读队头和读队尾等操作。
链式队列的具体实现过程是:创建一个头节点和一个尾节点,将它们连接起来形成一个链表,头节点指向队首,尾节点指向队尾。
当有新元素入队时,创建一个新节点,将其插入到尾节点后面,并更新尾节点指针;当元素出队时,将头节点指向下一个节点,并将头节点从链表中删除。
当队列为空时,头节点和尾节点都指向空。
三、实验步骤1. 定义链式队列的数据结构,包括节点结构体和队列结构体。
2. 实现链式队列的初始化函数,创建头节点和尾节点,并将它们连接起来。
3. 实现链式队列的入队函数,创建一个新节点,将其插入到尾节点后面,并将尾节点指针指向新节点。
4. 实现链式队列的出队函数,将头节点指向下一个节点,并将头节点从链表中删除。
5. 实现链式队列的读队头和读队尾函数,分别返回头节点和尾节点的值。
6. 实现链式队列的判空函数,判断头节点和尾节点是否为空。
7. 对链式队列进行测试,包括入队、出队、读队头、读队尾和判空等操作。
四、实验结果经过测试,链式队列的基本操作均能正常运行,满足队列的特性。
链式队列的实现比顺序队列更加灵活,可以根据实际需要动态调整队列长度,适用于数据量不确定的场景。
五、实验总结本次实验通过实现链式队列,掌握了队列基本操作的实现过程,理解了队列的特性及应用场景。
链式队列相比顺序队列更加灵活,适用于数据量不确定的场景。
在实际开发中,需要根据具体情况选择合适的队列实现方式,并注意队列的空间和时间复杂度。
队列的操作实验报告队列的操作实验报告一、实验目的本次实验旨在通过对队列的操作,加深学生对队列数据结构的理解,掌握队列的基本操作方法。
二、实验原理队列是一种先进先出(First In First Out,FIFO)的线性数据结构。
它可以用数组或链表来实现。
在队列中,新元素插入到队尾,已有元素从队头删除。
因此,队列具有以下几个特点:1. 只允许在一端插入元素,在另一端删除元素。
2. 插入和删除元素时分别称为入队和出队。
3. 入队操作在队尾进行,出队操作在对头进行。
三、实验内容本次实验主要涉及以下几个方面:1. 队列的初始化:初始化一个空的循环队列。
2. 入队操作:将一个元素插入到循环队列中。
3. 出队操作:从循环队列中删除一个元素,并返回该元素值。
4. 判断循环队列是否为空:如果循环对了为空,则返回 true;否则返回 false。
5. 判断循环对了是否已满:如果循环对了已满,则返回 true;否则返回 false。
四、实验步骤1. 队列的初始化首先需要定义一个结构体来表示循环队列,包括以下几个成员变量:```ctypedef struct {int *base; // 队列的基地址int front; // 队头指针int rear; // 队尾指针int size; // 队列长度} Queue;```然后定义一个初始化函数,用来初始化一个空的循环队列:```cvoid initQueue(Queue *queue, int size) {queue->base = (int *) malloc(sizeof(int) * size);queue->front = queue->rear = 0;queue->size = size;}```2. 入队操作入队操作比较简单,只需要将元素插入到队尾即可。
如果队列已满,则无法插入元素。
```cbool enQueue(Queue *queue, int value) {if (isFull(queue)) {return false;}queue->base[queue->rear] = value;queue->rear = (queue->rear + 1) % queue->size;return true;}```3. 出队操作出队操作也比较简单,只需要从队头删除一个元素,并返回该元素值。
淮海工学院计算机科学系实验报告书课程名:《数据结构》题目:数据结构实验链队列和循环队列班级:学号:姓名:线性数据结构算法实现与应用报告要求1目的与要求:1)掌握栈与队列的数据类型描述及特点;2)掌握栈的顺序和链式存储存表示与基本算法的实现;3)掌握队列的链式存储表示与基本操作算法实现;4) 掌握栈与队列在实际问题中的应用和基本编程技巧;5)按照实验题目要求,独立完成实际程序的编写编写、调试和运行,并通过用例数据的运行过程抓获相关屏面验证程序设计的正确性;7)认真书写实验报告,并按时提交。
2 实验内容或题目以下题目学生根据自己的兴趣和能力可选作一道作为实验题目:1)根据栈数据结构,分别建立一个顺序栈和链式栈并实现其上基本操作(出栈和入栈等);2)根据队列数据结构,分别建立链队列和循环队列,并完成其上的基本操作(出入队列等);3)参考书上表达式求值例题,应用栈的基本操作实现带括号表达式求值运算及其进出栈模拟过程(给出程序执行过程中栈的变化过程);4)阅读P83栈与递归的实现一节内容和3阶汉诺塔问题。
使用栈数据结构解决3阶汉诺塔问题,编写程序并模拟栈及其汉诺塔的搬运过程(给出程序执行过程栈的变化过程与圆盘的搬动状态)。
5)其它实际应用举例(如打印杨辉三角形)。
3 实验步骤与源程序链队列#include<stdio.h>#include<stdlib.h>#include<process.h>#define OK 1#define ERROR 0#define OVERFLOW 0typedef struct QNode{int data;struct QNode *next;}QNode,*QueuePtr;typedef struct{QueuePtr front;QueuePtr rear;}LinkQueue;int InitQueue(LinkQueue &Q){Q.rear=Q.front=(QueuePtr)malloc(sizeof(QNode)); if(!Q.rear)exit(OVERFLOW);Q.front->next=NULL;return OK;}void QueueEmpty(LinkQueue Q){if(Q.front==Q.rear)printf("该链队为空:");elseprintf("该链队不为空:");}void EnQueue(LinkQueue &Q,int e){QueuePtr p;p=(QueuePtr)malloc(sizeof(QNode));if(!p)printf("error");p->data=e;Q.rear->next=p;Q.rear=p;printf("元素%d入队成功",e);}int EnnQueue(LinkQueue &Q,int e){QueuePtr p;p=(QueuePtr)malloc(sizeof(QNode));if(!p)return ERROR;p->data=e;Q.rear->next=p;Q.rear=p;return OK;}void DeQueue(LinkQueue &Q){QueuePtr p;if(Q.front==Q.rear)printf("该链队为空");p=Q.front->next;Q.front->next=p->next;if(Q.rear==p)Q.rear=Q.front;free(p);printf("队首元素删除成功");}void GetHead(LinkQueue &Q){QueuePtr p;if(Q.front==Q.rear)printf("该链队为空");p=Q.front->next;printf("队首元素为:%d",p->data);}void OutQueue(LinkQueue &Q){QueuePtr p;if(Q.front==Q.rear)printf("该链队为空");p=Q.front->next;while(p!=Q.rear->next){printf("%d",p->data);p=p->next;}}void LengthQueue(LinkQueue &Q){int f=0;QueuePtr p;if(Q.front==Q.rear)printf("该队列的长度是:%d",f); else{p=Q.front->next;while(p!=Q.rear->next){p=p->next;f++;}printf("该队列的长度是:%d",f); }}void main(){system("cls");int flag=1,i;LinkQueue Q;InitQueue(Q);printf("************************链队列功能菜单***********************\n");printf("1:初始化链队列, 2:判断链队列是否为空, 3:进入队列, 4:取出队首元素\n"); printf("5:输出该队列的所有元素,6:输出该队列的长度, 7:结束程序, 8:清屏\n");while(flag){printf("\n请输入操作符:");scanf("%d",&i);switch(i){case 1:int e,n,k;printf("请输入队列的长度:");scanf("%d",&n);printf("请输入队列的元素:");for(e=1;e<=n;e++){scanf("%d",&k);EnnQueue(Q,k);}printf("初始化链队成功");break;case 2:QueueEmpty(Q);break;case 3:int j;printf("请输入要进入队列的元素");scanf("%d",&j);EnQueue(Q,j);break;case 4:GetHead(Q);break;case 5:printf("该队列的元素是:");OutQueue(Q);break;case 6:LengthQueue(Q);break;case 7:flag=0;break;case 8:system("cls");break;}}printf("程序结束");}循环队列#include<stdio.h>#include<stdlib.h>#include<process.h>#define MAXSIZE 10;#define OK 1;#define ERROR 0;#define OVERFLOW 0;typedef struct{int *data;int front ;int rear;}SqQueue;int InitQueue_Sq(SqQueue &Q){Q.data=(int*)malloc(10*sizeof(int)); if(!Q.data)exit(0);Q.front=Q.rear=0;return OK;}int EnQueue_Sq(SqQueue &Q,int e){if((Q.rear+1)%10==Q.front)return ERROR;Q.data[Q.rear]=e;Q.rear=(Q.rear+1)%10;return OK;}void IfEmpty(SqQueue Q){if(Q.rear=Q.front)printf("该循环队列是空队列\n");elseprintf("该循环队列不是空队列\n");}void IfFull(SqQueue Q){if((Q.rear+1)%10==Q.front)printf("该循环队列已满\n");elseprintf("该循环队列未满\n");}void InQueue_Sq(SqQueue &Q,int e){if((Q.rear+1)%10==Q.front)printf("循环队列已满\n");else{Q.data[Q.rear]=e;Q.rear=(Q.rear+1)%10;printf("元素%d成功进入循环队列\n",e); }}void DeQueue_Sq(SqQueue &Q){int e;if(Q.front==Q.rear)printf("循环队列为空\n");e=Q.data[Q.front];printf("循环队列队首元素是:%d\n",e);}void DE_Sq(SqQueue &Q){int *w;w=&Q.data[Q.front];Q.front=Q.front+1;printf("队首元数%d删除成功\n",*w);}int Length_Sq(SqQueue &Q){int s;s=(Q.rear-Q.front+10);return s%10;}int OutQueue_Sq(SqQueue Q){SqQueue p;p=Q;int i,n;n=Length_Sq(p);for(i=0;i<n;i++){printf("%d",p.data[p.front]);p.front++;}return OK;}void Delet(SqQueue &Q){free(Q.data);printf("释放成功");}void main(){system("cls");printf("**********************循环队列功能菜单***********************\n");printf("1.初始化队列输入的数不超过10个,2.判断队列是否空,3.判断队列是否满, \n"); printf("4.将元素入队, 5.取队列首元素, 6.队列的长度, 7.遍历循环队列,\n");printf("8.删除队首元素, 9.释放队列, 10.清屏, 0.结束程序,\n");int flag=1,i;SqQueue Q;InitQueue_Sq(Q);while (flag){printf("请输入操作符:");scanf("%d",&i);switch(i){case 1:int n,j,m;printf("请输入初始化元素的个数:");scanf("%d",&n);printf("请输入元素:");for(j=0;j<n;j++){scanf("%d",&m);EnQueue_Sq(Q,m);}break;case 2:IfEmpty(Q);break;case 3:IfFull(Q);break;case 4:int k;printf("请输入要进入循环队列的元素:");scanf("%d",&k);InQueue_Sq(Q,k);break;case 5:DeQueue_Sq(Q);break;case 6:int f;f=Length_Sq(Q);printf("该循环队列的长度为:%d\n",f);break;case 7:printf("该循环队列为:");OutQueue_Sq(Q);printf("\n");break;case 8:DE_Sq(Q);break;case 9:Delet(Q);break;case 10:system("cls");break;case 0:flag=0;break;}}printf("程序结束");}4 测试数据与实验结果(可以抓图粘贴)链队列执行结果循环队列执行结果:《数据结构》实验报告- 10 -5 结果分析与实验体会通过此次的数据结构实验,让我对队列的基本结构有了进一步了解了,以及队列上一些基本操作的实现,掌握了队列在我们实际生活中的应用以及在编程时的基本技巧.不过在编程过程中还是出现了让人头疼的地方,不过同过自己的翻阅资料还是可以独立的解决编程中的问题的,通过本次的实验让自己所学的知识得到了进一步的巩固,加深了对C语言的了解.。