实验三 栈和队列的操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三栈和队列的操作
一.实验目的和要求
1、学会通过对问题的分析,设计一种合理的数据结构,并进行定义及操作的实现。
2、掌握利用栈和队列的各种操作来进行具体的实际应用。
3、加强综合程序的分析、设计能力。
二.实验内容
课后习题4-7
三.实验步骤
1、定义一个函数void QInsert(LNode*&Rear,const ElemType& item),新建一个结点,如果尾指针为空,则指向新建的结点;否则新结点指向尾指针当前指向的结点,然后尾指针指向新结点,最后新结点成为尾指针。
2、定义一个函数ElemType QDelete(LNode*&Rear),若删除的是最后一个结点,则删除后尾指针为NULL,尾指针指向被删除结点的后继。
3、定义函数void Print(LNode*&Rear)输出队列,从第一个结点开始依次输出,第一个结点就是尾指针指向的结点。
注意:定义文件后缀为.cpp,头文件为
四.附源程序
#include
#include
typedef int ElemType;
struct LNode
{
LNode *next;
ElemType data;
};
void QInsert(LNode*&Rear,const ElemType& item)
//使新元素item的值插入到循环链队中
{
LNode*newptr=new LNode;
//得到一个由newptr指针所指向的新结点
if(newptr==NULL){
cerr<<"Memory allocation failare"< exit(1); } newptr->data=item;//把item的值赋给新结点的值域 if(Rear==NULL) Rear=newptr->next=newptr; //若链队为空,则新结点即是队首结点又是队尾结点 else{ newptr->next=Rear->next; //使新结点的指针域指向队首结点 Rear->next=newptr; //使队尾结点的指针域指向新结点 Rear=newptr; //使新结点成为新的队尾结点 } } ElemType QDelete(LNode*&Rear) //从循环链队中删除队首元素 { if(Rear==NULL){ cerr<<"Linked queue is empty!"< exit(1); } LNode* p=Rear->next; //使p指向队首结点 if(p==Rear) Rear=NULL; //若链队中只有一个结点,则删除后队尾指针为空 else Rear->next=p->next; //使队尾结点的指针域指向队首结点的后继结点ElemType temp=p->data;//暂存队首元素 delete p;//回收原队首结点 return temp;//返回被删除的队首元素 } void Print(LNode*&Rear) { LNode* q=Rear->next;//从第一个结点开始 while(q!=Rear)//只要不是最后一个结点 { cout< q=q->next;//指针往后移 } cout< } void main() { LNode* L1=NULL; QInsert(L1,3); QInsert(L1,5); QInsert(L1,9); QInsert(L1,1); QInsert(L1,6); QInsert(L1,2); Print(L1); QInsert(L1,12); QDelete(L1); QDelete(L1); QDelete(L1); QInsert(L1,19); Print(L1); }