#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define STACK_SIZE 100
#define STACK_INCREASE 10
#define OK -100
#define ERROR -1
//--------------------------------------------------------------------------
typedef int QElemType; //定义取决与对象是什么
typedef int Status;
typedef struct QNode
{
QElemType data;
struct QNode * next;
}QNode, * QueuePtr;
typedef struct
{
QueuePtr front; //队头指针
QueuePtr rear; //队尾指针
}LinkQueue;
//--------------------------------------------------------------------------
Status InitQueue( LinkQueue &Q );//初始化队列
Status DestroyQueue( LinkQueue &Q );//销毁队列
Status EnQueue( LinkQueue &Q, QElemType e );//插入元素到队尾
Status ClearQueue( LinkQueue &Q );//清空队列
Status QueueEmpty( LinkQueue Q );//判断是否为空
int QueueLength( LinkQueue Q );//求队列元素个数
Status GetHead( LinkQueue Q, QElemType &e );//取得对头元素
Status DeQueue( LinkQueue Q, QElemType &e );//删除对头元素
void status_( int sat );
//--------------------------------------------------------------------------
int main()
{
int choice, status, e;
LinkQueue Q;
puts( "No1 InitQueue" );
puts( "No2 DestroyQueue" );
puts( "No3 En Queue (input)" );
puts( "No4 ClearQueue " );
puts( "No5 is empty?" );
puts( "No6 QueueLength" );
puts( "No7 GetHead" );
puts( "No8 DeQueue" );
puts( "No9 exit" );
printf( "please choose a number:" );
scanf( "%d", &choice);
while( 1 )
{
switch( choice )
{
case 1:
status = InitQueue( Q );
status_( status );
break;
case 2:
status = DestroyQueue( Q );
status_( status );
break;
case 3:
printf( "input a number:" );
scanf( "%d", &e );
status = EnQueue( Q, e );
status_( status );
break;
case 4:
status = ClearQueue( Q );
status_( status );
break;
case 5:
status = QueueEmpty( Q );
status_( status );
break;
case 6:
status = QueueLength( Q );
status_( status );
break;
case 7:
status = GetHead( Q, e );
printf( "%d\n", e);
status_( status );
break;
case 8:
status = DeQueue( Q, e );
printf( "the del number is %d\n", e);
status_( status );
break;
case 9:
exit(-1);
break;
default:
printf("wrong input exit!!\n");
exit(-1);
break;
}
printf( "please choose a number:" );
scanf( "%d", &choice );
}
return 0;
}
void status_( int sat )//status 状态判断
{
if( OK == sat )
printf( "OK!\n" );
else if( ERROR == sat )
printf( "error\n" );
else
printf( "%d\n", sat );
}
Status InitQueue( LinkQueue & Q)//初始化队列
{
Q.front = Q.rear = ( QueuePtr )malloc( sizeof(QNode) );
if( !Q.front )
return ERROR;
else
Q.front->next = NULL;
return OK;
}
Status DestroyQueue( LinkQueue &Q ) //销毁队列
{
while( Q.front )
{
Q.rear = Q.front->next;
free( Q.front );
Q.front = Q.rear;
}
return OK;
}
Status EnQueue( LinkQueue &Q, QElemType e )//插入元素到队尾
{
QueuePtr p;
p = ( QueuePtr )malloc( sizeof(QNode) );
if( !p )
return ERROR;
else
{
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
}
return OK;
}
Status ClearQueue( LinkQueue &Q )//清空队列
{
if( Q.front == Q.rear )
{
puts( "the Queue is empty" );
return OK;
}
else
{
QueuePtr p;
p = Q.front;
while( p != NULL )
{
free( p );
p = p->next;
}
}
return OK;
}
Status QueueEmpty( LinkQueue Q )//判断是否为空
{
if( Q.front == Q.rear )
puts( "is empty " );
else
puts( "unempty" );
return OK;
}
int QueueLength( LinkQueue Q )//求队列元素个数
{
int i = -1;
QueuePtr p = Q.front;
while( p != NULL )
{
p = p->next;
i++;
}
return i;
}
Status GetHead( LinkQueue Q, QElemType &e )//取得对头元素
{
if( Q.front == Q.rear )
{
puts( "empty" );
return ERROR;
}
else
{
e = Q.front->next->data;
}
return OK;
}
Status DeQueue( LinkQueue Q, QElemType &e )//删除对头元素
{
QueuePtr p = Q.front;
if( Q.front == Q.rear )
{
puts( "empty" );
return ERROR;
}
else
{
p = p->next;
e = p->data;
Q.front->next = p->next;
if( Q.rear == p )
Q.rear == Q.front;
free( p );
}
return OK;
}
单链表队列
最新推荐文章于 2022-04-28 14:54:28 发布