使用C语言完成的链表,分成linkQueue.h,和linkQueue.c两个文件,后附有测试文件main.c
linkQueue.h
#ifndef LINKQUEUE_H
#define LINKQUEUE_H
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
//定义宏常量
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR -1
#define OVERFLOW -1
//设置一个数据类型
typedef int QElemType;
//链式结构体
typedef struct QNode
{
QElemType data;
struct QNode * next;
}QNode;
typedef QNode* QueuePtr;
//队列结构体
typedef struct
{
QueuePtr front; //头指针
QueuePtr rear; //尾指针
int queuesize; //队列长度
}LinkQueue; //队列的链式存储表示
/*链队列函数列表*/
int InitQueue(LinkQueue *Q); //初始化队列
void ClearQueue(LinkQueue *Q); //置空Q
void DestroyQueue(LinkQueue *Q); //销毁Q
int QueueEmpty(LinkQueue Q); //判断Q是否为空
int QueueLength(LinkQueue Q); //返回Q元素的个数
int GetHead(LinkQueue Q,QElemType *e); //获取队头元素
int EnQueue(LinkQueue *Q,QElemType e); //元素e入队
int DeQueue(LinkQueue *Q,QElemType *e); //元素e出队
void QueueTraverse(LinkQueue Q, void(visit)(QElemType)); //访问元素
#endif
linkQueue.c
/***************************************
author:e-dawn
mail:fd34343@126.com
blog:e-dawn.github.io
desc:队列的链表实现函数
**************************************/
#include "linkQueue.h"
/*
return:
OK:表示初始化成功
parm:
*Q:表示要开辟的空间的队列的地址
*/
int InitQueue(LinkQueue *Q)
{
assert(NULL != Q);
Q->front = Q->rear = NULL;
Q->queuesize = 0;
return OK;
}
/*
return:
无
parm:
*Q:要清空的队列
*/
void ClearQueue(LinkQueue *Q)
{
assert(NULL != Q);
//释放已分配空间
QueuePtr p = Q->front;
while(NULL != p)
{
QueuePtr q = p->next;
free(p);
p = q;
}
//置空
Q->front = Q->rear = NULL;
Q->queuesize = 0;
}
/*
return:
无
parm:
*Q:要销毁的队列
*/
void DestroyQueue(LinkQueue *Q)
{
assert(NULL != Q);
ClearQueue(Q);
Q = NULL;
}
/*
return:
TRUE:为空
FALSE:表示非空
parm:
*Q:表示要判断的队列
*/
int QueueEmpty(LinkQueue Q)
{
if(Q.front == Q.rear)
{
return TRUE;
}
else
{
return FALSE;
}
}
/*
return:
队列的元素个数
parm:
*Q:要获得个数的队列
*/
int QueueLength(LinkQueue Q)
{
return Q.queuesize;
}
/*
return:
OK:表示取队首元素成功
ERROR:表示取队首元素失败
parm:
*Q:表示要队列
*e:存放队列首元素的变量
*/
int GetHead(LinkQueue Q,QElemType *e)
{
if(NULL == Q.front)
{
printf("Q is empty!\n");
return *e = ERROR;
}
else
{
*e = Q.front->data;
}
return OK;
}
/*
return:
OK:表示入队成功
OVERFLOW:表示入队失败
parm:
*Q:表示队列
e:表示要入队的元素
*/
int EnQueue(LinkQueue *Q,QElemType e)
{
assert(NULL != Q);
QueuePtr p = (QueuePtr) malloc( sizeof(QNode) );
if(NULL == p)
{
printf("init memory overflow\n");
return OVERFLOW;
}
p->data = e;
p->next = NULL;
if(Q->rear == NULL)
{
Q->front = Q->rear = p;
}
else
{
Q->rear->next = p;
Q->rear = p;
}
Q->queuesize++;
return OK;
}
/*
return:
OK:表示出队成功
ERROR:表示出队失败
parm:
*Q:表示要出队的队列
*/
int DeQueue(LinkQueue *Q,QElemType *e)
{
assert(NULL != Q);
if(NULL == Q->front)
{
printf("Q is empty!\n");
return *e = ERROR;
}
//front指向下一个结点
*e = Q->front->data;
QueuePtr p = Q->front->next;
free(Q->front);
Q->queuesize--;
Q->front = p;
return OK;
}
/*
return:
无
parm:
*Q:表示要遍历的队列
*/
void QueueTraverse(LinkQueue Q, void(visit)(QElemType))
{
QueuePtr p = Q.front;
while(NULL != p)
{
visit(p->data);
p = p->next;
}
}
测试代码main.c
#include "linkQueue.h"
void visit(QElemType e)
{
printf("%d\n", e);
}
int main()
{
LinkQueue q;
InitQueue(&q);
puts("队列是否为空");
printf("%s\n", QueueEmpty(q) ? "is empty" : "is not empty");
puts("当前队列长度");
printf("%d\n", QueueLength(q));
printf("Please input 6 elements:\n");
int i,e;
for(i = 0; i < 6; i++)
{
scanf("%d", &e);
EnQueue(&q, e);
puts("当前队列长度");
printf("%d\n", QueueLength(q));
}
QueueTraverse(q, visit);
puts("删除元素");
for(i = 0; i < 2; i++)
{
DeQueue(&q, &e);
puts("删除元素的值为:\n");
printf("%d\n", e);
}
puts("当前队列长度");
printf("%d\n", QueueLength(q));
puts("当前栈顶:");
GetHead(q, &e);
printf("%d\n", e);
puts("请空队列中");
ClearQueue(&q);
puts("当前队列长度");
printf("%d\n", QueueLength(q));
puts("当前栈顶:");
GetHead(q, &e);
printf("%d\n", e);
puts("队列是否为空");
printf("%s\n", QueueEmpty(q) ? "is empty" : "is not empty");
puts("销毁队列中");
DestroyQueue(&q);
return 0;
}