数据结构-链队列

目录

一、main

二、function

三、com


一、main

#include <iostream>
#include "com.h"
using namespace std ;

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) {
	
	LinkQueue Q ;
	int i , number , choice , n; 
	QElemType e ;
	do
	{
		printf("\t\t\t==================================================\n");
		printf("\t\t\t|                                                |\n");
		printf("\t\t\t|                   链队列基本操作               |\n");
		printf("\t\t\t|                                                |\n");
		printf("\t\t\t|================================================|\n");
		printf("\t\t\t|                 请选择要操作的命令             |\n");
		printf("\t\t\t|------------------------------------------------|\n");
		printf("\t\t\t|                                                |\n");
		printf("\t\t\t|    0.退出整个系统          1.初始化队列        |\n");
		printf("\t\t\t|    2.初始输入元素          3.队列是否为空      |\n");
		printf("\t\t\t|    4.查看队列的长度        5.取队头元素        |\n");
		printf("\t\t\t|    6.入队                  7.出队              |\n");
		printf("\t\t\t|    8.遍历队列              9.清空队列          |\n");
		printf("\t\t\t|    10.销毁队列                                 |\n");
		printf("\t\t\t|                                                |\n");
		printf("\t\t\t==================================================\n");
		printf("选择(0---13):\t");
		cin >> choice ; 
		switch(choice)
		{
			case 0 : //0.退出整个系统 
				cout << "退出成功" ;
				exit(0) ;
			case 1 ://  1.初始化栈队列 
				InitQueue(Q) ;
				cout << "初始化成功" ;
				cout << endl ; 
				break ; 
			case 2 :  //2.初始输入元素 
				cout << "请输入需要入队列的数据个数:" ;
				cin >> n ;
				cout << "请输入需要入队列的"<<n<<"个数据,用空格隔开:"<<endl ;
				for(i = 1 ; i <= n ; i ++)
				{
					cin >> e ;
					EnQueue(Q , e) ;
				}
				cout << endl ;
				cout << "现队列为:"  ;
				if(QueueTraverse(Q) == ERROR)  cout << "空队列" ; 
				cout << endl ; 
				break ;
			case 3 :  // 3.队列是否为空 
				cout << "现队列为:"  ;
				if(QueueTraverse(Q) == ERROR)  cout << "空队列" ; 
				cout << endl ; 
				if(QueueEmpty(Q))  cout << "该队列为空" ;
				else  cout << "该队列不为空" ;
				cout << endl ;
				break ;
			case 4 : // 4.查看队列的长度 
				cout << "现队列为:"  ;
				if(QueueTraverse(Q) == ERROR)  cout << "空队列" ; 
				cout << endl ; 
				cout << "栈的长度为:" << QueueLength(Q) ;
				cout << endl ;
				break ;
			case 5 : //5.取队头元素  
				cout << "现队列为:"  ;
				if(QueueTraverse(Q) == ERROR)  cout << "空队列" ; 
				cout << endl ; 
				cout << "队头元素为 " << GetHead(Q) ; 
				cout << endl ;
				break ;
			case 6 : // 6.入队 
				cout << "请输入入队元素:" ;
				cin >> e ;
				if(EnQueue(Q , e) == OK) cout << "入队成功" ;
				cout << endl ;
				cout << "现队列为:"  ;
				if(QueueTraverse(Q) == ERROR)  cout << "空队列" ; 
				cout << endl ; 
				break ;
			case 7 : // 7. 出队 
				if(DeQueue(Q , e) == ERROR)  cout << "该队列为空,操作失败" ;
				else  cout << "队头元素 " << e << " 已出队" ;
				cout << endl ; 
				cout << "现队列为:"  ;
				if(QueueTraverse(Q) == ERROR)  cout << "空队列" ; 
				cout << endl ; 
				break ;
			case 8 :  //8.遍历队列 
				cout << "队中元素为:" ; 
				if(QueueTraverse(Q) == ERROR)  cout << "空队列" ; 
				cout << endl ;
				break ;
			case 9 : // 9.清空队列 
				if(ClearQueue(Q) == OK)   cout << "该队列已被清空" ;
				cout << endl ;
				break ;
			case 10 : // 10.销毁队列 
				if(DestoryQueue(Q) == OK)   cout << "该队列已被销毁" ;
				cout << endl ;
				break ;	 
			default :
				cout << "输入不合法,请重新输入" ;
				cout << endl ;	 
		}
	}while(choice != 0) ;
	return 0;
}

二、function

#include <iostream>
#include "com.h"
using namespace std ;

//初始化
Status InitQueue(LinkQueue &Q)
{
	Q.front = Q.rear = new QNode ;
	Q.front->next = NULL ; // 头指针指向空 
	return OK ; 
} 

// 判空
bool QueueEmpty(LinkQueue Q)
{
	if(Q.front == Q.rear)  return true ;
	else  return false ;
} 

// 队长
int QueueLength(LinkQueue Q)
{
	int len = 0 ;
	while(Q.front != Q.rear)
	{
		len ++ ;
		Q.front = Q.front->next ;
	}
	return len ; 
} 

// 入队
Status EnQueue(LinkQueue &Q , QElemType e)
{
	QueuePtr p ; // 注意,用Queueptr 定义 
	p = new QNode ;
	p->data = e ;
	p->next = NULL ; // p插入到rear后面,p的next为空
	Q.rear->next = p ; // rear指向p,插入
	Q.rear = p ; // rear要在最后
	return OK ;  
}



// 出队
Status DeQueue(LinkQueue &Q , QElemType &e)
{
	if(Q.front == Q.rear)  return ERROR ; // 空我,无法删除 
	QueuePtr p ; //
	p = Q.front->next ; // 头结点的下一个,先保存在p
	e = p->data ; // 将要删除的结点data传给e
	Q.front->next = p->next ; // front指向下一个
	if(p == Q.rear)  Q.rear = Q.front ; // 如果只有一个结点
	delete p ; // 删除
	return OK ; 
} 

// 取队头
QElemType GetHead(LinkQueue Q)
{
	if(Q.rear != Q.front)
		return Q.front->next->data ;
} 

// 遍历  
Status QueueTraverse(LinkQueue Q)
{
	if(Q.front == Q.rear)  return ERROR ;
	QueuePtr p ;
	p = Q.front->next ;
	while(p)
	{
		cout << p->data << " " ;
		p = p->next ;
	}
	return OK ;
} 

// 清空
Status ClearQueue(LinkQueue &Q)
{
	// 释放除头结点的所有空间
	//先将队尾指针指向对头指针的下一个结点
	Q.rear = Q.front->next ; // 先指向首结点
	while(Q.front->next)
	{
		Q.rear = Q.rear->next ;// 队尾指针后移 
		delete Q.front->next ;  //释放对头指针和队尾指针中间的结点
		Q.front->next = Q.rear ; 
	}
	Q.rear = Q.front ; // 指向同一个空
	return OK ; 
}

// 摧毁
Status DestoryQueue(LinkQueue &Q)
{
	while(Q.front)
	{
		Q.rear = Q.front->next ;  // rear后移 
		delete Q.front ;
		Q.front = Q.rear ; 
	}
	return OK ; 
} 

三、com

//#ifndef _FUNC_H
//#define _FUNC_H

#define OK 0 
#define ERROR -1
#define OVERFLOW -2

typedef int QElemType ;
typedef int Status ;

typedef struct QNode
{
	QElemType data ; 
	struct QNode *next ; 
}QNode , *QueuePtr ; 

typedef struct 
{
	QueuePtr front ;
	QueuePtr rear ; 
}LinkQueue ; 

extern Status InitQueue(LinkQueue &Q) ; 
extern bool QueueEmpty(LinkQueue Q) ; 
extern Status EnQueue(LinkQueue &Q , QElemType e) ;
extern Status DeQueue(LinkQueue &Q , QElemType &e) ;
extern QElemType GetHead(LinkQueue Q) ;
extern Status ClearQueue(LinkQueue &Q) ;
extern Status DestoryQueue(LinkQueue &Q) ;
extern int QueueLength(LinkQueue Q) ;
extern Status QueueTraverse(LinkQueue Q) ;

//#endif
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值