考研党 数据结构(严蔚敏)Queue基本操作(纯C语言,与教材一致)
本代码示例为纯c语言编写的Queue基本操作,与数据结构(严蔚敏)课本讲述内容一致,可用于考研同学复习数据结构。
———–单链队列-队列的链式存储结构———-
main.c //用于测试函数
Queue.h //定义结构体以及声明基本操作函数
Queue.c //定义函数体
环境 C-FREE5.0
在编写过程中遇到了一些问题 ,只有在编写的代码的过程才会发现一些细节上面那个的问题。
文件Queue.h
#include <stdio.h>
#include <stdlib.h>
#ifndef _QUEUE_H_
#define _QUEUE_H_
#define OK 1
#define ERROR 0
#define OVERFLOW -1 //如果内存分配失败退出程序exit(-1);
#define TRUE 1
#define FALSE 0
typedef int BOOL;//默认C语言没有BOOL类型
typedef int Status;
typedef int ElemType;
/*结构体节点定义*/
typedef struct QNode
{
ElemType data;
struct QNode* next;
}QNode, *QueuePtr;
/*队列*/
typedef struct Queue
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
/*函数声明*/
Status InitQueue( LinkQueue* Q );
Status DestroyQueue( LinkQueue* Q );
Status ClearQueue( LinkQueue *Q );
Status QueueEmpty( LinkQueue Q );
int QueueLength( LinkQueue Q );
Status GetHead( LinkQueue Q, ElemType* e );
Status EnQueue( LinkQueue* Q, ElemType e );
Status DeQueue( LinkQueue* Q, ElemType* e);
void PrintElem( ElemType e);
void PrintQueue( LinkQueue Q);
#endif
文件Queue.c
#include "Queue.h"
#ifndef _QUEUE_C_
#define _QUEUE_C_
/*函数定义*/
//初始化队列
Status InitQueue( LinkQueue* Q )
{
Q->front = (QueuePtr)malloc( sizeof(QNode) );
if( !Q-> front )
exit(OVERFLOW);
Q->rear = Q->front;
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;
}
Q->front = Q->rear = NULL;
return OK;
}
//清空队列
Status ClearQueue( LinkQueue* Q )
{
QueuePtr p = Q->front->next;
while ( p )
{
Q->rear = p->next;
free( p );
p = Q->rear;
}
Q->rear = Q->front;
Q->front->next = NULL;
return OK;
}
//队列是否为空,如果为空返回TRUE,否则返回FALSE
BOOL QueueEmpty( LinkQueue Q)
{
if( Q.front == Q.rear )
return TRUE;
return FALSE;
}
//获得队列的元素个数
int QueueLength( LinkQueue Q)
{
int len = 0;
QueuePtr p = Q.front->next;
while( p )
{
++len;
p = p->next;
}
return len;
}
//获得头元素
Status GetHead( LinkQueue Q, ElemType* e)
{
if( Q.front == Q.rear )
{
exit( ERROR );
}
*e = Q.front->next->data;
return OK;
}
//追加一个元素,也就是在队尾放入一个元素
Status EnQueue( LinkQueue* Q, ElemType e)
{
QueuePtr p = (QueuePtr)malloc( sizeof(QNode) );
if( !p )
exit(OVERFLOW);
p->data = e;
p->next = NULL;
Q->rear->next = p;
Q->rear = p;
return OK;
}
//吐出一个元素,从对头
Status DeQueue( LinkQueue* Q, ElemType* e)
{
if( Q->front == Q->rear)
return ERROR;
QueuePtr p = Q->front->next;
Q->front->next = p->next;
p->next = NULL;
*e = p->data;
if( p == Q->rear )
{
Q->rear = Q->front;
}
free(p);
p = NULL;
return OK;
}
//打印单个元素,定义该函数的目的如果元素类型变化方便今后修改程序。
void PrintElem( ElemType e)
{
printf("%4d", e);
}
//打印队列,用到打印单个元素
void PrintQueue( LinkQueue Q)
{
if( Q.front == Q.rear)
{
printf("Queue is NULL\n");
return;
}
QueuePtr p = Q.front->next;
while( p )
{
PrintElem( p->data );
p = p->next;
}
printf("\n");
}
#endif
文件main.c
#include <stdio.h>
#include <stdlib.h>
#include "Queue.c" //编译时自动去找Queue.h文件
/* main 函数用于测试 队列的功能*/
int main(int argc, char const *argv[])
{
//定义以及初始化队列
LinkQueue Q;
InitQueue(&Q);
//从10开始插入元素,如果==5清空队列,在从4开始继续追加
int i = 0;
for(i=10; i>=0; --i)
{
if( i == 5)
{
//清空队列
ClearQueue(&Q);
}
else
{
//i!= 5 就追加到队列当中
printf("append %-2d ",i);
EnQueue(&Q, i);
}
printf("Queue Length %2d -> ",QueueLength(Q));
PrintQueue(Q);
}
//获取队列的第一个元素
ElemType e = 0;
GetHead(Q,&e);
printf("GetHead = %d\n", e);
//如果队列表非NULL,逐个删除
while ( !QueueEmpty(Q) )
{
ElemType e = 0;
DeQueue(&Q, &e);
printf("Delete ");
PrintElem(e);
printf("\n");
}
//销毁队列
DestroyQueue(&Q);
printf("Queue is Destroied\n");
return 0;
}
祝:18考研学生成功!!!
祝:18考研学生成功!!!
祝:18考研学生成功!!!