数据结构实验4 队列的表示与操作
数据结构实验报告(C语言)(强力推荐)

数据结构实验实验内容和目的:掌握几种基本的数据结构:集合、线性结构、树形结构等在求解实际问题中的应用,以及培养书写规范文档的技巧。
学习基本的查找和排序技术。
让我们在实际上机中具有编制相当规模的程序的能力。
养成一种良好的程序设计风格。
实验教材:数据结构题集(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;}}}运行结果:实验二、数组㈠、实验内容:数组一般不做插入或删除操作,也就是说,一旦建立了数组,则结构中的数据元素个数和元素之间的关系就不再发生变动。
数据结构上机操作实验报告

实验一单链表的基本操作(必做)一、实验目的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的数据元素个数。
队列的建立及操作

队列的建⽴及操作数据结构与算法 --> 实验报告 4实验项⽬名称:队列的建⽴及操作⼀、实验⽬的1.掌握队列存储结构的表⽰和实现⽅法。
2.掌握队列的⼊队和出队等基本操作的算法实现。
⼆、实验题建⽴顺序循环队列,并在顺序循环队列上实现⼊队、出队基本操作。
三、实验过程及结果①基本思路:采⽤⼀种循环的结构去实现队列的顺序存储,队满和队空时标志都是 Q->front=Q->rear;为了区别两种情况,我的思路是:修改队满条件,浪费⼀个元素空间,当只有⼀个空闲单元时队满。
程序代码:#include<stdio.h>#include<stdlib.h>#define OK 1#define ERROR 0#define OVERFLOW -1#define MAXSIZE 10typedef int QElemType;typedef struct{QElemType \*base;int front;int rear;}SqQueue;Status InitQueue(SqQueue \*Q){Q->base = (QElemType *)malloc(MAXSIZE * sizeof(QElemType));if (Q->base==NULL) exit(OVERFLOW);Q->front = Q->rear = 0;return OK;}Status EnQueue(SqQueue \*Q,QElemType e){if ((Q->rear + 1) % MAXSIZE == Q->front)return ERROR;Q->base[Q->rear] = e;Q->rear = (Q->rear + 1) % MAXSIZE;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) % MAXSIZE;return OK;}int main() {SqQueue Q;QElemType e;InitQueue(&Q);for (int i = 2; i < 7; i++){EnQueue(&Q, i);printf("⼊队元素为%d\n", i);}for (int j=2; j <7; j++) {DeQueue(&Q, &e);printf("出队元素为%d\n", e);}return 0;}②实验结果:四、实验总结队列的顺序存储采⽤循环队列,为了区分队空和队满,当只有⼀个空闲单元时队满。
实验报告队列

一、实验目的1. 理解队列的概念和特点;2. 掌握队列的基本操作,包括入队、出队、查看队列头元素等;3. 能够使用队列解决实际问题。
二、实验环境1. 操作系统:Windows 10;2. 编程语言:C语言;3. 开发环境:Visual Studio 2019。
三、实验内容1. 队列的定义和实现;2. 队列的基本操作;3. 使用队列解决实际问题。
四、实验步骤1. 队列的定义和实现(1)定义队列的数据结构```c#define MAXSIZE 100 // 队列的最大容量typedef struct {int data[MAXSIZE]; // 队列的存储空间int front; // 队列头指针int rear; // 队列尾指针} Queue;```(2)初始化队列```cvoid InitQueue(Queue q) {q->front = 0;q->rear = 0;}```(3)判断队列是否为空```cint IsEmpty(Queue q) {return q->front == q->rear;}```(4)判断队列是否已满```cint IsFull(Queue q) {return (q->rear + 1) % MAXSIZE == q->front; }```2. 队列的基本操作(1)入队操作```cint EnQueue(Queue q, int x) {if (IsFull(q)) {return 0; // 队列已满}q->data[q->rear] = x;q->rear = (q->rear + 1) % MAXSIZE; return 1;}```(2)出队操作```cint DeQueue(Queue q, int x) {if (IsEmpty(q)) {return 0; // 队列为空}x = q->data[q->front];q->front = (q->front + 1) % MAXSIZE; return 1;}```(3)查看队列头元素```cint GetHead(Queue q, int x) {if (IsEmpty(q)) {return 0; // 队列为空}x = q->data[q->front];return 1;}```3. 使用队列解决实际问题(1)实现一个简单的函数,将一个整数数组中的元素按照逆序输出```cvoid ReversePrint(int arr[], int n) {Queue q;InitQueue(&q);for (int i = 0; i < n; i++) {EnQueue(&q, arr[i]);}int x;while (!IsEmpty(&q)) {DeQueue(&q, &x);printf("%d ", x);}printf("\n");}```(2)实现一个函数,计算两个整数序列的交集```cvoid Intersection(int arr1[], int n1, int arr2[], int n2, int result[]) {Queue q;InitQueue(&q);for (int i = 0; i < n1; i++) {EnQueue(&q, arr1[i]);}int x;int i = 0, j = 0;while (!IsEmpty(&q)) {DeQueue(&q, &x);while (i < n2 && arr2[i] < x) {i++;}if (i < n2 && arr2[i] == x) {result[j++] = x;}}result[j] = 0; // 标记交集结束}```五、实验结果与分析1. 实验结果(1)定义队列的数据结构(2)初始化队列(3)判断队列是否为空(4)判断队列是否已满(5)入队操作(6)出队操作(7)查看队列头元素(8)使用队列逆序输出整数数组(9)使用队列计算两个整数序列的交集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
设置队头和队尾指针
初始化队头和队尾指针,指向队列的起始位置。
队列的入队操作
检查队列是否已满
在执行入队操作之前,需要检查队列是否已 满,如果已满则无法再添加元素。
添加元素
将新元素添加到队列的末尾,更新队尾指针。
调整指针
将队尾指针指向新添加的元素。
使用Java实现队列
01
queue.add(1);
02
queue.add(2);
03
queue.add(3);
使用Java实现队列
System.out.println(queue.poll()); // 输出 1
System.out.println(queue.peek()); // 输出 2
使用Java实现队列
q.pop(); // 移除元素2
cout << q.size() << endl; // 输 出2
使用C实现队列
return 0;
}
谢谢观看
队头,最后一个元素为队尾。
插入操作
在数组存储结构的队尾插入元素时, 需要将新元素存储到数组的最后一 个位置,并将队尾指针向前移动一 位。
删除操作
在数组存储结构的队头删除元素时, 需要将队头指针向后移动一位,并 从数组中删除该位置的元素。
队列的顺序存储结构
顺序存储结构
队列的顺序存储结构使用连续的 内存空间来实现,每个元素包含 数据域和下标。数据域用于存储 数据,下标表示元素在队列中的 位置。
04
队列的效率分析
队列的入队效率
总结词
入队效率指的是向队列中添加元素的速度。
数据结构教学大纲

《数据结构》课程教学大纲一、课程基本概况课程名称:数据结构课程名称(英文):Data Structure课程编号:课程总学时:64(理论课50 ,实验课14 )课程学分:4课程分类:必修开设学期:第5学期适用专业:计算机网络工程先修课程:《集合论》、《图论》和《高级语言(结构或记录,指针)》。
后续课程:《数据库》、《编译原理》、《操作系统》等二、课程性质、目的和任务本课程系统地介绍线性表、栈、队列、字符串、数组、广义表、树、二叉树、图、查找表等几种数据结构的基本概念、操作及其典型应用的例子,通过课堂教学、课外练习和上机实习,使学生了解数据对象的特性,数据组织的基本方法,并初步具备分析和解决现实世界问题在计算机中如何表示和处理的能力以及培养良好的程序设计技能,为后续课程的学习和科研工作的参与打下良好的基础。
三、主要内容、重点及难点(一)理论部分第一章绪论基本要求:掌握相关的基本概念,算法五大要素,计算语句频度和估算算法时间复杂度的方法。
知识点:1.数据结构的基本概念2. 算法设计3.时间和空间复杂度第二章线性表基本要求:掌握线性表的逻辑结构,线性表的存储结构,线性表在顺序结构和链式结构上实现基本操作的方法,从时间和空间复杂度的角度比较线性表两种存储结构的不同特点及其适用场合。
知识点:1.线性表的逻辑结构2.线性表的存储结构及操作的实现3.一元多项式的表示4.习题讨论课第三章栈和队列基本要求:掌握栈和队列的特点,在两种存储结构上栈的基本操作的实现;熟练掌握循环队列和链队列的基本运算,掌握递归算法执行过程中栈状态的变化过程。
知识点:1.栈的定义、表示及实现2.表达式求值3.栈与递归过程4.队列的定义、表示及实现5.习题讨论课第四章串基本要求:掌握串的七种基本运算的定义,利用这些基本运算来实现串的其它各种运算的方法;掌握在顺序存储结构上实现串的各种操作的方法,KMP算法,熟悉NEXT函数和改进NEXT函数的定义和计算;理解串名的存储映象和在堆存储结构实现串操作的方法。
队列的操作实验报告

队列的操作实验报告队列的操作实验报告一、实验目的本次实验旨在通过对队列的操作,加深学生对队列数据结构的理解,掌握队列的基本操作方法。
二、实验原理队列是一种先进先出(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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
注意事项:
在磁盘上创建一个目录,专门用于存储数据结构实验的程序。
因为机房机器有还原卡,请同学们将文件夹建立在最后一个盘中,以学号为文件夹名。
实验四队列的表示与操作
一、实验目的
1。
掌握队列的掌握队列的类型定义,掌握循环队列的表示与实现方法
2.掌握队列的基本操作:判空、元素入队、出队,删除队头元素
基本操作:
InitQueue()构造一个空队列Q
QueueEmpty(Q) 判断队列是否为空
QueueLenght(Q)返回队列Q的元素个数,即队列的长度
GetHead(Q,&e)取队列Q的队头元素,并用e返回
InQueue(&Q,e) 将元素e入队列
OutQueue(&Q,&e)删除非空队列Q的队头元素,并用e返回其值
二、实验要求
1.认真阅读和掌握本实验的算法。
2.上机将本算法实现。
3.将程序补完整,打印出程序的运行结果,并结合程序进行分析。
三、实验内容
程序:设计一个循环队列的顺序表示和实现的演示程序
参考程序如下:
#include <iostream.h>
#include <malloc.h>
typedef int DataType;
#define Maxsize 100 /*最大队列长度*/
typedef struct {
DataType data[Maxsize]; /*初始化的动态分配存储空间*/
int front; /*头指针,若队列不空,指向队列头素元素的前一位置*/
int rear; /*尾指针,若队列不空,指向队列尾元素位置*/
}SeqQueue,*PSeqQueue;
PSeqQueue InitQueue(){
/*构造一个空队列Q*/
}
int QueueEmpty(PSeqQueue Q){
/*若队列Q为空队列,则返回TRUE,否则返回FALSE*/
}
int QueueLength(PSeqQueue Q){
/*返回Q的元素个数,即为队列的长度*/
}
int GetHead(PSeqQueue Q,DataType &e){
/*若队列不为空,则用e返回Q的队头元素,并返回OK;否则返回ERROR*/
}
int InQueue(PSeqQueue &Q,DataType e){
/*插入元素e为Q的新的队尾元素*/
}
int OutQueue(PSeqQueue &Q,DataType &e){
/*若队列不空,则删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR*/
}
void main(){
PSeqQueue Q;
int select;
DataType e;
if ((Q=InitQueue())==NULL)
cout<<"分配失败,即将退出程序!\n";
else/*否则显示队列操作的菜单,并选择相应的基本操作*/
do {
cout<<"1:判断队列是否为空\n";
cout<<"2:测试队列的长度\n" ;
cout<<"3:取队头元素值\n";
cout<<"4:向队列中插入一新元素\n";
cout<<"5:删除队列中一元素\n";
cout<<"0:结束\n";
cout<<"\n请输入您的选择:";
cin>>select;
cout<<endl;
switch (select) {
case 1:
if (QueueEmpty(Q)==1) cout<<"队列为空\n";
else cout<<"队列不为空\n";break;
case 2:
cout<<"队列长度为:"<<QueueLength(Q)<<endl;break;
case 3:
if(GetHead(Q,e)==-1) cout<<"队列为空\n";
else cout<<"队首元素为:"<<e<<endl;break;
case 4:
cout<<"请输入要插入的元素值:";
cin>>e;
if(InQueue(Q,e)==-1) cout<<"\n队列满\n";
else cout<<"\n元素成功插入\n";break;
case 5:
if(OutQueue(Q,e)==-1) cout<<"队列空,无数据可删\n"; else cout<<"删除元素为:"<<e;break;
case 0:
cout<<"操作结束\n";break;
default:
cout<<"输入选择出错!\n";
}/*switch*/
cout<<endl<<endl;
}while (select);
}/*main_end*/。