单链表队列
来源:互联网 发布:linux rpm的使用 编辑:程序博客网 时间:2024/05/01 10:59
#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" );elseprintf( "%d\n", sat );}Status InitQueue( LinkQueue & Q)//初始化队列{Q.front = Q.rear = ( QueuePtr )malloc( sizeof(QNode) );if( !Q.front )return ERROR;elseQ.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 " );elseputs( "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;}