.h文件
#ifndef __LINKQUEUE_H_
#define __LINKQUEUE_H__
#include <stdio.h>
#include <stdlib.h>
//数据类型
typedef int * ElemType;
//数据节点
typedef struct QueueNode
{
ElemType data;
//指针域
struct QueueNode *next; //指向栈中上一个数据节点的地址
}QueueNode;
typedef struct LinkQueue
{
QueueNode *front; //栈顶指针
QueueNode *rear; //栈底指针
int count; //数据节点个数(元素个数)
}LinkQueue;
//初始化一个队
LinkQueue *Init_LinkQueue();
//清空一个链式队
void Clear_LinkQueue(LinkQueue *lq);
//销毁一个链式队
void Destroy_LinkQueue(LinkQueue *lq);
//判断一个链式队是否为空
int isEmpty(LinkQueue *lq);
//入队(队尾)
int EnQueue(LinkQueue *lq,ElemType data);
//出队(队头)
int DeQueue(LinkQueue *lq, ElemType *data);
//获取对头元素
int getHead(LinkQueue *lq, ElemType *data);
#endif
.c文件
#include "linkQueue.h"
//初始化一个队
LinkQueue *Init_LinkQueue()
{
LinkQueue *lq = (LinkQueue *)malloc(sizeof(LinkQueue));
lq->count = 0;
lq->front = NULL;
lq->rear = NULL;
}
//清空一个链式队
void Clear_LinkQueue(LinkQueue *lq)
{
if(lq == NULL)
{
return ;
}
ElemType data;
while(!isEmpty(lq))
{
DeQueue(lq, &data);
//通用栈存的是一个地址,清空栈的时候需要释放
free(data);
}
}
//销毁一个链式队
void Destroy_LinkQueue(LinkQueue *lq)
{
if(lq == NULL)
{
return ;
}
Clear_LinkQueue(lq);
free(lq);
}
//判断一个链式队是否为空
int isEmpty(LinkQueue *lq)
{
if(lq == NULL)
{
return -1;
}
return (lq->count == 0 ? 1:0);
}
//入队(队尾)
int EnQueue(LinkQueue *lq,ElemType data)
{
if(lq == NULL)
{
return -1;
}
//创建节点保存
QueueNode *p = (QueueNode *)malloc(sizeof(QueueNode));
p->data = data;
p->next = NULL;
printf(" %d ",*data);
//入队
//队中没有元素
if(lq->front == NULL)
{
lq->front = p;
}
else //至少有一个元素 尾插法
{
lq->rear->next = p;
}
lq->rear = p;
lq->count++;
return 0;
}
//出队(队头)
int DeQueue(LinkQueue *lq, ElemType *data)
{
//安全检查
if(lq == NULL || lq->count == 0)
{
return -1;
}
//队头的值
*data = lq->front->data;
printf(" %d ",**data);
//删除队头 front指向接下来的一个节点
QueueNode *pt = lq->front;
lq->front = pt->next;
//如果队头没有元素了 队尾也要为空
if(lq->front == NULL)
{
lq->rear == NULL;
}
lq->count--;
pt->next = NULL;
free(pt);
return 0;
}
//获取对头元素
int getHead(LinkQueue *lq, ElemType *data)
{
//安全检查
if(lq == NULL || lq->count == 0)
{
return -1;
}
*data = lq->front->data;
return 0;
}
main.c --> 测试代码
#include "linkQueue.h"
int main(void)
{
LinkQueue *queue = Init_LinkQueue();
int data;
int *p = NULL;
while(1)
{
scanf("%d",&data);
if(data == 0)
{
break;
}
p = (int *)malloc(sizeof(int));
*p = data;
EnQueue(queue, (ElemType)p);
}
printf("\n");
printf("队列中元素个数为 %d\n",queue->count);
Clear_LinkQueue(queue);
printf("\n");
printf("队列中元素个数为 %d\n",queue->count);
return 0;
}
总结
我有些地方可能写的不好,代码还需要完善,仅供参考(学习),有大错误也可以向我反馈。